(分享+求助)基于 blinker 应用ESP8266模块通信控制 arduino UNO...-Arduino中文社区 - Powered by Discuz! Archiver

seven571245815 发表于 2020-3-7 12:05

(分享+求助)基于 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 = "";    //清空该值,释放储存
   
    }


求大神指导!!谢谢!!

shrub 发表于 2020-3-13 16:49

使用的时8266-01模块吗?需要拉高某个针脚吧

seven571245815 发表于 2020-3-14 12:18

模块和8266开发板都可以,上传程序按说明操作就可以了

seven571245815 发表于 2020-3-28 18:49

自捅一下希望有人答疑

yondo 发表于 2020-4-3 23:30

楼主好,想请教您一下,第四部分和第五部分的代码是分别下载到esp模块和uno模块,然后烧录成功后,再把两个模块接到一起工作吗?我理解的对吗?另外下载esp的代码时,esp需要和uno板子连接吗

爱酱丶 发表于 2020-4-25 21:53


楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗?

IDPreson 发表于 2020-5-25 17:41

爱酱丶 发表于 2020-4-25 21:53
楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗? ...

不用分别烧录

度我 发表于 2020-8-22 08:52

你用的软串口是esp8266的flash内部引脚,这样可以的吗?

seven113623979 发表于 2021-1-3 10:49

yondo 发表于 2020-4-3 23:30
楼主好,想请教您一下,第四部分和第五部分的代码是分别下载到esp模块和uno模块,然后烧录成功后,再把两个 ...

对的,连接方式参照正文的接线示意图

seven113623979 发表于 2021-1-3 10:53

爱酱丶 发表于 2020-4-25 21:53
楼主你好,想请教您一下,第四第五的代码是分别烧录到ESP8266和UNO板子,然后连起来就能用吗? ...

软件丶硬件分别设置好,重启就可以了
页: [1] 2
查看完整版本: (分享+求助)基于 blinker 应用ESP8266模块通信控制 arduino UNO...