Arduino接入DFrobot EasyIOT实验(Arduino+APP Inventor+EasyIOT+百度AI AP...

2020-06-306906
AI 快速预览详细 收起
本文介绍了一个基于Arduino和EasyIOT平台的居室监测系统项目。该项目使用了Arduino Mega 2560开发板、DFrobot OBLOQ模块、BME280传感器等硬件,实现了将温度、湿度、土壤湿度、光线强度等数据发布至云端,并通过APP进行远程监控和控制。此外,还利用Python对从云端下载的数据进行可视化处理,绘制图表。项目中需要注意的一个问题是OBLOQ模块的全双工通信能力较弱,需要延长MCU发布数据的间隔时间以确保指令接收。


概述:

主流的公有云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发布数据的间隔时间。


----------------------------------------------------不能图文混排,很讨厌-----------------------------------

202007188788..png (443.97 KB, 下载次数: 5068)

Arduino + EasyIOT · 居室监测系统_image_3.webp

202007188277..png (246.67 KB, 下载次数: 5181)

Arduino + EasyIOT · 居室监测系统_image_6.webp

202007189350..png (327.16 KB, 下载次数: 5051)

Arduino + EasyIOT · 居室监测系统_image_9.webp

202007188840..png (1.35 MB, 下载次数: 5190)

Arduino + EasyIOT · 居室监测系统_image_12.webp

202007187224..png (520.08 KB, 下载次数: 5103)

Arduino + EasyIOT · 居室监测系统_image_15.webp

202007186621..png (547.47 KB, 下载次数: 5178)

Arduino + EasyIOT · 居室监测系统_image_18.webp

202007185810..png (1.1 MB, 下载次数: 5100)

Arduino + EasyIOT · 居室监测系统_image_21.webp

202007184712..png (139.49 KB, 下载次数: 5121)

Arduino + EasyIOT · 居室监测系统_image_24.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(6)
涛声依旧2021
涛声依旧2021
楼主可以分享一下程序吗?
卍卍卍
卍卍卍
作者
不好意思啊,不常来DFrobot社区。
可以使用APP Inventor WxBit版本,里面已经有了MQTT组件。
伟华
伟华
楼主可以分享案例中的MQTT客户端那个文件吗?
我在app inventor没找到。。
szjuliet
szjuliet
很赞啊!搬过来绝对的精华贴!
rzegkly
rzegkly
期待更好的文章,学习
hnyzcj
hnyzcj
楼主可以把你的博客搬运过来
- 没有更多了 -