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

1、项目简介

2、实现逻辑

#配置好esp8266,烧录好nodemcu的固件,编写lua脚本,识别固定协议的数据传给onenet
#通过adc检测烟雾值(mq2)
#检测CO(MQ7)
#检测火灾情况(红外传感器)
#检测ds18b20测到的的温度
#进行参数分析,判读是否符合蜂鸣器报警条件
#将参数发送给onenet(通过nodemcu),每5秒一次自动发送
#oled显示各状态参数
#如果 烟雾>=1000 ‖ co>=1000 ‖ 温度>=50 ‖ 检测到红外,就蜂鸣器提示,反之不响
#远端网页版加一个红外情况:放一个开关,检测到红外开关变on,反之off。
#火灾情况,放一个开关,烟雾>=1000 ‖ co>=1000 ‖ 温度>=50 ‖ 检测到红外,若这串结果为1开关变

3、应用场景

4、核心代码梳理

//stm32程序
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_smoke / 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;
}void MQ7_PPM_Calibration(float RS)
{R0_CO = RS / pow(CAL_PPM_CO / 98.322, 1 / -1.458f);
}// 获取传感器的值
float MQ7_GetPPM(void)
{float Vrl = 33.3f * ADC_num_co/ 4095.f;Vrl = ( (float)( (int)( (Vrl+0.005)*100 ) ) )/100;float RS_CO = (3.3f - Vrl) / Vrl * RL;if(HAL_GetTick() < 10000){MQ7_PPM_Calibration(RS_CO);}float ppm = 98.322f * pow(RS_CO/R0_CO, -1.458f);return  ppm;
}//复位DS18B20
void DS18B20_Rst(void)
{HAL_GPIO_WritePin(DS18B20_GPIO_Port,DS18B20_Pin,GPIO_PIN_RESET); //拉低DQdelay_us(750);    //拉低750usHAL_GPIO_WritePin(DS18B20_GPIO_Port,DS18B20_Pin,GPIO_PIN_SET); //DQ=1delay_us(15);     //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
uint8_t DS18B20_Check(void)
{uint8_t retry=0;//SET PB1 INPUTwhile (HAL_GPIO_ReadPin(DS18B20_GPIO_Port,DS18B20_Pin) && retry<200){retry++;delay_us(1);};if(retry>=200)return 1;else retry=0;while (!HAL_GPIO_ReadPin(DS18B20_GPIO_Port,DS18B20_Pin)&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;return 0;
}
//从DS18B20读取一个位
//返回值:1/0
uint8_t DS18B20_Read_Bit(void)           // read one bit
{uint8_t data;HAL_GPIO_WritePin(DS18B20_GPIO_Port,DS18B20_Pin,GPIO_PIN_RESET);delay_us(2);HAL_GPIO_WritePin(DS18B20_GPIO_Port,DS18B20_Pin,GPIO_PIN_SET);delay_us(12);if(HAL_GPIO_ReadPin(DS18B20_GPIO_Port,DS18B20_Pin))data=1;else data=0;delay_us(50);return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
uint8_t DS18B20_Read_Byte(void)    // read one byte
{uint8_t i,j,dat;dat=0;for (i=1; i<=8; i++){j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(uint8_t dat)
{uint8_t j;uint8_t testb;for (j=1; j<=8; j++){testb=dat&0x01;dat=dat>>1;if (testb){HAL_GPIO_WritePin(DS18B20_GPIO_Port,DS18B20_Pin,GPIO_PIN_RESET);// Write 1delay_us(2);HAL_GPIO_WritePin(DS18B20_GPIO_Port,DS18B20_Pin,GPIO_PIN_SET);delay_us(60);}else{HAL_GPIO_WritePin(DS18B20_GPIO_Port,DS18B20_Pin,GPIO_PIN_RESET);// Write 0delay_us(60);HAL_GPIO_WritePin(DS18B20_GPIO_Port,DS18B20_Pin,GPIO_PIN_SET);delay_us(2);}}
}
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{DS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);// skip romDS18B20_Write_Byte(0x44);// convert
}
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在
uint8_t DS18B20_Init(void)
{DS18B20_Rst();return DS18B20_Check();
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
float DS18B20_Get_Temp(void)
{uint8_t temp;uint8_t TL,TH;short tem;float return_tem;DS18B20_Start();                    // ds1820 start convertDS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);// skip romDS18B20_Write_Byte(0xbe);// convertTL=DS18B20_Read_Byte(); // LSBTH=DS18B20_Read_Byte(); // MSBif(TH>7){TH=~TH;TL=~TL;temp=0;//温度为负} else temp=1;//温度为正tem=TH; //获得高八位tem<<=8;tem+=TL;//获得底八位return_tem = (float)tem*0.625;//转换if(temp)return return_tem; //返回温度值else return -return_tem;
}/* 向onenet平台发数据函数* return 1 ok; 0 fail*/
uint8_t send_onenet(void)
{char text[200];uint8_t len;memset(text, 0, sizeof(text));//组包memset(text, 0, sizeof(text));sprintf(text, "{\"id\": 123,\"dp\": {\"SMOKE\": [{\"v\": %.2f}],\"FIRE\": [{\"v\": %d}],\"RED\": [{\"v\": %d}],\"TEMP\": [{\"v\": %.2f}],\"CO\": [{\"v\": %.2f}]}}",check_smoke, fire_sta, red_sta, check_temp, check_co);//封包len = strlen(text);HAL_UART_Transmit(&huart1, (uint8_t *)text, len, 0xFFFF); //发送return 1;
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint16_t clk, adcBuf[3];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();MX_USART1_UART_Init();MX_USART3_UART_Init();/* USER CODE BEGIN 2 */OLED_Init();OLED_ColorTurn(0);//OLED_DisplayTurn(0);//OLED_Refresh();OLED_Clear();OLED_ShowString(0,0,"TEMP:    .      C",12);OLED_ShowString(0,10,"CO:        .    PPM",12);OLED_ShowString(0,20,"SMO:       .    PPM",12);OLED_ShowString(0,30,"RED:      ",12);OLED_ShowString(0,40,"FIRE:      ",12);OLED_Refresh();//__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//open uart1 RXNEHAL_Delay(100);HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_SET);DS18B20_Init();/* 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;}
//send nbiot/displayif(clk % 20 == 0) //1s -- 10{//check smoke//HAL_ADC_Start_IT(&hadc1);for(uint8_t i=0; i<3; i++){HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1,0xffff);adcBuf[i]=HAL_ADC_GetValue(&hadc1);}ADC_num_smoke = adcBuf[0];ADC_num_co = adcBuf[1];ADC_num_fire = adcBuf[2];check_smoke = MQ2_GetPPM();intS = (int)check_smoke;float tmp = check_smoke-intS;decS = tmp * 100;OLED_ShowNum(25,20,intS,6,12);OLED_ShowNum(72,20,decS,2,12);//check  CO  //10ppm - 10000ppmcheck_co = MQ7_GetPPM();intCO = (int)check_co;float tmpC0 = check_co-intCO;decCO = tmpC0 * 100;OLED_ShowNum(25,10,intCO,6,12);OLED_ShowNum(72,10,decCO,2,12);//            OLED_ShowNum(39,2,CO>>8,4,12);
//            OLED_ShowNum(80,2,CO&0xff,2,12);//check  fireif(HAL_GPIO_ReadPin(GPIOA,FIRE_DO_Pin)){red_sta = 0;OLED_ShowString(55,30,"NO  ",12);}else{red_sta = 1;OLED_ShowString(55,30,"YES",12);}//check  DS18B20check_temp = DS18B20_Get_Temp()/10;intT = (int)check_temp;          /*合成实际温度整数部分****精度相对上面的更高*/float tem_tmp = check_temp-intT;         /*合成实际温度小数部分*/decT = tem_tmp*100;OLED_ShowNum(40,0,intT,2,12);OLED_ShowNum(60,0,decT,2,12);tx_nbiot[2] = decT;tx_nbiot[3] = tem_tmp;tx_nbiot[4] = CO>>8;tx_nbiot[5] = CO&0xff;tx_nbiot[6] = intS / 256;tx_nbiot[7] = intS % 256;tx_nbiot[8] = decS;tx_nbiot[9] = fire_sta;
//            tx_nbiot[10] = motor_sta;
//            tx_nbiot[11] = alarm_sta;
//            tx_nbiot[12] = beep_sta + 5;//alarmtemp = tx_nbiot[2];hump = tx_nbiot[4];smoke = check_smoke;if((temp > 40) || (CO > 50)){}else{}if(smoke > 300){alarm_smoke = 1;}else if(smoke < 100){alarm_smoke = 0;}else //30-300 fan{alarm_smoke = 0;}if(alarm_smoke || fire_sta)alarm_sta = 1;else alarm_sta = 0;if(alarm_sta)//beep{//                HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_RESET); //active}else{//                  HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_SET);}if(check_smoke>=1000 || check_co>=1000 || check_temp>=50 || red_sta)//check_smoke, fire_sta, red_sta, check_temp, check_cofire_sta = 1;else fire_sta = 0;if(!fire_sta){OLED_ShowString(55,40,"NO  ",12);HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_SET);}else{OLED_ShowString(55,40,"YES",12);HAL_GPIO_WritePin(GPIOA, BEEP_Pin, GPIO_PIN_RESET); //active}}if(clk % 50 == 0) //1s -- 10{send_onenet();//tx onenet data}HAL_Delay(100);OLED_Refresh();}/* USER CODE END 3 */
}//lua脚本
cfg = {}
cfg.ssid = "esp8266"
cfg.pwd = "esp8266test"wifi.setmode(wifi.STATIONAP)
wifi.sta.config(cfg)
wifi.sta.connect()DeviceId = "704xxx0230"
ProductId ="41xxx85"
AuthoTnfo = "96jNf6YzxxxxxSznrgULsQ="
KeepAlive = 200
host = "183.230.40.39"
port = 6002 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 thenprint("Connect AP,waitting...")elseprint("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、部分参考资料

http://www.openedv.com/
https://wiki.openluat.com/
http://wiki.yinerda.com/index.php/YED-C724

6、注意事项

#YED-C724好像不需要物联网卡
#用打火机的气体可以模拟co、烟雾及火灾情况
#烟雾检测的时候前几分钟一般是校准时间
#ESP8266脚本的信息要和远端的onenet上的信息一致

完整可运行项目地址

技能梳理14@stm32+esp8266+ds18b20+红外传感器+烟雾传感器+CO传感器+蜂鸣器相关推荐

  1. 技能梳理20@stm32+ESP8266+onenet+dht11+mq2+led+风扇+oled

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计

    STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计 DS18B20是常用的一种数字温度传感器,通过1-wire总线实现传感器内部寄存器的访问.传感器有两种供电方式 ...

  9. STM32 BMP280模块 获取气压温度高度传感器数据 TFT显示

    STM32 BMP280模块 获取气压温度高度传感器数据 TFT显示 简介 BMP280是博世最新推出的数字气压传感器,具有卓越的性能和低廉的价格,相对精度为±0.12 hPa(相当于±1米),传感器 ...

最新文章

  1. 初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型
  2. 中文论文万能句型_SCI 论文写作万能句型汇总(很实用)
  3. 在两个页面间翻转设置Animation动作的一些总结
  4. Linux文本三剑客之sed仗剑走天涯
  5. 老师,我来帮你推问卷
  6. ubuntu如何编辑/etc/ld.so.conf
  7. Android Studio 多渠道打包、自动版本号及 gradlew 命令的基本使用
  8. [Spring5]IOC容器_Bean管理注解方式_创建对象
  9. MySQL · 案例分析 · RDS MySQL线上实例insert慢常见原因分析
  10. 移动端开发项目的一些躺坑笔记
  11. paip.提升效率--僵尸代码的迷思
  12. zzbird的bbsmax出了?
  13. java 车牌号判断
  14. 梳理常见硬盘存储 I/O 接口相关简称
  15. 微信开放平台apk应用签名获取
  16. 个人web前段学习心得
  17. 4.124.13天梯赛补题
  18. 数据结构与算法 — 环形队列
  19. 卓有成效的程序员---自动化
  20. 全局变量和静态变量以及内存堆栈的关系

热门文章

  1. stripes+jersery的web.xml配置
  2. 阿里云设置密钥验证后本地远程登陆
  3. 计算机网络基础会话层,计算机网络体系结构及协议之会话层
  4. 乐优商场项目day10—新增商品
  5. 【rtl8211】网卡 phy 设置笔记
  6. hadoop安装(三台虚拟机)一些常见问题
  7. js操作在当前日期加减(天、周、月、年数)
  8. 使用计算机绘图软件首先要,如何学好计算机绘图 AUTOCAD 软件
  9. Spring5轻轻松松一遍过
  10. 右上3慢性根尖周炎急性发作伴发眶下间隙感染治疗病例展示