(分享+求助)基于 blinker 应用ESP8266模块通信控制 arduino UNO...
本帖最后由 seven571245815 于 2020-3-8 10:55 编辑首先本人为典型小白一名,目前也不太了解和掌握透传知识,相关例子找了很久没找到,想分享给大家,本例子方法和编程可能愚笨请各位包容,也希望给我指出让我进步,谢谢!!本例子不单用ESP8266,而增加应用arduino UNO的初衷是想实现的功能太多,ESP8266的端口有点少满足不了。暂时没想到其他好方法,大神们有其他好方面可推荐一下哦。
一.例子思路
思路为:
1.使用 blinker软件发送命令给ESP8266模块;
2.ESP8266模块接收命令并反馈给服务器,同时通过串口输出命令给arduino UNO;
3.arduinoUNO接收命令经过处理,判断来控制arduino UNO相应的针口。
说明:本例子主要应用硬串口和软串口通信的知识,想了解相关知识的话可以打开《arduino程序设计基础》书本了解一下。
二.硬件连接
本例子设定arduino UNO的 D10,D11针口为软串口;D8接了LED灯;
开发板:ESP8266模块 arduino UNO LED灯
RT ----------------------------------------------- D11
TX ------------------------------------------------ D10
GND-----------------------------------------------GND-----------------GND
VCC (这处本人独立供电,没接UNO)----------- 3.3
D8--------------------- +
三.blinker APP设置
本人比较懒,核对了一下跟这位朋友的一样,大家可以参照以下朋友的设置,借用一下
《[分享] 点灯·blinker-1物联网初次尝试-Arduino物联网控制LED灯-零基础篇》
点灯·blinker-1物联网初次尝试-Arduino物联网控制LED灯-零基础篇
https://www.arduino.cn/thread-94081-1-1.html
(出处: Arduino中文社区)
文中《2.3 Arduino程序》之前(不含2.3 Arduino程序)参照设置就行了
四.ESP8266代码解释
应用了软件例子来修改处,可能有多余的语句
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = " ";// 软件密钥
char ssid[] = "wifiToyTest";// 需连接WIFI的名字
char pswd[] = "20150409";// 需连接WIFI的密码
// 新建组件对象
BlinkerButton Button1("btn-abc");
// 按下按键即会执行该函数
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
if (state=="on") {
// 控制8266上的灯为关,可删除该语句
digitalWrite(LED_BUILTIN, LOW);
// 反馈开关状态
Button1.print("on");
// 向打印串口打印ON8的命令代码,传送给UNO
Serial.println("ON8");
} else if(state=="off"){
// 控制8266上的灯为开,可删除该语句
digitalWrite(LED_BUILTIN, HIGH);
// 反馈开关状态
Button1.print("off");
// 向打印串口打印ON8的命令代码,传送给UNO
Serial.println("OFF8");
}
}
void setup()
{
// 初始化串口
Serial.begin(115200);
// 初始化有LED的IO,控制8266上的灯,可删除该语句
pinMode(LED_BUILTIN, OUTPUT);
//控制8266上的灯为开,可删除该语句
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
五.arduino UNO 代码解释
#include<SoftwareSerial.h> //应用软串口代码库
SoftwareSerial softSerial(10,11); //设定UNO的软串口10 is RX11 is tx
void setup()
{
// UNO的硬串口波特率
Serial.begin(9600);
// UNO的软串口波特率
softSerial.begin(115200);
// UNO的软串口启用监听
softSerial.listen();
// UNO的设定D8针口,接LED
pinMode(8,OUTPUT);
}
int i; //分析8266发来命令,储存命令中针口号码
String device_B_String = "";//通过电脑控制UNO串口输入信息,通过软串口传给8266端,本例子暂不需使用,可以删除
String device_A_String = "";//分析8266发来命令,储存命令中字符串,包括针口号码
String device_C_String = "";//分析8266发来命令,储存命令中字符串,不包括针口号码
String ON_String = "ON";//开状态校对值,暂不使用,可以删除
String OFF_String = "OFF";//关状态校对值,可以删除
boolean stringComplete = false; //用于判断8266发来的命令是否发送结束
void loop() {
// 用于预留UNO发送信息给8266的代码,该段落可以删除,不删除也不影响
if (Serial.available()>0)
{
if (Serial.peek()!='\n')
{
device_B_String += (char)Serial.read();
}
else
{
Serial.read();
Serial.print("you said:");
Serial.println(device_B_String);
softSerial.println(device_B_String);
device_B_String = "";
}
}
// 分析8266通过D10,D11软串口发来UNO命令的处理
while(softSerial.available()){ //如果8266通过D10,D11软串口发来命令
char inChar = softSerial.read(); //定义inchar字符为软串口的字符
if(isDigit(inChar)){ //如果inchar字符为数字就逐个储存在device_A_String
device_A_String += inChar;
}
else if (inChar =='\n'){ //如果软串口发来命令结束
i = device_A_String.toInt(); //i等于device_A_String里面的数字部分
Serial.print("device_A_String:");//UNO通过硬串口打印出device_A_String的内容显示在电脑,用于调试
Serial.println(device_A_String);
Serial.print("i:"); //UNO通过硬串口打印出i的内容显示在电脑,用于调试
Serial.println(i);
Serial.print("device_C_String:"); //UNO通过硬串口打印出device_C_String的内容显示在电脑,用于调试
Serial.println(device_C_String);
stringComplete = true; //设定8266发来命令已经完毕
}
else device_C_String += inChar;//如果8266发来命令不是数字的话,就逐个字符储存在device_C_String
}
if(stringComplete){ //如果8266发来命令已经完毕
if(device_C_String.startsWith("ON")){//判断device_C_String字符串以ON开头的话,i端口为高电平,并通过硬串口打印出结果
digitalWrite(i,HIGH);
Serial.println("LEDON");
}
else if(device_C_String.startsWith("OFF")){ //判断device_C_String字符串以OFF开头的话,i端口为高电平,并通过硬串口打印出结果
digitalWrite(i,LOW);
Serial.println("LEDOFF");
}
stringComplete = false; //设定8266没有发来命令
device_A_String = ""; //清空该值,释放储存
device_C_String = ""; //清空该值,释放储存
}
}
通过以上实现通过blinker开关按钮控制arduino UNO板D8针口的状态,其中8266通过给UNO发送“ON8”命令代表8针口高电平,发送“OFF8”命令代表8针口低电平。不明之处可交流,谢谢。解释中可以删除的代码不删除也不影响运转。
六 . 另外,以下为个人的疑问,望大神们解答,为何我修改最后一段代码为以下几种都功能无法实现??????,是有空格符?
if(stringComplete){ //如果8266发来命令已经完毕
if(device_C_String=="ON"){//判断device_C_String字符串以ON开头的话,i端口为高电平,并通过硬串口打印出结果
digitalWrite(i,HIGH);
Serial.println("LEDON");
}
else if(device_C_String=="OFF"){ //判断device_C_String字符串以OFF开头的话,i端口为高电平,并通过硬串口打印出结果
digitalWrite(i,LOW);
Serial.println("LEDOFF");
}
stringComplete = false; //设定8266没有发来命令
device_A_String = ""; //清空该值,释放储存
device_C_String = ""; //清空该值,释放储存
}
}
另外
if(stringComplete){ //如果8266发来命令已经完毕
if(device_C_String.compareTo(ON_String)==0){//判断device_C_String字符串以ON开头的话,i端口为高电平,并通过硬串口打印出结果
digitalWrite(i,HIGH);
Serial.println("LEDON");
}
else if(device_C_String.compareTo(OFF_String)==0){ //判断device_C_String字符串以OFF开头的话,i端口为高电平,并通过硬串口打印出结果
digitalWrite(i,LOW);
Serial.println("LEDOFF");
}
stringComplete = false; //设定8266没有发来命令
device_A_String = ""; //清空该值,释放储存
device_C_String = ""; //清空该值,释放储存
}
求大神指导!!谢谢!!
使用的时8266-01模块吗?需要拉高某个针脚吧 模块和8266开发板都可以,上传程序按说明操作就可以了 自捅一下希望有人答疑 楼主好,想请教您一下,第四部分和第五部分的代码是分别下载到esp模块和uno模块,然后烧录成功后,再把两个模块接到一起工作吗?我理解的对吗?另外下载esp的代码时,esp需要和uno板子连接吗
楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗? 爱酱丶 发表于 2020-4-25 21:53
楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗? ...
不用分别烧录 你用的软串口是esp8266的flash内部引脚,这样可以的吗? yondo 发表于 2020-4-3 23:30
楼主好,想请教您一下,第四部分和第五部分的代码是分别下载到esp模块和uno模块,然后烧录成功后,再把两个 ...
对的,连接方式参照正文的接线示意图 爱酱丶 发表于 2020-4-25 21:53
楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗? ...
软件丶硬件分别设置好,重启就可以了
页:
[1]
2