F103C8T6 ESP8266和ONENET通信 DHT11测温湿度 MQ-2测烟雾浓度 LED模拟室内灯 温湿度和烟雾超标,蜂鸣器报警,风扇转动;OLED显示数据;数据传输onenet,控制LED灯和风扇

1、项目简介

2、实现逻辑

3、应用场景

#远程检测室内环境
#厨房灭火

4、核心代码梳理

//stm32程序
/* USER CODE BEGIN 0 */
//smoke
void MQ2_PPM_Calibration(float RS)
{R0 = RS / pow(CAL_PPM / 613.9f, 1 / -2.074f);
}float MQ2_GetPPM(void)
{float Vrl = 3.3f * ADC_num / 4095.f;float RS = (3.3f - Vrl) / Vrl * RL;if(HAL_GetTick() < 10000){MQ2_PPM_Calibration(RS);}float ppm = 613.9f * pow(RS/R0, -2.074f);return  ppm;
}//temp hump
void DHT11_IO_IN(void) {GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = DHT11_Pin;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}void DHT11_IO_OUT(void) {GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = DHT11_Pin;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA,&GPIO_InitStructure);
}void DHT11_Rst(void) {DHT11_IO_OUT();  //DHT11_DQ_OUT_LOW;     //HAL_Delay(20);        //DHT11_DQ_OUT_HIGH;    //delay_us(30);         //
}uint8_t DHT11_Check(void) {uint8_t retry=0;DHT11_IO_IN();while (DHT11_DQ_IN && retry<100) {retry++;delay_us(1);};if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100) {retry++;delay_us(1);};if(retry>=100)return 1;return 0;   //???DHT11??0
}uint8_t DHT11_Read_Bit(void) {uint8_t retry=0;while(DHT11_DQ_IN&&retry<100) {retry++;delay_us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100) {retry++;delay_us(1);}delay_us(40);if(DHT11_DQ_IN)return 1;else return 0;
}uint8_t DHT11_Read_Byte(void) {uint8_t i,dat;dat=0;for (i=0; i<8; i++) {dat<<=1;dat|=DHT11_Read_Bit();}return dat;
}uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi) {uint8_t buf[5];uint8_t i;DHT11_Rst();if(DHT11_Check()==0) {for(i=0; i<5; i++) {buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) {*humi=(buf[0]<<8) + buf[1];*temp=(buf[2]<<8) + buf[3];}} else return 1;return 0;
}uint8_t DHT11_Init(void) {DHT11_Rst();return DHT11_Check();
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint16_t clk;tx_nbiot[0] = 0xff;tx_nbiot[1] = 0x74;tx_nbiot[13] = 0xff;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC1_Init();HAL_Delay(5000);MX_USART1_UART_Init();MX_I2C1_Init();/* USER CODE BEGIN 2 */OLED_Init();            //初始化OLEDOLED_Clear();OLED_ShowString(0,0,"TEMP:    .    C",12);OLED_ShowString(0,2,"HUMP:    .    %",12);OLED_ShowString(0,4,"MQ2:     .   ppm",12);OLED_ShowString(0,6,"LED:   MOTOR:   ",12);//OLED_ShowNum(39,4,9999,4,12);//OLED_ShowNum(80,4,12,2,12);while(DHT11_Init()) {HAL_Delay(500);}__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//open uart1 RXNE/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///OLED_Clear();clk++;//nbiot receiveif(rx_ok){//rx_order++;rx_ok = 0;if(rx_order == 1)//open led{HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);OLED_ShowString(35,6,"O",12);led_sta = rx_order;}else if(rx_order == 2)//close led{HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);OLED_ShowString(35,6,"X",12);led_sta = rx_order;}else if(rx_order == 3)//open motor{HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin, GPIO_PIN_RESET);OLED_ShowString(105,6,"O",12);motor_sta = rx_order;}else if(rx_order == 4)//close motor{HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin, GPIO_PIN_SET);OLED_ShowString(105,6,"X",12);motor_sta = rx_order;}else if(rx_order == 5)//open beep{beep_sta = 0;}else if(rx_order == 6)//close beep{beep_sta = 1;}}
//send nbiot/displayif(clk % 20 == 0) //1s -- 10{//check smokeHAL_ADC_Start_IT(&hadc1);check_smoke = MQ2_GetPPM();intS = (int)check_smoke;float tmp = check_smoke-intS;decS = tmp * 100;OLED_ShowNum(39,4,intS,4,12);OLED_ShowNum(80,4,decS,2,12);//check  temp humpDHT11_Read_Data(&temperature,&humidity);OLED_ShowNum(39,0,temperature>>8,4,12);OLED_ShowNum(80,0,temperature&0xff,2,12);OLED_ShowNum(39,2,humidity>>8,4,12);OLED_ShowNum(80,2,humidity&0xff,2,12);//printf("DHT11 Temperature = %d.%d degree\r\n",temperature>>8,temperature&0xff);//printf("DHT11 Humidity = %d.%d%%\r\n",humidity>>8,humidity&0xff);tx_nbiot[2] = temperature>>8;tx_nbiot[3] = temperature&0xff;tx_nbiot[4] = humidity>>8;tx_nbiot[5] = humidity&0xff;tx_nbiot[6] = intS / 256;tx_nbiot[7] = intS % 256;tx_nbiot[8] = decS;tx_nbiot[9] = led_sta;tx_nbiot[10] = motor_sta;tx_nbiot[11] = alarm_sta;tx_nbiot[12] = beep_sta + 5;HAL_UART_Transmit(&huart1, (uint8_t *)tx_nbiot, 14, 0xFFFF);//alarmtemp = tx_nbiot[2];hump = tx_nbiot[4];smoke = check_smoke;if((temp > 40) || (hump > 50)){//                HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_RESET); //active
//                      HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin, GPIO_PIN_RESET); //activealarm_dht = 1;}else{//  HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_SET);alarm_dht = 0;}if(smoke > 300)//fan+beep{alarm_smoke = 1;motor_sta = 3;HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin, GPIO_PIN_RESET);}else if(smoke < 100)//NO ACTIVE{alarm_smoke = 0;//motor_sta = 4;//HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin, GPIO_PIN_SET);//OLED_ShowString(105,6,"X",12);}else //30-300 fan{alarm_smoke = 0;motor_sta = 3;HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin, GPIO_PIN_RESET);OLED_ShowString(105,6,"O",12);}if(alarm_dht || alarm_smoke)//beep{if(beep_sta == 0)HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_RESET); //activeelse HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_SET);alarm_sta = 7;}else{HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_SET);alarm_sta = 8;}}HAL_Delay(100);}/* USER CODE END 3 */
}//lua脚本
myClient = mqtt.Client(DeviceId, KeepAlive, ProductId, AuthoTnfo)
--print("115200 8-n-1")
uart.setup(0, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 0)timer1 = tmr.create()timer2 = tmr.create()function ReConnect()if wifi.sta.getip() == nil then--print("Connect AP,waitting...")else--print("Connected AP,Success!")--print("IP is:"..wifi.sta.getip())--print("MAC address:"..wifi.sta.getmac())timer1:stop()myClient:connect(host, port, function(client)-- print("Connected OneNET success!")gpio.write(pin,gpio.LOW) end)uart.on("data", function(data) cnt = string.len(data)timer1.stop(1)timer1.interval(1, 1)timer1.start(1)--uart.write(0, data)--print("len:",string.len(data))---print(type(data))if(cnt == 13) thencnt = 0if(string.find(data,"t") == 1) then--print("t!") --print(string.byte(data,2))--print(string.byte(data,3)/100)TEM = string.byte(data,2) + string.byte(data,3)/100HUM = string.byte(data,4) + string.byte(data,5)/100SMOKE = string.byte(data,6)*256 + string.byte(data,7)+ string.byte(data,8)/100LED = string.byte(data,9)MOTOR = string.byte(data,10)ALARM_STA = string.byte(data,11)BEEP_STA = string.byte(data,12)endendUpdate_Message()end, 0)myClient:on("message", function(client , topic , message)--print("get a message.\n")--print(topic..":"..message)print("order:"..message)end)--timer2:alarm(3000, tmr.ALARM_AUTO, Update_Message)end
endtimer1:alarm(1000,tmr.ALARM_AUTO,ReConnect)function Update_Message()info = {}info.tem = TEMinfo.hum = HUMinfo.smoke = SMOKEinfo.led = LEDinfo.motor = MOTORinfo.alarm = ALARM_STAinfo.beep = BEEP_STA --TEM = TEM + 1--HUM = HUM - 1--SMOKE = SMOKE + 0.1ok,message = pcall(cjson.encode, info)--print("message:"..message)header = string.char(3, 0 ,string.len(message))..messagemyClient:publish("$dp", header, 0, 0, function(client)--print("Publish info success!")end)
end

5、部分参考资料

ESP8266开发板NodeMCU 资料:
链接: https://pan.baidu.com/s/1n8gJToN1acbyyiwZ5Jvcsw 提取码: ni62
NodeMCU 烧录固件教程:https://www.cnblogs.com/0pen1/p/12592906.html
DHT11温湿度教程
https://www.jianshu.com/p/3aba3ce1ad12
学习资料免费下载:链接: https://pan.baidu.com/s/1TRTU1f-35HpKSUEhKegHKQ 提取码: vttk
其他软件链接: https://pan.baidu.com/s/1YZZ3GvjqOH5_bkBofPiBrQ 提取码:28uc
0.96寸OLED资料:新版本资料下载链接:https://pan.baidu.com/s/13_WpuJZDb_K2oH_yewQhYw 提取码: 2frr

esp8266官网:http://www.nodemcu.com/index_cn.html

脚本下载参考:https://www.bigiot.net/help/20.html

太极创客:http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/

LUA脚本语言学习:https://blog.csdn.net/DEEP_M/article/details/88808023
https://blog.csdn.net/FourLeafCloverLLLS/article/details/83049525?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=1328741.49269.16170773864034367&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
菜鸟:https://www.runoob.com/lua/lua-tutorial.html
语言基础:https://www.jianshu.com/p/5927eae240ba
https://nodemcu.readthedocs.io/en/latest/upload/#initlua
连接onenet:https://blog.csdn.net/zwb_578209160/article/details/113524108
串口透传:https://www.jianshu.com/p/df339cfedd50



6、注意事项

#涉及到onenet端和线下谁控制设备优先级高的问题需要关注一下
#其它和之前项目的注意事项差不多

完整可运行项目地址

或 点击下方”大饼匠人“卡片,关注并回复"20"免费下载开发资料

技能梳理20@stm32+ESP8266+onenet+dht11+mq2+led+风扇+oled相关推荐

  1. 技能梳理14@stm32+esp8266+ds18b20+红外传感器+烟雾传感器+CO传感器+蜂鸣器

    画板子,有至少8个io口(分别连ds18b20.红外传感器.烟雾传感器.CO传感器,后面3个传感器都是检测到就发高电平),2个串口,1个蜂鸣器,nbiot用的YED-C724 核心板(AIR724) ...

  2. 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 1.项目简介 2.实现逻辑 3.应用场景 #主从机有线控制 #开关操作 4.核心代码梳理 //根据按下的按键执行相应的操作 void h ...

  3. 【HAL库】STM32+ESP8266+Onenet+MQTT,极简工程,hal库移植。

    ESP8266+Onenet+MQTT 1 导入.c.h文件(不再赘述,详细见LED部分) 2 Cubemx配置 3 修改 .c.h 文件 4 测试 ESP8266通过MQTT协议连接Onenet.从 ...

  4. 技能梳理6@NODEMCU+BH1750+DS18B20+DHT11+PWM电机+ONENET

    智慧鱼缸,检测土壤湿度,检测室内温湿度和光照,检测鱼缸水位,检测鱼缸温度,各种蜂鸣器报警(水温超20-24)和控制舵机(步进电机),控制两个水泵,一个需要是从植物里面抽水到鱼缸,另外一个是供养氧作用, ...

  5. 技能梳理18@stm32+柔性墨水屏+薄膜按键+二维码

    薄膜压力按键控制mos开关,切换给柔性墨水屏vcc供电方式,单片机控制vcc切换图像,其中有可以扫描的二维码 1.项目简介 2.实现逻辑 #有两个薄膜按键,一个控制墨水屏供电方式(其实就是一个继电器) ...

  6. 技能梳理7@stm32+OLED+flash掉电保存+按键

    学校违纪分数记录,按键,1.3寸OLED显示,数据掉电保存 1.项目简介 2.实现逻辑 #如上图为显示屏显示内容 #三个物理按键,一个是选择对哪一项进行控制,两个是加减对应项的分数 #控制范围±10, ...

  7. 技能梳理21@stm32+oled+声音强度检测+舵机

    检测声音强度,显示大概的分贝数在oled上,不同强度下舵机转不同的角度 1.项目简介 2.实现逻辑 #通过STM32的adc检测大概声音强度 #在oled上显示声音强度 #舵机根据声音大小转动 3.应 ...

  8. 技能梳理15@stm32+lora(sx1276)+oled+ds18b20+土壤湿度传感器+按键+蜂鸣器+电路板

    从机采集温湿度及超标报警并显示在oled屏幕上,按下按键通过lora模块传输给主机,主机再也显示在其搭载的屏幕上 1.项目简介 2.实现逻辑 #从机实现对温湿度数据的检测 #从机将数据显示到oled上 ...

  9. 基于STM32与OneNet平台的智能家居系统设计(代码开源含自制APP代码)

     前言:本文为手把手教学的基础物联网开发设计,项目包含对下位机(MCU对外设数据读取与控制)和上位机(包含服务平台和APP端)的设计.下位机选取STM32作为MCU,外设有LED灯和DHT11温湿度传 ...

最新文章

  1. Apache Beam的架构概览
  2. python多重继承
  3. 如何在Ubuntu上使用ssh-add永久添加私钥? [关闭]
  4. 将Doc或者Docx文档处理成html的代码逻辑;统计word中的字数,段数,句数,读取word中文档内容的代码逻辑...
  5. 文本检测算法新思路:基于区域重组的文本检测
  6. C# winform程序防止前台卡死
  7. EularProject 39:给周长推断构成直角三角形个数
  8. FBI 连续第三次发布关于国家黑客利用 Kwampirs 发动全球供应链攻击的警告
  9. AT0 Intrudoction
  10. OpenCV-Python实战(10)——详解 OpenCV 轮廓检测
  11. UDP用户态协议栈详细实现
  12. 详细解读行人重识别的k-reciprocal Encoding(k个相互近邻编码方法) re-ranking方法及其实现代码解读
  13. 【科普】当手机遭遇短信验证码轰炸,这几点尤其要注意
  14. Power BI中字体使用微软雅黑
  15. 《Visual Basic.Net 循序渐进》
  16. 冰刃(icesword) V1.22 Final┊官方中文绿色版
  17. C语言从入门到精通第17天(指针和数组联用)
  18. “快用助手”动起苹果商店奶酪
  19. redis持久化机制,深入分析redisAOF和RDB模式的利弊
  20. Word邮件合并功能详解:合并后生成多个word文档,删除空白页

热门文章

  1. 谷歌浏览器被360导航篡改了如何更改回来?
  2. 将一个数组每三个分成一组
  3. 妇女节报告解读|揭示618小红书营销新趋势
  4. 智联招聘数据爬取准备(2)-招聘信息页面及企业主页源码解析
  5. FPGA实验 - ROM调用
  6. ADM的兴衰起落,浮沉之道!道翰天琼认知智能未来机器人接口API
  7. 智能卡接口控制器(SIM)
  8. 怎么把CAD图和航测套合起来用?他们坐标兼容吗?2分钟解决、
  9. Tensorflow fine-tunning AlexNet
  10. 不入耳骨传导耳机品牌哪个好、骨传导耳机品牌推荐