Arduino接入DFrobot EasyIOT实验(Arduino+APP Inventor+EasyIOT+百度AI API+Python数据可视化)
概述:
主流的公有云IOT平台对于积极学习物联网技术中小学生来说难度过大,使用不便,得益于DFrobot推出的EasyIO平台T和OBLOQ串口转WiFi模块,让这一切变得简单且可行。本文将介绍一个基于该平台及硬件开发的简单居室监测系统案例。
实现功能:
- Arduino MCU将本地温度、湿度、土壤湿度、光线强度数据发布至云端,APP订阅相应Topic,获取并显示数据,同时OLED屏进行数据的本地显示。
- 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手机、面包板、杜邦线若干、
接线图:
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数据可视化)相关推荐
- 数据可视化实验:python数据可视化-柱状图,条形图,直方图,饼图,棒图,散点图,气泡图,雷达图,箱线图,折线图
数据可视化实验:python数据可视化 实验8-12:大数据可视化工具-python 目录 1柱状图 2条形图 3直方图 4饼图 5棒图 6散点图 7气泡图 8雷达图 9箱线图 10折线图 1柱状图 ...
- 关于APP inventor 2 模拟器AI伴侣版本不一致的问题解决
先下载AI starter(建议用加速器如迅雷等) 单击 单击 启动模拟器 单击 单击 会出现 然后在模拟器的浏览器中输入http://app.gzjk..........的网址 下载安装这个APK ...
- 实验报告-Python数据可视化之Pyecharts
课程:大数据可视化 实验室名称: 指导老师: 实训日期: 年 月 日 实训题目:Python数据可视化之Pyecharts 实训目的: 一.python的安装与基本使用 二.创建py项目 三.pyec ...
- python数据可视化实验报告的总结,数据可视化的基本流程总结
我们要的不是数据,而是数据告诉我们的事实.大多数人面临这样一个挑战:我们认识到数据可视化的必要性,但缺乏数据可视化方面的专业技能.部分原因可以归结于,数据可视化只是数据分析过程中的一个环节,数据分析师 ...
- 青少儿编程- App Inventor简介
目录 App Inventor的身世 软件环境 用App Inventor做什么 AI伴侣 安卓模拟器 App Inventor的身世 App Inventor 原是Google实验室(Google ...
- 积木编程安卓app入门 —— 5 分钟学会 App Inventor
不用怀疑,学习App Inventor就是这么简单.花费5分钟,就能学会App Inventor. 1分钟了解App Inventor App Inventor 2 简称 ai,为了和人工智能(Art ...
- legend位置 pyecharts_实验|pyecharts数据可视化分析-1
1. 实验介绍 本实验主要介绍pyecharts基本特点与属性. 1.1. 实验目的 了解pyecharts功能.特点.与安装方式. 1.2. 知识点 pyecharts特点 pyecharts图表 ...
- 百度AI接入api使用流程
文章目录 前言 使用步骤 1.创建应用获取AK(API Key),SK(Secret Key) 1.1进入: [百度AI 官网](https://ai.baidu.com/),在开放能力下面找到:人像 ...
- 百度AI人脸检测测颜值php,百度AI人脸识别测颜值源码app
百度AI人脸识别测颜值源码app是由百度AI官方提供的,将人脸识别分为了两个接口,v2与vv3.需要根据文档权限来选择接口类型,这款软件非常方便用户学习和体验.想要学习相关信息的朋友可以来看看哦. 百 ...
最新文章
- 对C语言程序进行编译时 针对以下情况,linux书上划的题的答案.doc
- PHP正则表达式规则及常用方法整理
- JavaScript之数据类型
- 反思成长:强压得以透彻
- Redis _面试经典
- 硬件:台式机老式键盘知识科普
- 系统测试集成测试单元测试_单元和集成测试的代码覆盖率
- mysql耦合_内聚与耦合
- CSS鼠标滑过改变样式颜色
- 织梦dede模板|HTML5建材陶瓷装修设计网站织梦dede模板源码[自适应手机版]
- 如何选举根端口,指定端口,阻塞端口
- 遭遇nat.exe,socks.exe,USP10.dll,BOSC.dll,kb080387.CNT,~ctwxw.txt等2
- 网页版bpc电波对时_bpc电波对时app下载
- SQL编程-辣椒菠萝
- 办公用品管理系统服务器版,求索办公用品管理系统 2019
- Excel 冻结首行
- 路飞学城-Python开发-第一章
- 苏鹏的乘风归去 - 犹入画境
- java epics_EPICS超入门-KEKe+e-.PDF
- 处理Zabbix历史数据库办法二---使用MySQL表分区