概述:
主流的公有云IOT平台对于积极学习物联网技术中小学生来说难度过大,使用不便,得益于DFrobot推出的EasyIO平台T和OBLOQ串口转WiFi模块,让这一切变得简单且可行。本文将介绍一个基于该平台及硬件开发的简单居室监测系统案例。

实现功能:

  1. Arduino MCU将本地温度、湿度、土壤湿度、光线强度数据发布至云端,APP订阅相应Topic,获取并显示数据,同时OLED屏进行数据的本地显示。
  2. APP发布开关水泵指令、开关LED指令以及LED RGB数值到云端,Arduino MCU订阅相应Topic并做出水泵供水与停水、LED亮起与熄灭、LED RGB颜色设置的响应。
  3. APP调用百度AI开放平台的语音合成、语音识别API,实现通过讲话来操作APP。
  4. 利用python将从云端下载的数据进行可视化处理,绘制成图表。

材料准备:

Arduino mega 2560开发版、DFrobot OBLOQ模块、1.3寸128X64OLED显示屏、BME280传感器、土壤湿度传感器、光线强度传感器、WS2812全彩LED、5v水泵、Android手机、面包板、杜邦线若干、

接线图:


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);}elseSerial.println("BME280 PASS!");//注册回调函数olq.setMsgHandle(msgHandle);//订阅相应的Topicolq.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[i]=='!')pos0=i;if(str[i]=='@')pos1=i;if(str[i]=='*')pos2=i;if(str[i]=='$')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[i]-'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();
}

云端:


APP GUI设计:



APP Inventor 代码块:


Python代码:

import matplotlib.pyplot as plt
import pandas as pdplt.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发布数据的间隔时间。

Arduino接入DFrobot EasyIOT实验(Arduino+APP Inventor+EasyIOT+百度AI API+Python数据可视化)相关推荐

  1. 数据可视化实验:python数据可视化-柱状图,条形图,直方图,饼图,棒图,散点图,气泡图,雷达图,箱线图,折线图

    数据可视化实验:python数据可视化 实验8-12:大数据可视化工具-python 目录 1柱状图 2条形图 3直方图 4饼图 5棒图 6散点图 7气泡图 8雷达图 9箱线图 10折线图 1柱状图 ...

  2. 关于APP inventor 2 模拟器AI伴侣版本不一致的问题解决

    先下载AI starter(建议用加速器如迅雷等) 单击 单击 启动模拟器 单击 单击 会出现 然后在模拟器的浏览器中输入http://app.gzjk..........的网址 下载安装这个APK ...

  3. 实验报告-Python数据可视化之Pyecharts

    课程:大数据可视化 实验室名称: 指导老师: 实训日期: 年 月 日 实训题目:Python数据可视化之Pyecharts 实训目的: 一.python的安装与基本使用 二.创建py项目 三.pyec ...

  4. python数据可视化实验报告的总结,数据可视化的基本流程总结

    我们要的不是数据,而是数据告诉我们的事实.大多数人面临这样一个挑战:我们认识到数据可视化的必要性,但缺乏数据可视化方面的专业技能.部分原因可以归结于,数据可视化只是数据分析过程中的一个环节,数据分析师 ...

  5. 青少儿编程- App Inventor简介

    目录 App Inventor的身世 软件环境 用App Inventor做什么 AI伴侣 安卓模拟器 App Inventor的身世 App Inventor 原是Google实验室(Google ...

  6. 积木编程安卓app入门 —— 5 分钟学会 App Inventor

    不用怀疑,学习App Inventor就是这么简单.花费5分钟,就能学会App Inventor. 1分钟了解App Inventor App Inventor 2 简称 ai,为了和人工智能(Art ...

  7. legend位置 pyecharts_实验|pyecharts数据可视化分析-1

    1. 实验介绍 本实验主要介绍pyecharts基本特点与属性. 1.1. 实验目的 了解pyecharts功能.特点.与安装方式. 1.2. 知识点 pyecharts特点 pyecharts图表 ...

  8. 百度AI接入api使用流程

    文章目录 前言 使用步骤 1.创建应用获取AK(API Key),SK(Secret Key) 1.1进入: [百度AI 官网](https://ai.baidu.com/),在开放能力下面找到:人像 ...

  9. 百度AI人脸检测测颜值php,百度AI人脸识别测颜值源码app

    百度AI人脸识别测颜值源码app是由百度AI官方提供的,将人脸识别分为了两个接口,v2与vv3.需要根据文档权限来选择接口类型,这款软件非常方便用户学习和体验.想要学习相关信息的朋友可以来看看哦. 百 ...

最新文章

  1. 对C语言程序进行编译时 针对以下情况,linux书上划的题的答案.doc
  2. PHP正则表达式规则及常用方法整理
  3. JavaScript之数据类型
  4. 反思成长:强压得以透彻
  5. Redis _面试经典
  6. 硬件:台式机老式键盘知识科普
  7. 系统测试集成测试单元测试_单元和集成测试的代码覆盖率
  8. mysql耦合_内聚与耦合
  9. CSS鼠标滑过改变样式颜色
  10. 织梦dede模板|HTML5建材陶瓷装修设计网站织梦dede模板源码[自适应手机版]
  11. 如何选举根端口,指定端口,阻塞端口
  12. 遭遇nat.exe,socks.exe,USP10.dll,BOSC.dll,kb080387.CNT,~ctwxw.txt等2
  13. 网页版bpc电波对时_bpc电波对时app下载
  14. SQL编程-辣椒菠萝
  15. 办公用品管理系统服务器版,求索办公用品管理系统 2019
  16. Excel 冻结首行
  17. 路飞学城-Python开发-第一章
  18. 苏鹏的乘风归去 - 犹入画境
  19. java epics_EPICS超入门-KEKe+e-.PDF
  20. 处理Zabbix历史数据库办法二---使用MySQL表分区

热门文章

  1. Android Kotlin-协程
  2. java创建文件夹(Java创建文件夹失败重新创建)
  3. 不能拖动CAD文件到CAD窗口打开,解决方案
  4. 读书笔记—做事坚定,做人柔软
  5. 厉害了,大学生制作的学校三维实景模型
  6. css 文字超出三行展示省略号
  7. 7-12 验证哥德巴赫猜想 (10 分)
  8. 介绍两种Revit绘制斜墙的方法及快速【梁随斜板】
  9. 【Web技术】985- 当聊到前端性能优化时,我们会关注什么?
  10. 服务器引擎制作,2.5D-GIS地图引擎设计