4207| 6
|
[高级教程] Arduino接入DFrobot EasyIOT实验(Arduino+APP Inventor+EasyIOT+百度AI AP... |
本帖最后由 卍卍卍 于 2020-7-18 08:11 编辑 概述: 主流的公有云IOT平台对于积极学习物联网技术中小学生来说难度过大,使用不便,得益于DFrobot推出的EasyIO平台T和OBLOQ串口转WiFi模块,让这一切变得简单且可行。本文将介绍一个基于该平台及硬件开发的简单居室监测系统案例。 实现功能: Arduino MCU将本地温度、湿度、土壤湿度、光线强度数据发布至云端,APP订阅相应Topic,获取并显示数据。 APP发布开关水泵指令、开关LED指令以及LED RGB数值到云端,Arduino MCU订阅相应Topic并做出水泵供水与停水、LED亮起与熄灭、LED RGB颜色设置的响应。 APP调用百度AI开放平台的语音合成、语音识别API,实现通过讲话来操作APP。 利用python将从云端下载的数据进行可视化处理,绘制成图表。 材料准备: Arduino mega 2560开发版、DFrobot OBLOQ模块、1.3寸128X64OLED显示屏、BME280传感器、土壤湿度传感器、光线强度传感器、WS2812全彩LED、5v水泵、Android手机、面包板、杜邦线若干、 其余详细内容请看我的博客:https://blog.csdn.net/weixin_42126140/article/details/107030753 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线-------------------------------------------------分割线------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 今天看到看到有朋友留言把帖子搬过来,那就应各位的要求,搬运一下: Arduino代码: /* @author JRH */ #include "Obloq.h"//obloq库 #include <Adafruit_NeoPixel.h>//WS2812库 #include <Adafruit_BME280.h>//BME280库 #include <U8x8lib.h>//128x64OLED库 //引脚定义 #define soil_pin A0 #define light_pin A1 #define LED_pin 49 #define pump_pin 45 #define LED_num 7//LED灯数量定义 #define ON 1 #define OFF 0 //水泵打开或关闭语句定义 #define pump_ON digitalWrite(pump_pin,HIGH) #define pump_OFF digitalWrite(pump_pin,LOW) //WiFi名称、密码、连接云端的账户、密码定义 const String wifiSsid="******"; const String WifiPwd=“*********"; const String iotId="mfdkjryzMR"; const String iotPwd="mwfhGksez"; Obloq olq(&Serial3,wifiSsid,WifiPwd,iotId,iotPwd);//实例化obloq对象 Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_num, LED_pin, NEO_GRB + NEO_KHZ800);//实例化LED对象 Adafruit_BME280 bme;//实例化BME对象 U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);//实例化OLED对象 //MQTT Topic定义 const String temp_topic = "kahC7CWGR"; const String humi_topic="5zbC7CWGR"; const String soil_topic="9iuq7CZMR"; const String light_topic="7A4enjZGR"; const String pump_topic="VN-kO6WGR"; const String LED_topic="yzupt6ZMg"; const String RGB_topic="5KrtpeWGg"; //数据变量定义 int R_val=0; int G_val=0; int B_val=0; int light_val=0; int soil_val=0; int LED_switch=OFF; double temp_val=0; double humi_val=0; //记录上电时间的变量 unsigned long cur_time=0; //定义处理云端下发消息的回调函数 void msgHandle(const String& topic,const String& message){ if(pump_topic==topic){ if(message=="1") pump_ON; else if(message=="0") pump_OFF; Serial.print("pump: ");//将消息发送到串口,便于监控运行状态 Serial.println(message); } if(LED_topic==topic){ if(message=="1") LED_switch=ON; else if(message=="0") LED_switch=OFF; Serial.print("LED: "); Serial.println(message); } if(RGB_topic==topic){ String str=message; getRGB(str); Serial.print(R_val); Serial.print(G_val); Serial.println(B_val); Serial.print("RGB: "); Serial.println(message); } } //定义本地传感器数据发送到云端的函数 void publishMessage(){ olq.publish(temp_topic,String(temp_val)); olq.publish(humi_topic,String(humi_val)); olq.publish(soil_topic,String(soil_val)); olq.publish(light_topic,String(light_val)); } void setup() { //串口初始化 Serial3.begin(9600); Serial.begin(115200); //调用初始化函数 Init(); } void loop() { //obloq执行函数 olq.update(); if(LED_switch==ON)//开灯 colorWipe(strip.Color(R_val, G_val, B_val), 50); else//关灯 colorWipe(strip.Color(0,0,0), 50); //读取传感器数据 light_val=analogRead(light_pin); soil_val=analogRead(soil_pin); temp_val=bme.readTemperature(); humi_val=bme.readHumidity(); //到达时间间隔则发送数据到云端 if(millis()-cur_time>60000){ cur_time=millis(); publishMessage(); } //调用128x64显示屏数据显示函数 draw(); } //初始化函数定义 void Init(){ //水泵初始化 pinMode(pump_pin,OUTPUT); pump_OFF; //LED初始化 strip.begin(); strip.show(); //OLED显示屏初始化 u8x8.begin(); u8x8.setPowerSave(0); //BME280初始化 if (!bme.begin(0x76)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } else Serial.println("BME280 PASS!"); //注册回调函数 olq.setMsgHandle(msgHandle); //订阅相应的Topic olq.subscribe(pump_topic); olq.subscribe(LED_topic); olq.subscribe(RGB_topic); } //定义LED显示相应颜色灯光的函数 void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, c); strip.show(); delay(wait); } } //定义解析RGB字符串的函数 void getRGB(String str){ int pos0,pos1,pos2,pos3; for(int i=0;i<str.length();i++){ if(str=='!') pos0=i; if(str=='@') pos1=i; if(str=='*') pos2=i; if(str=='$') pos3=i; } R_val=getInt(str.substring(pos0+1,pos1)); G_val=getInt(str.substring(pos1+1,pos2)); B_val=getInt(str.substring(pos2+1,pos3)); } //定义字符串转整型的函数 int getInt(String str){ int num=0; for(int i=0;i<str.length();i++){ num*=10; num+=str-'0'; } return num; } //定义OLED显示屏显示数据的函数 void draw(){ //显示温度 char temp_value[6]; dtostrf(temp_val, 2, 2, temp_value); u8x8.setFont(u8x8_font_chroma48medium8_r); u8x8.drawString(1,1,"Temperature:"); u8x8.setFont(u8x8_font_px437wyse700b_2x2_r); u8x8.drawString(3,4,temp_value); delay(100); u8x8.clear();//擦除显示的信息 //显示湿度 char humi_value[6]; dtostrf(humi_val, 2, 2, humi_value); u8x8.setFont(u8x8_font_chroma48medium8_r); u8x8.drawString(1,1,"Humidity:"); u8x8.setFont(u8x8_font_px437wyse700b_2x2_r); u8x8.drawString(3,4, humi_value); delay(100); u8x8.clear(); //显示土壤湿度 char soil_value[6]; dtostrf(soil_val, 4, 0, soil_value); u8x8.setFont(u8x8_font_chroma48medium8_r); u8x8.drawString(1,1,"SoilHumidity:"); u8x8.setFont(u8x8_font_px437wyse700b_2x2_r); u8x8.drawString(3,4,soil_value); delay(100); u8x8.clear(); //显示光线强度 char light_value[6]; dtostrf(light_val, 4, 0, light_value); u8x8.setFont(u8x8_font_chroma48medium8_r); u8x8.drawString(1,1,"LightValue:"); u8x8.setFont(u8x8_font_px437wyse700b_2x2_r); u8x8.drawString(3,4,light_value); delay(100); u8x8.clear(); } EASY-IOT配置: APP GUI设计: APP inventor代码块: Python 绘图代码; import matplotlib.pyplot as plt import pandas as pd plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['font.family']='sans-serif' plt.rcParams['axes.unicode_minus'] = False data = pd.read_csv('C:\\Users\\Desktop\\humi.csv') xdata = [] ydata = [] xdata = data.ix[:,'time'] #将csv中列名为“列名1”的列存入xdata数组中 ydata = data.ix[:,'Humidity'] #将csv中列名为“列名2”的列存入ydata数组中 plt.plot(xdata,ydata,'r<--') plt.title(u"湿度随时间变化图",size=20) #设置表名为“表名” plt.legend(loc="best",fontsize="10",edgecolor='blue',title='图例:') plt.xlabel(u'时间',size=15) #设置x轴名为“x轴名” plt.ylabel(u'湿度数值',size=15) #设置y轴名为“y轴名” plt.show() 数据可视化图表: 注意事项: EasyIOT确实比较easy ,非常适合中小学教学使用。需要注意的一个问题是OBLOQ模块的全双工通信能力不是很强,如果MCU发送的数据过快,那么MCU就收不到云端下发的指令,所以要注意延长MCU发布数据的间隔时间。 ----------------------------------------------------不能图文混排,很讨厌----------------------------------- |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed