900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 电子信息处理课程设计-用blinker实现的arduino小车和ESP32桌面时钟

电子信息处理课程设计-用blinker实现的arduino小车和ESP32桌面时钟

时间:2020-04-23 07:44:27

相关推荐

电子信息处理课程设计-用blinker实现的arduino小车和ESP32桌面时钟

文章目录

前言一、利用blinker和arduino c语言设计的环境监测小车(自我认知为大杂烩)1、物品准备2、界面设计3、arduino mega2560控制小车4、esp32cam做传输中介5、代码分析(更新中)5.1、车辆控制5.2、bh1750光线强度传感器5.3、dht22温湿度传感器5.4、BMP2805.5、GP2Y1010AU0F5.6、小爱同学查询温湿度5.7、esp32与arduino mega2560之间的通信5.8、blinker手机端控制设备5.9、查询天气(json解析)6、内网穿透6、运行效果二、blinker开发的天气时钟1、物品准备2、代码3、TFT_eSPI中的一点设置改动4、代码分析4.1、表盘显示(TFT.eSPI的使用)4.2、获取blinker时间4.3、获取天气5、运行效果总结

前言

在电子信息处理课程设计做了简单的小制作,非常简单主要是体力活儿,裸机就能运行,花了两周的课余时间,给大家分享一下代码,给大家做课设或者小制作一些思路,后续再注释更新。

一、利用blinker和arduino c语言设计的环境监测小车(自我认知为大杂烩)

1、物品准备

arduino mega2560,esp32-cam,bmp280,GP2Y1010AU0F,dht22,bh1750

7.4v电池,船型开关,一大把杜邦线,两个面包板,一个车架子(带四个直流减速电机)

2、界面设计

{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/f1.jpg¨¨isFull¨»}}¨dashboard¨|{¨type¨¨vid¨¨bg¨É¨cols¨Ñ¨rows¨Î¨key¨¨video¨´x´É´y´É¨speech¨|÷¨url¨¨http://192.168.43.134¨¨str¨¨mjpg¨¨lstyle¨É¨mode¨É}{ßA¨ran¨¨t0¨¨速度¨¨clr¨¨#595959¨¨max¨Ì¨min¨ÊßCÉßDÏßEËßF¨sudu¨´x´É´y´ÒßH|÷ßMÊ}{ßA¨btn¨¨ico¨¨fad fa-arrow-alt-circle-left¨ßNÉßP¨左转¨¨t1¨¨文本2¨ßCÉßDËßEËßF¨left¨´x´É´y´¤DßH|÷ßR¨#EA0909¨}{ßAßWßX¨fad fa-arrow-alt-circle-up¨ßNÉßP¨前进¨ßaßbßCÉßDËßEËßF¨go¨´x´Ë´y´¤BßH|÷ßRßdßMÉ}{ßAßWßX¨fad fa-arrow-alt-circle-down¨ßNÉßP¨后退¨ßaßbßCÉßDËßEËßF¨back¨´x´Ë´y´¤DßH|÷ßRßd}{ßAßWßX¨fad fa-arrow-alt-circle-right¨ßNÉßP¨右转¨ßaßbßCÉßDËßEËßF¨right¨´x´Í´y´¤DßH|÷ßRßd}{ßAßWßX¨fad fa-pause-circle¨ßNÉßP¨停下¨ßaßbßCÉßDËßEËßF¨stop¨´x´Ï´y´¤DßH|÷ßRßd}{ßA¨num¨ßP¨温度¨ßX¨far fa-thermometer-three-quarters¨ßRßdßUÉßT¢1c¨uni¨´度´ßCÉßDËßEËßF¨tep¨´x´Ë´y´ÎßH|÷}{ßAßqßP¨湿度¨ßX¨fad fa-humidity¨ßR¨#389BEE¨ßUÉßTº0ßt´%´ßCÉßDËßEËßF¨hum¨´x´É´y´ÎßH|÷}{ßAßqßP¨光照¨ßX¨fad fa-lightbulb-on¨ßR¨#FBA613¨ßUÉßT¢G8ßt´lx´ßCÉßDËßEËßF¨light¨´x´É´y´ÐßH|÷}{ßAßWßX¨fad fa-projector¨ßNÊßP¨闪光灯¨ßaßbßCÉßDËßEËßF¨led¨´x´Ï´y´¤BßH|÷ßR¨#00A90C¨ßMÊ}{ßA¨tex¨ßP¨文本1¨ßa´´¨size¨´20´ßCÉßX¨fad fa-comment-check¨ßDÍßEËßF¨decision¨´x´É´y´¤FßH|÷ßMÌßRßS}{ßAßWßX¨fad fa-arrow-alt-right r135¨ßNÉßP¨原地左转¨ßaßbßCÉßDËßEËßF¨lefthere¨´x´É´y´¤BßH|÷ßRßd}{ßAßWßX¨fad fa-arrow-alt-left r225¨ßNÉßP¨原地右转¨ßaßbßCÉßDËßEËßF¨righthere¨´x´Í´y´¤BßH|÷ßRßd}{ßAßqßP¨空气质量¨ßX¨fad fa-atom¨ßRßSßUÉßTÊßt¨μg/m³¨ßCÉßDËßEËßF¨air¨´x´Ë´y´ÐßH|÷}{ßAßqßP´气压´ßX¨fad fa-smoke¨ßRßxßUÉßT¢WGßt¨hPa¨ßCÉßDËßEËßF¨qiya¨´x´Í´y´ÎßH|÷}{ßAßqßP´海拔´ßX¨fad fa-building¨ßRßSßUÉßT¢1Ießt´m´ßCÉßDËßEËßF¨haiba¨´x´Í´y´ÐßH|÷}{ßAßWßX¨fas fa-sun¨ßNÉßP´´ßaßbßCÉßDËßEËßF¨weather¨´x´Ï´y´ÎßH|÷ßRß11ßMÉ}{ßAßWßX¨fad fa-wind¨ßNÉßP´3´ßaßbßCÉßDËßEËßF¨wind¨´x´Ï´y´ÐßH|÷ßRß16}{ßAßWßX¨fad fa-signal¨ßNÉßP´00´ßaßbßCÉßDËßEËßF¨wifipower¨´x´Ï´y´ÒßH|÷}{ßAßWßX¨fad fa-redo-alt¨ßNÉßP´´ßaßbßCÉßDËßEËßF¨rst¨´x´Í´y´¤FßH|÷}{ßAßWßX¨fad fa-power-off¨ßNÊßPß18ßaßbßCÉßDËßEËßF¨lowpower¨´x´Ï´y´¤FßH|÷}÷¨actions¨|÷¨triggers¨|÷}

3、arduino mega2560控制小车

#include <Wire.h> #include<DHT.h> //传感器库文件#include <SPI.h>#include <math.h>#include <Adafruit_Sensor.h>#include <Adafruit_BMP280.h>#define DHTTYPE DHT22#define DHTPIN 50#define BMP_SCK 47 #define BMP_MISO 49#define BMP_MOSI 46 #define BMP_CS 48float ser[6];String mes="SX";//起始位与填充位int count=0;DHT dht(DHTPIN, DHTTYPE);//温湿度Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK); //气压int measurePin = A14; //粉尘 int ledPower = 22; //粉尘 int BH1750address = 0x23; byte buff[2];//光 uint16_t val_lux = 0; //光unsigned int samplingTime = 280;//粉尘unsigned int deltaTime = 40;//粉尘unsigned int sleepTime = 9680;//粉尘float voMeasured = 0;//粉尘float calcVoltage = 0;//粉尘float dustDensity = 0;//粉尘int flag=0;//判断是否要读取int BH1750_Read(int address) {int i = 0;Wire.beginTransmission(address);Wire.requestFrom(address, 2);while (Wire.available()){buff[i] = Wire.read(); // receive one bytei++;}Wire.endTransmission();return i;}//电机控制端口设置//前轮int speedp1 = 5;//定义EA(PWM调速)接口int in1 = 26;//连接L298N,控制电机 int in2 = 27;//连接L298N,控制电机int in3 =28;//连接L298N,控制电机int in4 = 29;//连接L298N,控制电机int speedp2 = 4;//定义EB(PWM调速)接口//后轮int speedp3 = 3;//定义EA(PWM调速)接口int in5 = 42;//连接L298N,控制电机 int in6 = 43;//连接L298N,控制电机int in7 = 44;//连接L298N,控制电机int in8 = 45;//连接L298N,控制电机int speedp4 = 2;//定义EB(PWM调速)接口//速度容器char value = 120;//最大200String ch;//停止void carstop(){analogWrite(speedp1,value);//输入模拟值进行设定速度analogWrite(speedp2,value);analogWrite(speedp3,value);analogWrite(speedp4,value);digitalWrite(in1,LOW);digitalWrite(in2,LOW);digitalWrite(in3,LOW);digitalWrite(in4,LOW);digitalWrite(in5,LOW);digitalWrite(in6,LOW);digitalWrite(in7,LOW);digitalWrite(in8,LOW);}//前void cargo(){analogWrite(speedp1,value);//输入模拟值进行设定速度analogWrite(speedp2,value);analogWrite(speedp3,value);analogWrite(speedp4,value);digitalWrite(in1,HIGH);//正digitalWrite(in2,LOW);digitalWrite(in3,LOW);digitalWrite(in4,HIGH);digitalWrite(in5,LOW);digitalWrite(in6,HIGH);digitalWrite(in7,HIGH);digitalWrite(in8,LOW);}//后void carback(){analogWrite(speedp1,value);//输入模拟值进行设定速度analogWrite(speedp2,value);analogWrite(speedp3,value);analogWrite(speedp4,value);digitalWrite(in1,LOW);digitalWrite(in2,HIGH);digitalWrite(in3,HIGH);digitalWrite(in4,LOW);digitalWrite(in5,HIGH);digitalWrite(in6,LOW);digitalWrite(in7,LOW);digitalWrite(in8,HIGH);}//左void carleft(){analogWrite(speedp1,value);//输入模拟值进行设定速度analogWrite(speedp2,value);analogWrite(speedp3,value);analogWrite(speedp4,value);digitalWrite(in1,HIGH);digitalWrite(in2,LOW);digitalWrite(in3,LOW);digitalWrite(in4,LOW);digitalWrite(in5,LOW);digitalWrite(in6,HIGH);digitalWrite(in7,LOW);digitalWrite(in8,LOW);}//右void carright(){analogWrite(speedp1,value);//输入模拟值进行设定速度analogWrite(speedp2,value);analogWrite(speedp3,value);analogWrite(speedp4,value);digitalWrite(in1,LOW);digitalWrite(in2,LOW);digitalWrite(in3,LOW);digitalWrite(in4,HIGH);digitalWrite(in5,LOW);digitalWrite(in6,LOW);digitalWrite(in7,HIGH);digitalWrite(in8,LOW);}//原地右转void carrighthere(){analogWrite(speedp1,value);//输入模拟值进行设定速度analogWrite(speedp2,value);analogWrite(speedp3,value);analogWrite(speedp4,value);digitalWrite(in1,LOW);digitalWrite(in2,HIGH);digitalWrite(in3,LOW);digitalWrite(in4,HIGH);digitalWrite(in5,HIGH);digitalWrite(in6,LOW);digitalWrite(in7,HIGH);digitalWrite(in8,LOW);}//原地左转void carlefthere(){analogWrite(speedp1,value);//输入模拟值进行设定速度analogWrite(speedp2,value);analogWrite(speedp3,value);analogWrite(speedp4,value);digitalWrite(in1,HIGH);//正digitalWrite(in2,LOW);digitalWrite(in3,HIGH);digitalWrite(in4,LOW);digitalWrite(in5,LOW);digitalWrite(in6,HIGH);digitalWrite(in7,LOW);digitalWrite(in8,HIGH);}void setup(){//设置控制电机的各端口为输出模式 pinMode(in1, OUTPUT); pinMode(in2, OUTPUT);pinMode(in3, OUTPUT);pinMode(in4, OUTPUT);pinMode(in5, OUTPUT); pinMode(in6, OUTPUT);pinMode(in7, OUTPUT);pinMode(in8, OUTPUT);pinMode(speedp1,OUTPUT);pinMode(speedp2,OUTPUT);pinMode(speedp3,OUTPUT);pinMode(speedp4,OUTPUT);Serial2.begin(115200);//设置波特率为115200bpsSerial.begin(115200);dht.begin();bmp.begin();Wire.begin();Wire.beginTransmission(BH1750address);Wire.write(0x10);Wire.endTransmission();pinMode(ledPower,OUTPUT);carstop();readnum();}void readnum(){float val=0;int tep=0;int hum=0;int Pressure=0;int Altitude=0;digitalWrite(ledPower,LOW);delayMicroseconds(samplingTime);voMeasured = analogRead(measurePin);delayMicroseconds(deltaTime);digitalWrite(ledPower,HIGH);delayMicroseconds(sleepTime);calcVoltage = voMeasured*(5.0/1024);dustDensity = 0.17*calcVoltage-0.1;if ( dustDensity < 0){dustDensity = 0.00;}if (2 == BH1750_Read(BH1750address)){if (buff[0] == 255 && buff[1] == 255){val = 65535;} else {val = ((buff[0] << 8) | buff[1]) / 1.2; //芯片手册中规定的数值计算方式}}//温度 湿度 粉尘 气压 海拔 光强ser[0]=(float)dht.readTemperature();ser[1]=(float)dht.readHumidity();ser[2]=dustDensity;ser[3]=bmp.readPressure()/100;ser[4]=bmp.readAltitude(1030);ser[5]=val;}void sendnum(){for(int i=0;i<=5;i++){mes+=String(ser[i]);mes+='N';}mes+='M';char charBuf[50];mes.toCharArray(charBuf, 50);Serial2.print(charBuf);mes="SX";}void loop(){count+=1;if(count==1000){readnum();count=0;}if (Serial2.available()>0){ch = char(Serial2.read());ch.trim();delay(2); if (ch.length() > 0) {if(ch=="A"){cargo();}else if(ch=="B"){carleft();}else if(ch=="C"){carright();}else if(ch=="D"){carback();}else if(ch=="E"){carlefthere();}else if(ch=="F"){carrighthere();}else if(ch=="G"){carstop();}else if(ch=="H"){sendnum();}else if(ch=="I"){value = 160;}else if(ch=="J"){value = 200;}else if(ch=="K"){value = 120;}else{ch="";}// 输出信息Serial2.end();Serial2.begin(115200);ch="";}}else{ch="";}}

4、esp32cam做传输中介

#define BLINKER_WIFI#define BLINKER_MIOT_SENSOR #include <Blinker.h>//已包含arduinojson#include "ESP32_CAM_SERVER.h"#define Slider_1 "Slider1"#define NUM_1 "hum"#define NUM_2 "tep"#define NUM_3 "light"#define NUM_4 "air"#define NUM_5 "qiya"#define NUM_6 "haiba"#define BUTTON_1 "go"#define BUTTON_2 "left"#define BUTTON_3 "right"#define BUTTON_4 "back"#define BUTTON_5 "stop"#define BUTTON_6 "led"#define BUTTON_7 "lefthere"#define BUTTON_8 "righthere"#define BUTTON_9 "wifipower"#define BUTTON_10 "weather"#define BUTTON_11 "wind"#define BUTTON_12 "rst"#define Slider_1 "sudu"#define TEXTE_1 "decision"const int led = 4;char auth[] = "fa4xxxxxx37d";char ssid[] = "HUAWEI MatePad Pro";char pswd[] = "88888888";char w_addr[]="xuzhoushi";const char* weather_txt;const char* wind_txt;const char* power_txt;float h,t,l,a,q,hai=0;boolean state_s = 0;char ss1[10];char ss2[10];char ss3[10];char ss4[10];char ss5[10];char ss6[10];bool setup_camera = false;BlinkerNumber NUM1(NUM_1);BlinkerNumber NUM2(NUM_2);BlinkerNumber NUM3(NUM_3);BlinkerNumber NUM4(NUM_4);BlinkerNumber NUM5(NUM_5);BlinkerNumber NUM6(NUM_6);BlinkerSlider Slider1(Slider_1);BlinkerButton Button1(BUTTON_1);BlinkerButton Button2(BUTTON_2);BlinkerButton Button3(BUTTON_3);BlinkerButton Button4(BUTTON_4);BlinkerButton Button5(BUTTON_5);BlinkerButton Button6(BUTTON_6);BlinkerButton Button7(BUTTON_7);BlinkerButton Button8(BUTTON_8);BlinkerButton Button9(BUTTON_9);BlinkerButton Button10(BUTTON_10);BlinkerButton Button11(BUTTON_11);BlinkerButton Button12(BUTTON_12);BlinkerText Text1(TEXTE_1);void miotQuery(int32_t queryCode)//小爱同学语音命令反馈{BLINKER_LOG("MIOT Query codes: ", queryCode);int humi_read_int=h;//去掉湿度浮点int temp_read_int=t; BlinkerMIOT.humi(humi_read_int);//小爱接收湿度BlinkerMIOT.temp(temp_read_int);//小爱接收温度BlinkerMIOT.print();}void slider1_callback(int32_t value){if(value==1)Serial.print('K');if(value==2)Serial.print('I');if(value==3)Serial.print('J');}void button1_callback(const String & state) {if(state=="press"){Serial.print('A');}if(state=="tap"){Serial.print('A'); } if(state=="pressup"){Serial.print('G'); } }void button2_callback(const String & state) {if(state=="press"){Serial.print('B');}if(state=="tap"){Serial.print('B'); } if(state=="pressup"){Serial.print('G'); } }void button3_callback(const String & state) {if(state=="press"){Serial.print('C');}if(state=="tap"){Serial.print('C'); } if(state=="pressup"){Serial.print('G'); } }void button4_callback(const String & state) {if(state=="press"){Serial.print('D');}if(state=="tap"){Serial.print('D'); } if(state=="pressup"){Serial.print('G'); }}void button5_callback(const String & state) {if(state=="press"){Serial.print('G');}if(state=="tap"){Serial.print('G');} if(state=="pressup"){Serial.print('G'); } }void button6_callback(const String & state) {if(state=="on"){digitalWrite(led,HIGH);Button6.print("on"); }if(state=="off"){digitalWrite(led,LOW);Button6.print("off"); } }void button7_callback(const String & state) {if(state=="press"){Serial.print('E');}if(state=="tap"){Serial.print('E'); } if(state=="pressup"){Serial.print('G'); }}void button8_callback(const String & state) {if(state=="press"){Serial.print('F');}if(state=="tap"){Serial.print('F'); } if(state=="pressup"){Serial.print('G'); }}void button9_callback(const String & state) {if(state=="tap"){Button9.text(String(WiFi.RSSI()));Button9.print();} }void button10_callback(const String & state){if(state=="tap"){Blinker.weather(320312);}}void button11_callback(const String & state){if(state=="tap"){Blinker.weather(320312);}}void button12_callback(const String & state){char ch;if(state=="tap"){Serial.print('H');delay(100);if (Serial.available()>0){ch=Serial.read();if(state_s==0){if(ch=='S'){state_s=1;}}else{Serial.readBytesUntil('N',ss1,10);Serial.readBytesUntil('N',ss2,10);Serial.readBytesUntil('N',ss3,10);Serial.readBytesUntil('N',ss4,10);Serial.readBytesUntil('N',ss5,10);Serial.readBytesUntil('N',ss6,10);ch=Serial.read();if(ch=='M'){state_s=0;}}}//给htlaq等赋值h=atof(ss2);t=atof(ss1);l=atof(ss6);a=atof(ss3);q=atof(ss4);hai=atof(ss5);if(hai<30)TEXTE_1.print("压降");NUM1.print(h);NUM2.print(t);NUM3.print(l);NUM4.print(a);NUM5.print(q);NUM6.print(hai);}}/*void heartbeat(){NUM1.print(h);NUM2.print(t);NUM3.print(l);NUM4.print(a);NUM5.print(q);NUM6.print(hai);//Blinker.weather(w_addr);}*/void weatherData(const String & data){BLINKER_LOG("weather: ", data);StaticJsonDocument<400> doc;DeserializationError error = deserializeJson(doc, data);if (error){Serial.print("ERROR IS:");Serial.println(error.c_str());return;}weather_txt = doc["weather"]; // ""wind_txt=doc["wind"]; power_txt=doc["power"];String wind=String(wind_txt)+String(power_txt);Button11.text(wind);Button11.print();if(String(weather_txt)=="阴"){Button10.icon("fas fa-cloud");Button10.print();}if(String(weather_txt)=="晴"){Button10.icon("fas fa-sun");Button10.print();}if(String(weather_txt)=="多云"){Button10.icon("fas fa-clouds");Button10.print();}}void dataRead(const String & data){BLINKER_LOG("Blinker readString: ", data);Blinker.vibrate();uint32_t BlinkerTime = millis();Blinker.printObject("video", "{\"str\":\"mjpg\",\"url\":\"http:"+ String(WiFi.localIP()) + "\"}");}void setup(){pinMode(led,OUTPUT);Serial.begin(115200);//BLINKER_DEBUG.stream(Serial);//在串口开启调试模式pinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, LOW);Blinker.begin(auth,ssid,pswd);Blinker.attachData(dataRead);Blinker.attachWeather(weatherData); Button1.attach(button1_callback);Button2.attach(button2_callback);Button3.attach(button3_callback);Button4.attach(button4_callback);Button5.attach(button5_callback);Button6.attach(button6_callback);Button7.attach(button7_callback);Button8.attach(button8_callback);Button9.attach(button9_callback);Button10.attach(button10_callback);Button11.attach(button11_callback);Button12.attach(button12_callback);Slider1.attach(slider1_callback);BlinkerMIOT.attachQuery(miotQuery);//Blinker.attachHeartbeat(heartbeat);}void loop(){Blinker.run();if (Blinker.connected() && !setup_camera){setupCamera();setup_camera = true;Blinker.printObject("video", "{\"str\":\"mjpg\",\"url\":\"http://"+ WiFi.localIP().toString() + "\"}");}}

5、代码分析(更新中)

5.1、车辆控制

这个代码从51单片机改的,O(∩_∩)O哈哈~,不得不说学习51单片机还是很有作用。

以令车辆暂停的代码为例

void carstop(){analogWrite(speedp1,value);//对使能端进行pwm输出,arduino将pwm输出封装在 analogWrite()analogWrite(speedp2,value);analogWrite(speedp3,value);analogWrite(speedp4,value);digitalWrite(in1,LOW);//对逻辑输入进行改变,如四个输入都为0时,L298n输出A和B停止供电digitalWrite(in2,LOW);digitalWrite(in3,LOW);digitalWrite(in4,LOW);digitalWrite(in5,LOW);digitalWrite(in6,LOW);digitalWrite(in7,LOW);digitalWrite(in8,LOW);}

5.2、bh1750光线强度传感器

这个其实也是在csdn是摘的,感谢其他博主的分享。

int BH1750_Read(int address) {int i = 0;Wire.beginTransmission(address);//Arduino mega2560与bh1750是IIC协议进行通信Wire.requestFrom(address, 2);while (Wire.available()){buff[i] = Wire.read(); i++;}Wire.endTransmission();return i;}if (2 == BH1750_Read(BH1750address)){if (buff[0] == 255 && buff[1] == 255){val = 65535;} else {val = ((buff[0] << 8) | buff[1]) / 1.2; //按芯片手册中规定的数值计算方式进行计算}}

5.3、dht22温湿度传感器

dht.readTemperature();//封装在dht库中的函数,返回值是温度的数值dht.readHumidity();//返回湿度的数值

5.4、BMP280

开头处要插入这个,因为这是SPI协议进行通信的

Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK); //气压

bmp.readPressure()/100;//调用封装在bmp280库中的函数返回此时的气压值bmp.readAltitude(1030);//用气压反推海拔,参数是本地的海平面气压值,该值会随天气改变

5.5、GP2Y1010AU0F

连线和代码参考csdn博主凌顺实验室,ledpower就是控制红外线灯的端口

digitalWrite(ledPower,LOW);delayMicroseconds(samplingTime);voMeasured = analogRead(measurePin);delayMicroseconds(deltaTime);digitalWrite(ledPower,HIGH);delayMicroseconds(sleepTime);calcVoltage = voMeasured*(5.0/1024);dustDensity = 0.17*calcVoltage-0.1;if ( dustDensity < 0){dustDensity = 0.00;}

5.6、小爱同学查询温湿度

细节是只能返回int类型,而且必须在短时间类反馈,不然就会查询失败。

这里我只查询温湿度,所以也不要管queryCode了,如果有其他功能可以用switch选择一下

void miotQuery(int32_t queryCode)//小爱同学语音命令反馈回调函数{BLINKER_LOG("MIOT Query codes: ", queryCode);int humi_read_int=h;//去掉湿度浮点int temp_read_int=t; BlinkerMIOT.humi(humi_read_int);//小爱接收湿度BlinkerMIOT.temp(temp_read_int);//小爱接收温度BlinkerMIOT.print();}

BlinkerMIOT.attachQuery(miotQuery);//开局注册一下

5.7、esp32与arduino mega2560之间的通信

为了简单方便直接使用了串行通信,也是踩了很多坑

采用了一个数组来暂存传感器数据,也是方便记忆数据位置

ser[0]=(float)dht.readTemperature();ser[1]=(float)dht.readHumidity();ser[2]=dustDensity;ser[3]=bmp.readPressure()/100;ser[4]=bmp.readAltitude(1030);ser[5]=val;}

传输时把数组转换成规定格式的字符串,其实是借用了一点ip包的灵感

大概是组成类似SX1.11N1.12N1.13N1.14N1.15N1.16NM的字符串

以sx作为字符串开始标志,N为每一个数据结束标志,M为整组数据结束标志,弄成一个字符串有什么好处呢,方便校验,特别是对精度有要求的时候,不过我没有弄校验的事情,没时间弄了。

这里至于串口print函数的细节就不说了,还是建议直接看官方文档和直接实验,书上说的不全或模棱两可,这里我是把字符串转换为字符数组进行发送。

void sendnum(){for(int i=0;i<=5;i++){mes+=String(ser[i]);mes+='N';}mes+='M';char charBuf[50];mes.toCharArray(charBuf, 50);Serial2.print(charBuf);mes="SX";}

而esp32在接收数据时用了这么一个解析方法,当我接收到串口数据,read()从缓冲区每次只读取一个字节,其实出bug的时候怀疑过缓冲区大小不够,其实对于我这几个数是够的,不过不够也可以改。我对读取的字节进行判断,如果是S,我将我设置的信号量state_s从0改为1,(我觉得这里应该还要设置临界段的,不过我这个压根没设置中断哈哈),表示进入了接收,这个信号量是有用的,如果有其他的扩展这里是有用的(强行说有用,其实已经不记得有啥用了)。

这里有个细节,经过查询和实验这似乎是read函数的细节,在读取S的时候,其实下一字节已经压入可能是其他缓存吧,如果我继续使用read就没事,但是由于我后面要改用readBytesUntil()函数,这个细节表现出来就是我会被吞一位数据,所以我在字符串中填充了“X”来处理这个数据,就是拿来被吞的。

readBytesUntil()很有用,效果是冲缓冲区读取,读取到指定字符为止存入字符串,那个字符也不会存入字符串,完美符合我的需求,后续将atof()把字符串转换为数字,一是可以传输给手机应用上的组件,二是可以进行一些运算。

最后读取一下字符,是M就把state_s设为0,就结束了读取数据。

void button12_callback(const String & state){char ch;if(state=="tap"){Serial.print('H');delay(100);if (Serial.available()>0){ch=Serial.read();if(state_s==0){if(ch=='S'){state_s=1;}}else{Serial.readBytesUntil('N',ss1,10);Serial.readBytesUntil('N',ss2,10);Serial.readBytesUntil('N',ss3,10);Serial.readBytesUntil('N',ss4,10);Serial.readBytesUntil('N',ss5,10);Serial.readBytesUntil('N',ss6,10);ch=Serial.read();if(ch=='M'){state_s=0;}}}//给htlaq等赋值h=atof(ss2);t=atof(ss1);l=atof(ss6);a=atof(ss3);q=atof(ss4);hai=atof(ss5);if(hai<30)TEXTE_1.print("压降");NUM1.print(h);NUM2.print(t);NUM3.print(l);NUM4.print(a);NUM5.print(q);NUM6.print(hai);}}

5.8、blinker手机端控制设备

思路是这样,我在手机上点击某个组件,比如一个按钮,我在手机上点击之后,会发送一个信号(局域网通信/mqtt协议通信),调用相应组件的回调函数,在我们的代码中需要注册回调函数,可以看官方文档,我在回调函数中做了这样的设置,以车辆控制的按键为例,我按下按钮就会让esp32给mega2560发送字符‘F’。

void button8_callback(const String & state) {if(state=="press"){Serial.print('F');}if(state=="tap"){Serial.print('F'); } if(state=="pressup"){Serial.print('G'); }}

5.9、查询天气(json解析)

查询天气看了太极创客的教程,参考了一些代码,这里为了方便直接用了blinker提供的接口,这个接口直接调用函数就行了

void weatherData(const String & data){BLINKER_LOG("weather: ", data);StaticJsonDocument<400> doc;//建立对象DeserializationError error = deserializeJson(doc, data);//反序列if (error){Serial.print("ERROR IS:");Serial.println(error.c_str());return;}weather_txt = doc["weather"]; // 分离json中的数据wind_txt=doc["wind"]; power_txt=doc["power"];String wind=String(wind_txt)+String(power_txt);Button11.text(wind);Button11.print();if(String(weather_txt)=="阴"){Button10.icon("fas fa-cloud");Button10.print();}if(String(weather_txt)=="晴"){Button10.icon("fas fa-sun");Button10.print();}if(String(weather_txt)=="多云"){Button10.icon("fas fa-clouds");Button10.print();}}

6、内网穿透

利用飞鸽软件进行内网穿透,可以实现远程查看视频,只有摄像头是在内网的,其他功能无需内网穿透也能用。

6、运行效果

二、blinker开发的天气时钟

1、物品准备

esp32,1.54寸st7789驱动屏幕,dht22,type-C数据线一根,几根杜邦线

2、代码

#include <TFT_eSPI.h> // Hardware-specific library#include <SPI.h>#include <DHT.h>#define DHTPIN 14#define DHTTYPE DHT11DHT dht(DHTPIN, DHTTYPE); int humi_read = 0, temp_read = 0;int num =800;TFT_eSPI tft = TFT_eSPI(); // Invoke custom library#define BLINKER_WIFI#include <Blinker.h>//已包含arduinojsonchar auth[] = "0dcxxxxxxabb";char ssid[] = "HUAWEI MatePad Pro";char pswd[] = "88888888";char w_addr[]="xuzhoushi";const char* weather_txt;boolean flag = 0;String timestr ="";String monstr ="";String daystr ="";String secstr ="";String hourstr ="";String minstr ="";String weatherstr ="W";String tepstr="TEP:66";String humstr="HUM:66";int8_t sec1 = 0;int8_t min1 = 0;int8_t hour1 = 0;int8_t wday1 = 0;int8_t mday1 = 0;int8_t month1 = 0;int16_t year1 = 0;void dataRead(const String & data){BLINKER_LOG("Blinker readString: ", data);Blinker.vibrate();uint32_t BlinkerTime = millis();Blinker.print(BlinkerTime);Blinker.print("millis", BlinkerTime);}void timer(){sec1 = Blinker.second();//miaomin1 = Blinker.minute();//fenhour1 = Blinker.hour();//xiaoshiwday1 = Blinker.wday();//zhoujimday1 = Blinker.mday();//rimonth1 = Blinker.month();//yueyear1 = Blinker.year();//niantime_t run_time = Blinker.runTime();if(run_time>60&&run_time<70){flag = 1;}if(sec1<10&&sec1>=0) secstr="0"+String(sec1);else secstr=String(sec1);if(min1<10&&min1>=0) minstr="0"+String(min1);else minstr=String(min1);if(hour1<10&&hour1>=0) hourstr="0"+String(hour1);else hourstr=String(hour1);timestr=hourstr+":"+minstr+":"+secstr;if(month1<10&&month1>=0) monstr=" 0"+String(month1)+"M";else monstr=" "+String(month1)+"M";if(mday1<10&&mday1>=0) daystr=" 0"+String(mday1)+"D";else daystr=" "+String(mday1)+"D";}void weatherData(const String & data){StaticJsonDocument<400> doc;DeserializationError error = deserializeJson(doc, data);if (error){Serial.print("ERROR IS:");Serial.println(error.c_str());return;}weather_txt = doc["weather"]; if(String(weather_txt)=="阴"){weatherstr="C";}if(String(weather_txt)=="晴"){weatherstr="S";}if(String(weather_txt)=="多云"){weatherstr="C";}}void setup() {Blinker.setTimezone(8.0);Serial.begin(115200);Blinker.begin(auth,ssid,pswd);Blinker.attachData(dataRead);Blinker.attachWeather(weatherData);dht.begin();tft.begin();tft.fillScreen(TFT_PINK);tft.setTextSize(2);tft.setTextColor(TFT_BLACK,TFT_PINK);}void showlxy(String year1,String month1,String day1,String time1,String weather1,String TEP,String HUM){tft.setTextSize(5);tft.drawString(year1,5,5);tft.setTextSize(4);tft.drawString(month1,130,5);tft.drawString(day1,130,50);tft.drawString("YEAR",10,50);for(int i=0;i<5;i++){tft.drawFastVLine(125+i,0,85,TFT_BLACK);}for(int i=0;i<5;i++){tft.drawFastHLine(125,42+i,120,TFT_BLACK);}for(int i=0;i<5;i++){tft.drawFastHLine(0,85+i,240,TFT_BLACK);}tft.drawString(time1,25,95);for(int i=0;i<5;i++){tft.drawFastHLine(0,130+i,240,TFT_BLACK);}for(int i=0;i<5;i++){tft.drawFastHLine(0,185+i,160,TFT_BLACK);}for(int i=0;i<5;i++){tft.drawFastVLine(160+i,135,105,TFT_BLACK);}tft.drawString(TEP,10,145);tft.drawString(HUM,10,200);tft.setTextSize(7);tft.drawString(weather1,185,165);}void loop() {Blinker.run();num+=1;if(num==1000){float h = dht.readHumidity();float t = dht.readTemperature();humi_read = h;temp_read = t;num=0;tepstr="TEP:"+String(temp_read);humstr="HUM:"+String(humi_read);}if(flag==1){Blinker.weather(320312);flag=0;}timer();showlxy(String(year1),monstr,daystr,timestr,weatherstr,tepstr,humstr);}

3、TFT_eSPI中的一点设置改动

4、代码分析

4.1、表盘显示(TFT.eSPI的使用)

自己把自定义画表盘的函数都封装起来了,有画横线画竖线的,可以在网上搜索攻略,但最重要的还是自己实验。这个库能很方便的显示字符,英文字母是可以直接输出的,中文字符还要进行一定的处理。

void showlxy(String year1,String month1,String day1,String time1,String weather1,String TEP,String HUM){tft.setTextSize(5);tft.drawString(year1,5,5);tft.setTextSize(4);tft.drawString(month1,130,5);tft.drawString(day1,130,50);tft.drawString("YEAR",10,50);for(int i=0;i<5;i++)//画多条线让线变粗{tft.drawFastVLine(125+i,0,85,TFT_BLACK);}for(int i=0;i<5;i++){tft.drawFastHLine(125,42+i,120,TFT_BLACK);}for(int i=0;i<5;i++){tft.drawFastHLine(0,85+i,240,TFT_BLACK);}tft.drawString(time1,25,95);for(int i=0;i<5;i++){tft.drawFastHLine(0,130+i,240,TFT_BLACK);}for(int i=0;i<5;i++){tft.drawFastHLine(0,185+i,160,TFT_BLACK);}for(int i=0;i<5;i++){tft.drawFastVLine(160+i,135,105,TFT_BLACK);}tft.drawString(TEP,10,145);tft.drawString(HUM,10,200);tft.setTextSize(7);tft.drawString(weather1,185,165);}

4.2、获取blinker时间

细节是一位数时间和两位数时间,要用一个字符来填充,显示在屏幕上的东西不会主动清楚的,每一次更新内容可以理解为对像素点的覆盖,而不是覆盖整个图像。

void timer(){sec1 = Blinker.second();//miaomin1 = Blinker.minute();//fenhour1 = Blinker.hour();//xiaoshiwday1 = Blinker.wday();//zhoujimday1 = Blinker.mday();//rimonth1 = Blinker.month();//yueyear1 = Blinker.year();//niantime_t run_time = Blinker.runTime();if(run_time>60&&run_time<70){flag = 1;}if(sec1<10&&sec1>=0) secstr="0"+String(sec1);else secstr=String(sec1);if(min1<10&&min1>=0) minstr="0"+String(min1);else minstr=String(min1);if(hour1<10&&hour1>=0) hourstr="0"+String(hour1);else hourstr=String(hour1);timestr=hourstr+":"+minstr+":"+secstr;if(month1<10&&month1>=0) monstr=" 0"+String(month1)+"M";else monstr=" "+String(month1)+"M";if(mday1<10&&mday1>=0) daystr=" 0"+String(mday1)+"D";else daystr=" "+String(mday1)+"D";}

4.3、获取天气

获取天气有个细节,因为这个不是按键操控的,一定要设置一个信号量,不然会一直调用,一天只能免费返回20次。

我在timer()中利用blinker里面一个函数,当blinker系统运行时间60-70的时候将信号量调整为1开始查询,这个时间属于是系统一定已经连上网了。

time_t run_time = Blinker.runTime();if(run_time>60&&run_time<70){flag = 1;}

在循环体中

if(flag==1){Blinker.weather(320312);flag=0;}

回调函数和上面小车也没什么区别

void weatherData(const String & data){StaticJsonDocument<400> doc;DeserializationError error = deserializeJson(doc, data);if (error){Serial.print("ERROR IS:");Serial.println(error.c_str());return;}weather_txt = doc["weather"]; if(String(weather_txt)=="阴"){weatherstr="C";}if(String(weather_txt)=="晴"){weatherstr="S";}if(String(weather_txt)=="多云"){weatherstr="C";}}

5、运行效果

总结

细节还是很多,就算绕开底层代码,也有很多需要考虑。

具体实现和解说慢慢更新。

因为做课设报告所以更新了好多,有一些细节已经忘了,但是这个课设还是收获了不少,下一步想做一个mpu6050控制的机械手小车,因为最近学了ucos,所以想实践一下freertos,做点有意思的东西,不知道是在下一个课设做还是暑假在学校休息的时候做。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。