前言:最近在做一个小项目,这个东西也是我在寒假的时候刷到视频,有那种跑腿平台让人上门照顾宠物的,还比较火爆,我也从这里灵感触发,想着做个这个东西,正好参加一个比赛,一举两得,做这个还是学到了许多东西,我在网上查找,确实已经有这个玩意的落地,但是仅限于智能喂食,而我在此基础上进行创新,进行了一些扩展与延伸。

1.主板选用stm32mini,因为我这个其实不用太考虑占不占地方。

2.模块部分

(1)温湿度模块 :DHT11

0011 0101 0000 0000 0001 1000 0000 0100 0101 0001
湿度高 8 位 湿度低 8 位 温度高 8 位 温度低 8 位 校验位

校验位为“8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据” 8bit 校验位等于所得结果的末 8 位

初始化:

u8 DHT11_Init(void)
{    GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能PG端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;               //PG11端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);              //初始化IO口GPIO_SetBits(GPIOB,GPIO_Pin_1);                         //PG11 输出高DHT11_Rst();  //复位DHT11return DHT11_Check();//等待DHT11的回应
}

结构体里设置所需变量

typedef struct
{uint8_t  humi_int;     //湿度的整数部分uint8_t  humi_deci;        //湿度的小数部分uint8_t  temp_int;     //温度的整数部分uint8_t  temp_deci;        //温度的小数部分uint8_t  check_sum;        //校验和}DHT11_Data_TypeDef;

将数据输入到对应的变量里面

uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
{  u8 buf[5];u8 i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//读取40位数据{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){DHT11_Data->humi_int=buf[0];DHT11_Data->humi_deci=buf[1];DHT11_Data->temp_int=buf[2];DHT11_Data->temp_deci=buf[3];DHT11_Data->check_sum=buf[4];}}else return 1;/*检查读取的数据是否正确*/if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)return SUCCESS;else return ERROR;
}

 (2)MQ-2烟雾传感器

借助ADC将当前获取的24位数据转换为当前电压的模拟信号,然后借助公式转换为当前的室内CH4浓度。

初始化:

void  Adc_Init(void)
{   ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC1通道时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M//PA1 作为模拟通道输入引脚                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);  ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //ADC工作模式:ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;    //模数转换工作在单通道模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;  //模数转换工作在单次转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;  //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);  //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   ADC_Cmd(ADC1, ENABLE);  //使能指定的ADC1ADC_ResetCalibration(ADC1);  //使能复位校准  while(ADC_GetResetCalibrationStatus(ADC1));   //等待复位校准结束ADC_StartCalibration(ADC1);    //开启AD校准while(ADC_GetCalibrationStatus(ADC1));  //等待校准结束// ADC_SoftwareStartConvCmd(ADC1, ENABLE);     //使能指定的ADC1的软件转换启动功能}   

计算当前的CH4

float MQ7_PPM_Calibration(void)
{float RS = 0;float R0 = 0;RS = (3.3f - Get_Adc_Average(ADC_Channel_1,30)) / Get_Adc_Average(ADC_Channel_1,30) * RL;R0 = RS / pow(CAL_PPM / 98.322, 1 / -1.458f);//CAL_PPM  10  // 校准环境中PPM值return R0;
}//计算Smog_ppm
float Smog_GetPPM(void)
{float RS = (3.3f - Get_Adc_Average(ADC_Channel_1,30)) / Get_Adc_Average(ADC_Channel_1,30) * RL;float ppm = 98.322f * pow(RS/R0, -1.458f);return  ppm;
}

注: RL:每个传感器的数值不一样,需要查看对应的数据手册

算Ro的时候,注销到Smog_GetPPM(void)代码,算出标准的RO后注销掉MQ7代码,然后使用Smog_GetPPM(void)。然后更改define值。

(3)舵机控制[PWM控制]

初始化:

void TIM2_PWM_Init(u16 arr, u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure; //定义一个引脚初始化的结构体TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; //定义一个定时中断的结构体  TIM_OCInitTypeDef TIM_OCInitTypeStrue; //定义一个PWM输出的结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟,在STM32中使用IO口前都要使能对应时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能通用定时器2时钟,A0引脚对应TIM2CHN1GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//引脚0GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出模式,定时器功能为A0引脚复用功能GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //定义该引脚输出速度为50MHZGPIO_Init(GPIOA, &GPIO_InitStructure); //初始化引脚GPIOA0TIM_TimeBaseInitStrue.TIM_Period=arr; //计数模式为向上计数时,定时器从0开始计数,计数超过到arr时触发定时中断服务函数TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数,决定每一个计数的时长TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数模式:向上计数TIM_TimeBaseInitStrue.TIM_ClockDivision=0; //一般不使用,默认TIM_CKD_DIV1TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStrue); //根据TIM_TimeBaseInitStrue的参数初始化定时器TIM2TIM_OCInitTypeStrue.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1,当定时器计数小于TIM_Pulse时,定时器对应IO输出有效电平TIM_OCInitTypeStrue.TIM_OCPolarity=TIM_OCNPolarity_High; //输出有效电平为高电平TIM_OCInitTypeStrue.TIM_OutputState=TIM_OutputState_Enable; //使能PWM输出TIM_OCInitTypeStrue.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值TIM_OC1Init(TIM2, &TIM_OCInitTypeStrue); //根TIM_OCInitTypeStrue参数初始化定时器2通道1TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); //CH1预装载使能TIM_ARRPreloadConfig(TIM2, ENABLE); //CH1预装载使能TIM_Cmd(TIM2, ENABLE); //使能定时器TIM2
}

然后通过TIM_SetCompare1(TIM2, PWM)和 TIM_SetCompare1(TIM2, PWM)来设置舵机的角度,实现食物的释放。

(4)HX711模块称重+压力传感器

初始化:

有一个地方困扰了我一个礼拜,害我白白又买了一个,我的IO口初始化,才开始是PB3和PB4,使得传感器传回来的数值一直都是最大值,也就是一直都是错误的。

后来发现这两个是特殊的IO口【手动哭泣】,具体可以看看这篇文章

STM32F1系列PB3,PB4,PA13,PA14,PA15用作普通IO口的特殊配置_stm32 pa14_qhw5279的博客-CSDN博客

void Init_HX711pin(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能PF端口时钟//HX711_SCKGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化GPIOB//HX711_DOUTGPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//输入上拉GPIO_Init(GPIOB, &GPIO_InitStructure);  //GPIO_SetBits(GPIOB,GPIO_Pin_0);                   //初始化设置为0
}

测量的时候,需要有个起始重量,俗称毛重,任何变化都是基于毛重进行计算的。

所以在程序烧录进去的时候,大家需要保持上面无重量,这样毛重就是0,方便接下来的操作

void Get_Weight(void)
{HX711_Buffer = HX711_Read();if(HX711_Buffer > Weight_Maopi)            {Weight_Shiwu = HX711_Buffer;Weight_Shiwu = Weight_Shiwu - Weight_Maopi;              //获取实物的AD采样数值。Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue);  //计算实物的实际重量//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。//当发现测试出来的重量偏大时,增加该数值。//如果测试出来的重量偏小时,减小改数值。}elseWeight_Shiwu = 1;
}

(5)定时器计时

void TIM3_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值    计数到5000为500msTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_ITConfig(  //使能或者失能指定的TIM中断TIM3, //TIM3TIM_IT_Update ,ENABLE  //使能);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设}

在定时器的中断里面,到设定的时间到了就进行定时喂食操作,所以在中断里面上传的是类似于flag的标志位,然后传入到主函数进行对应的操作。

(6)蜂鸣器【提醒这个程序开始了】

void Beep_init(void)
{GPIO_InitTypeDef GPIO_INITstrcture;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_INITstrcture.GPIO_Pin = GPIO_Pin_11;GPIO_INITstrcture.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_INITstrcture.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_INITstrcture);GPIO_ResetBits(GPIOB,GPIO_Pin_11);
}
void fengmingqi()
{GPIO_SetBits(GPIOB,GPIO_Pin_11);delay_us(100);GPIO_ResetBits(GPIOB,GPIO_Pin_11);
}

(7)esp8266使用MQTT协议连接到onenet平台

因为后续还需要数据的发送,所以需要使用MQTT协议,如果不需要则可以使用HTTP协议

设置AT模式,初始化当前wifi模块

AT+CWMODE == 设置为STA模式

AP模式下,WiFi模块产生热点,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下。该模式对应TCP传输协议中的服务端(TCP Server)。
STA模式下,WiFi模块为连接到无线网络的终端(站点),可以连接到AP,一般无线网卡工作在STA模式下。该模式对应TCP传输协议中的客户端(TCP Client)。

AT+CWDHCP=x,y     dhcp,y=0关闭,1开启;x为0时是ap,1是station, 2是二者同时。

AT+CWJAP="SSID","PWD"    当作为station模式时,加入WIFI热点SSID,PWD是热点密码【这里注意当前的所连接的热点必须为2.4GHZ的频段】

AT+CIPSTART : 建立tcp连接

void ESP8266_Init(void)
{GPIO_InitTypeDef GPIO_Initure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ESP8266复位引脚GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Initure.GPIO_Pin = GPIO_Pin_13;                   //GPIOC13-复位GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_Initure);GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);delay_ms(250);GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);delay_ms(500);ESP8266_Clear();//  UsartPrintf(USART_DEBUG, "1. AT\r\n");printf("1. AT\r\n");while(ESP8266_SendCmd("AT\r\n", "OK"))delay_ms(500);printf("2. CWMODE\r\n");while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))delay_ms(500);printf( "3. AT+CWDHCP\r\n");while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))delay_ms(500);printf("4. CWJAP\r\n");while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))delay_ms(500);printf( "5. CIPSTART\r\n");while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))delay_ms(500);printf("6. ESP8266 Init OK\r\n");}

然后将esp8266连接当前的在onenet创建的设备

_Bool OneNet_DevLink(void)
{MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};                   //协议包unsigned char *dataPtr;_Bool status = 1;//打印一下信息产品id,鉴权信息,设备IDprintf("OneNet_DevLink\r\nPROID: %s,    AUIF: %s,   DEVID:%s\r\n", PROID, AUTH_INFO, DEVID);if(MQTT_PacketConnect(PROID, AUTH_INFO, DEVID, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0){ESP8266_SendData(mqttPacket._data, mqttPacket._len);           //上传平台dataPtr = ESP8266_GetIPD(250);                                   //等待平台响应printf("\r\ndataPtr=%s\r\n",dataPtr);if(dataPtr != NULL)//如果平台返回数据不为空则{if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)//   MQTT数据接收类型判断(connack报文)2{switch(MQTT_UnPacketConnectAck(dataPtr))//打印是否连接成功及连接失败的原因{case 0:printf( "Tips:    连接成功\r\n");status = 0;break;case 1:printf(  "WARN:   连接失败:协议错误\r\n");break;case 2:printf(  "WARN:   连接失败:非法的clientid\r\n");break;case 3:printf(  "WARN:    连接失败:服务器失败\r\n");break;case 4:printf(  "WARN:  连接失败:用户名或密码错误\r\n");break;case 5:printf(  "WARN:   连接失败:非法链接(比如token非法)\r\n");break;default:printf(  "ERR:    连接失败:未知错误\r\n");break;}}}MQTT_DeleteBuffer(&mqttPacket);                                //删包}elseprintf( "WARN:    MQTT_PacketConnect Failed\r\n");return status;}

对应的鉴权信息,设备ID,以及用户ID,需要可以自行在onenet平台查询。连接之后便可以在发送数据流给平台了。

发送数据给onenet

void OneNet_SendData(void)
{MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0};                                               //协议包char buf[128];short body_len = 0, i = 0;printf( "Tips:  OneNet_SendData-MQTT\r\n");memset(buf, 0, sizeof(buf));//清空数组内容body_len = OneNet_FillBuf(buf);                                                                    //获取当前需要发送的数据流的总长度if(body_len){if(MQTT_PacketSaveData(DEVID, body_len, NULL, 5, &mqttPacket) == 0)                            //封包{for(; i < body_len; i++)mqttPacket._data[mqttPacket._len++] = buf[i];ESP8266_SendData(mqttPacket._data, mqttPacket._len);                                  //上传数据到平台printf( "Send %d Bytes\r\n", mqttPacket._len);MQTT_DeleteBuffer(&mqttPacket);                                                            //删包}elseprintf(  "WARN:   EDP_NewBuffer Failed\r\n");}}

OneNet_FillBuf(buf)获取的需要发送给onenet平台数据的数组长度计算出来,传入到ESP8266_SendData(mqttPacket._data, mqttPacket._len)

nsigned char OneNet_FillBuf(char *buf)
{char text[64];//LED0_FLAG=GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5);//读取LED的开关状态(即对应引脚的)//LED1_FLAG=GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);//printf("LED0_FLAG_TYPE=%d\n",sizeof(LED0_FLAG));memset(text, 0, sizeof(text));strcpy(buf, ",;");memset(text, 0, sizeof(text));sprintf(text, "Tempreture,%d.%d;",temperatureH,temperatureL);strcat(buf, text);memset(text, 0, sizeof(text));sprintf(text, "Humidity,%d.%d;", humidityH,humidityH);strcat(buf, text);//   memset(text, 0, sizeof(text));
//  sprintf(text, "now_weight;", LED0_FLAG);
//  strcat(buf, text);
//
//  memset(text, 0, sizeof(text));
//  sprintf(text, "LED1,%d;", LED1_FLAG);
//  strcat(buf, text);memset(text, 0, sizeof(text));sprintf(text, "P_M,%f;",pm);strcat(buf, text);memset(text, 0, sizeof(text));sprintf(text, "W_S,%d;",Weight_Shiwu);strcat(buf, text);printf("buf_mqtt=%s\r\n",buf);return strlen(buf);}

然后将“发送命令”发送给esp8266,随后当esp8266在串口接收到了“>”的字符,则可以开始发送数据了。如果不使用这个发送命令的指令,当数据比较多的时候以及次数多的时候,这样会比较麻烦,但是这样,只需要一次,就可以一直发送指令和数据,减少了不必要的麻烦。

void ESP8266_SendData(unsigned char *data, unsigned short len)
{char cmdBuf[32];ESP8266_Clear();                               //清空接收缓存//先发送要发送数据的指令做准备sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);      //发送命令if(!ESP8266_SendCmd(cmdBuf, ">"))                //收到‘>’时可以发送数据{//既然准备完毕即可开始发送数据Usart_SendString(USART2, data, len);      //发送设备连接请求数据}}

(8)onenet发送json命令,32设备进行接收

设置一个data的数据包,里面存放需要发送的变量的数值,这样可以实现一次性发送多个数据流。而且进行了判错,当用户未发送重量的时候,我也可以根据我设定的初始值传入设备,防止程序卡死。

object=cJSON_GetObjectItem(root,"data");item=cJSON_GetObjectItem(object,"time");          //客户端定时下发的定时时间times_ing=item->valueint;item=cJSON_GetObjectItem(object,"weight1");        //自主喂养的重量if(item->valueint<-66666666){weight1 = 300;                                   //防止用户没有设置重量}else{weight1=item->valueint;}item=cJSON_GetObjectItem(object,"weight2");        //定时喂养的重量if(item->valueint<-66666666){weight2 = 300;                                    //防止用户没有设置重量}else{weight2=item->valueint;}item=cJSON_GetObjectItem(object,"flag");           //是否定时weishi_flag=item->valueint;//printf("weishi_flag = %d,weight2 = %d\r\n",weishi_flag,weight2);delay_ms(10);printf("\r\ntime=%d,weight1=%d\r\n,weight2=%d\r\n,flag = %d",times_ing,weight1,weight2,weishi_flag);}

onenet发送数据的格式为:

{"data":{"flag":1,"weight1":300,"weight2":288......}}

后续我还会增加功能【未完待续!!!】

基于onenet物联网平台---宠物智能喂食监测系统相关推荐

  1. 基于STM32F103和物联网平台的滚动轴承在线监测系统

    摘要: 设计了一种基于云平台的滚动轴承在线监测系统,信号采集模块将振动传感器输出的振动信号进行变换,再通过 有源滤波模块处理后交给控制器,控制器内部进行 A / D 采样,随后处理器对 A / D 采 ...

  2. 基于机智云物联网平台的智能垃圾桶监管系统

    本文来自机智云开发者:凌加平,潘绍明,田径北,韦明峥,周俊男,谭晧 广西科技大学电气与信息工程学院广西科技大学工程训练中心 摘 要:随着社会的发展,我国对城市卫生越来越重视,城市环卫工作的智能化是建设 ...

  3. 【项目总结】玛嘉环境物联网平台(大三学生独立完成的真实企业外包项目)/网脉通用物联网平台/网脉铁塔监测系统

    文章目录 前言 一.概述 1.背景 2.三者的关系 二.设计中遇到的问题与思考 背景 1.如何确定需求? 2.如何接手这个设计堪忧的项目? 3.如何进行数据建模? ①物联网情境下如何存储数据? ②如何 ...

  4. 基于iOS快捷指令和Siri控制连接OneNET物联网平台的STM32的智能安防家居系统

    摘要 之前做了一个智能安防系统,用STM32单片机作为主控芯片,ESP8266-01s模块作为Wi-Fi模块,成功利用MQTT协议实现了连接阿里云物联网平台或中国移动OneNET平台,并支持实时上报环 ...

  5. 文末赠书5本 | 附源码 | 三等奖作品 | 基于RA4M2和阿里云物联网平台的智能卧室小管家

    [RA4M2设计挑战赛]基于RA4M2和阿里云物联网平台的智能卧室小管家 摘要 本项目已RA4M2为主控,搭载了RT-Thread实时操作系统,配合Wi-Fi模块来提供网络通讯能力,外设接入了继电器. ...

  6. 基于机智云物联网平台的智能WiFi插座

    一.概述 本设计是基于机智云物联网平台的智能WiFi插座.该插座的主控芯片采用的是意法半导体的STM32f103c8t6来控制.软件部分运用elispe开发工具开发,综合WiFi无线通信.Androi ...

  7. 基于物联网的畜禽智能养殖监控系统

    一.需求说明 畜牧业是关系国计民生的重要产业,肉蛋奶是百姓"菜篮子"的重要品种.近年来,我国畜牧业综合生产能力不断增强,在保障国家食物安全.繁荣农村经济.促进农牧民增收等方面发挥了 ...

  8. 中国移动 OneNET 物联网平台从入门到「放弃」

    01. OneNET 物联网平台 中国移动 OneNET定位为 PaaS 服务,即在物联网应用和真实设备之间搭建高效.稳定.安全的应用平台:面向设备,适配多种网络环境和常见传输协议,提供各类硬件终端的 ...

  9. 基于机智云平台的智能家居系统

    摘要:随着社会的发展,人们对于生活质量的要求越来越高,智能家居作为能够大幅提升人们生活舒适度的一部分,得到了越来越多的人关注,更多方便.实用的智能家居系统急需被提出. 本文设计了一种基于机智云物联网云 ...

最新文章

  1. UA MATH566 统计理论 QE练习题2.1
  2. Spring 的 BeanFactory 和 FactoryBean 傻傻分不清?
  3. mysql调优_MYSQL企业常用架构与调优经验分享
  4. ONLY三行脚本, SQL数据恢复到指定时间点
  5. CSS Transform让百分比宽高布局元素水平垂直居中
  6. 【月报】Java知音的五月汇总
  7. 计算机考研考833的院校,太原理工大学
  8. php和apache2的配置
  9. 洛谷P5108 仰望半月的夜空(后缀数组)
  10. 360下拉词电脑端优化推广是怎么做的呢?
  11. 基于c的xml文件解析(转)
  12. org.springframework.web.context.ContextLoaderListener 解决方案
  13. 锐起2540无盘教程
  14. 三维校园(三维虚拟校园)的使用体验
  15. html化学式编辑器,ChemDraw Pro(化学反应方程式编辑器软件)
  16. python turtle setheading_Python turtle.right与turtle.setheading的区别
  17. A16z、YGG、Axie 圆桌对话:Web3 游戏接下来该怎么走?
  18. 【散文】 如果今生我是你梦中的蝴蝶
  19. 微信页面触发返回按钮回到聊天界面
  20. Verilog实现正弦波、三角波、方波、锯齿波的输出

热门文章

  1. 6.Page对象详解
  2. Unity3D 添加与关闭窗口
  3. 自媒体平台现在主推这2种内容,播放量高,收益也高
  4. adb 查看屏幕大小_Android应用开发之adb命令如何获取android手机屏幕分辨率
  5. vb与c 哪个更有用
  6. kali linux 安装qq 详细操作
  7. 印度市场,小米市场份额急进,OPPO和vivo衰退
  8. ‎App Store上好用的日记记事本备忘录便签待办
  9. asp功放怎么装_功放机维修常见方法,小编教您如何维修功放机
  10. 你了解CPU吗?(四)