查看: 955|回复: 9

[分享] esp8266+nano软串口通讯(解决引脚不够用的问题)

[复制链接]
  • TA的每日心情
    奋斗
    2019-6-8 11:46
  • 签到天数: 76 天

    [LV.6]常住居民II

    发表于 2019-4-20 18:18 | 显示全部楼层 |阅读模式
    本帖最后由 新手之帆 于 2019-6-11 17:39 编辑

    注:连线要接对。TX-RX RX-TX
    程序里关于软串口的定义是这样的:
    SoftwareSerial SerialA(RX,TX);
    可能很多问题就是接线不正确!
    esp8266才8个GPIO,1个ADC,实在有点少。所以,采用软串口,就可以解决引脚不够用的问题

    而为什么要使用软串口,而不用硬串口呢?这并不是说硬串口不能用,而是硬串口的8266在连接blinker是会发送很多调试信息,而nano获取这些信息需要大量时间,阻塞了程序,所以就采用了软串口。
    还有一点,就是线拔来拔去太麻烦。

    思路大概就是:blinker端按下按键,esp8266收到,再软串口发送特定指令如("LED ON"),NANO端收到(“LED ON”)就执行某个指令。这也是很多使用blinker的人们想要实现的,或因为io太少了,或者是以前的项目要接入物联网,但太麻烦,硬件改来改去,甚至换开发板。

    esp8266端代码
    #define BLINKER_WIFI

    #include <Blinker.h>
    #include<SoftwareSerial.h>
    SoftwareSerial mySerial(13,15);
    char auth[] = "/*你的MQTT密钥*/";
    char ssid[] = "/*wifi名字*/";
    char pswd[] = "/*wifi密码*/";

    #define BUTTON_1 "ButtonKey"

    BlinkerButton Button1(BUTTON_1);

    void button1_callback(const String & state)
    {
    if (state == BLINKER_CMD_ON) {
            BLINKER_LOG("Toggle on!");

            Button1.icon("icon_1");
            Button1.color("#FFFFFF");
            Button1.text("Your button name or describe");
            // Button1.text("Your button name", "describe");
            Button1.print("on");
            mySerial.print("Turn on LED");//程序的关键部分,串口通讯,至于你要发送的内容,不要管,只要在nano方面判断就好
        }
        else if (state == BLINKER_CMD_OFF) {
            BLINKER_LOG("Toggle off!");

            Button1.icon("icon_1");
            Button1.color("#FFFFFF");
            Button1.text("Your button name or describe");
            // Button1.text("Your button name", "describe");
            Button1.print("off");
            mySerial.print("Turn off LED");//程序的关键部分,串口通讯,至于你要发送的内容,不要管,只要在nano方面判断就好
        }
    }

    void dataRead(const String & data)
    {
        BLINKER_LOG("Blinker readString: ", data);

        Blinker.vibrate();

        uint32_t BlinkerTime = millis();
        Blinker.print(BlinkerTime);
        Blinker.print("millis", BlinkerTime);
    }

    void setup()
    {
        Serial.begin(115200);
        BLINKER_DEBUG.stream(Serial);
        mySerial.begin(115200);
        pinMode(LED_BUILTIN, OUTPUT);
        digitalWrite(LED_BUILTIN, LOW);

        Blinker.begin(auth, ssid, pswd);
        Blinker.attachData(dataRead);
        Button1.attach(button1_callback);
    }

    void loop()
    {
        Blinker.run();
    }


    其实就是在例程上做了一些改动。

    nano端代码
    //Nano与esp8266的通讯实验
    #include<SoftwareSerial.h>
    SoftwareSerial mySerial(5,6);
    String Serial_String="";
    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    mySerial.begin(115200);
    pinMode(LED_BUILTIN,OUTPUT);
    }
    void read_string(){
      while(mySerial.available()>0){
      Serial_String+=(char)(mySerial.read());
      delay(2);}
    }
    void loop() {
      // put your main code here, to run repeatedly:
      if(mySerial.available()>0){
        Serial_String="";
        read_string();
      }
       Serial.println(Serial_String);

       if(Serial_String=="Turn on LED")digitalWrite(LED_BUILTIN,1);
        else if(Serial_String=="Turn off LED")digitalWrite(LED_BUILTIN,0);
    }

    注:SoftwareSerial库arduino自带,blinker库在github上搜索arduino-library就可以找到。

    视频演示:
    待到B站审核过时,我再发。



    作者Q3320987642(不要问太基础的问题)


    制作不易,打赏一下我明天杯饮料?
    打赏作者鼓励一下!
  • TA的每日心情
    擦汗
    2019-4-11 23:26
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-4-27 12:00 | 显示全部楼层
    方法不错,我用UNO试试,视频在何处?
  • TA的每日心情
    奋斗
    2019-6-8 11:46
  • 签到天数: 76 天

    [LV.6]常住居民II

     楼主| 发表于 2019-4-27 16:50 | 显示全部楼层
    nyx 发表于 2019-4-27 12:00
    方法不错,我用UNO试试,视频在何处?

    等有手机了再上传
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2019-6-5 23:12 | 显示全部楼层
    有传输数据的例程  和那个arduino传输数字  字符串到esp的例程嘛,也是用的blinker
  • TA的每日心情
    奋斗
    2019-6-8 11:46
  • 签到天数: 76 天

    [LV.6]常住居民II

     楼主| 发表于 2019-6-6 13:09 | 显示全部楼层
    么么 发表于 2019-6-5 23:12
    有传输数据的例程  和那个arduino传输数字  字符串到esp的例程嘛,也是用的blinker ...

    可以自己写
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2019-6-9 16:10 | 显示全部楼层

    嗯嗯,就是我现在的是把那个您现在编的程序改写到arduino里面但是esp得不到反馈   还有就是发送数值的话是不是把那个定义  String  换成   float呢
  • TA的每日心情
    奋斗
    2019-6-8 11:46
  • 签到天数: 76 天

    [LV.6]常住居民II

     楼主| 发表于 2019-6-9 17:34 | 显示全部楼层
    么么 发表于 2019-6-9 16:10
    嗯嗯,就是我现在的是把那个您现在编的程序改写到arduino里面但是esp得不到反馈   还有就是发送数值的话 ...

    具体你发一下代码吧
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2019-6-9 21:36 | 显示全部楼层
    新手之帆 发表于 2019-6-9 17:34
    具体你发一下代码吧

    //这是esp的
    #define BLINKER_WIFI
    #include <Blinker.h>
    #include<SoftwareSerial.h>
    SoftwareSerial mySerialA(D5,D6);

    String Serial_String="";

    char auth[] = "";
    char ssid[] = "momo";
    char pswd[] = "12345678";

    BlinkerButton Button1("btn-gfq");

    void button1_callback(const String & state)
    {
    if (state =="on") {
            BLINKER_LOG("Toggle on!");

            Button1.icon("icon_1");
            Button1.color("#FFFFFF");
            Button1.text("开灯");
            // Button1.text("Your button name", "describe");
            Button1.print("on");
            mySerialA.print("Turn on LED");//程序的关键部分,串口通讯,至于你要发送的内容,不要管,只要在nano方面判断就好
        }
        else if (state =="off") {
            BLINKER_LOG("Toggle off!");

            Button1.icon("icon_1");
            Button1.color("#FFFFFF");
            Button1.text("关灯");
            // Button1.text("Your button name", "describe");
            Button1.print("off");
            mySerialA.print("Turn off LED");//程序的关键部分,串口通讯,至于你要发送的内容,不要管,只要在nano方面判断就好
        }
    }

    void dataRead(const String & data)
    {
        BLINKER_LOG("Blinker readString: ", data);

        Blinker.vibrate();

        uint32_t BlinkerTime = millis();
        Blinker.print(BlinkerTime);
        Blinker.print("millis", BlinkerTime);
    }

    void setup()
    {
        Serial.begin(115200);
        BLINKER_DEBUG.stream(Serial);
        mySerialA.begin(9600);

        pinMode(LED_BUILTIN, OUTPUT);
        digitalWrite(LED_BUILTIN, LOW);

        Blinker.begin(auth, ssid, pswd);
        Blinker.attachData(dataRead);
        Button1.attach(button1_callback);
    }
    void  read_string(){
       if(mySerialA.available()>0){
       Serial_String+=(char)(mySerialA.read());
       delay(2);}
         }

    void loop()
    {
        Blinker.run();
        if(mySerialA.available()>0){
        Serial_String="";
        read_string();
               }

       if(Serial_String=="turn off")     
         {BLINKER_LOG("Button1:","off");
          Button1.print("off");}
    }

    //这是arduino uno的
    #include<SoftwareSerial.h>
    SoftwareSerial mySerialA(5,6);

    String Serial_String="";

    int PIRpin=2;
    int ledpin=12;
    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    mySerialA.begin(9600);
    pinMode(LED_BUILTIN,OUTPUT);

    pinMode(PIRpin,INPUT); //人体红外探测
    pinMode(ledpin,OUTPUT);

    attachInterrupt(0,warning,LOW);
    }
    void read_string(){
      while(mySerialA.available()>0){
      Serial_String+=(char)(mySerialA.read());
      delay(2);
      }
    }
    void loop() {
      // put your main code here, to run repeatedly:
      if(mySerialA.available()>0){
        Serial_String="";
        read_string();
      }
       Serial.println(Serial_String);
       if(Serial_String=="Turn on LED")
        {digitalWrite(LED_BUILTIN,HIGH);
        digitalWrite(12,HIGH);}
        else if(Serial_String=="Turn off LED")
         {digitalWrite(LED_BUILTIN,LOW);
         digitalWrite(12,LOW);
        }
    }
    //中断函数
    void warning(){
      Serial.println("turn off");
      mySerialA.print("turn off");
      digitalWrite(12,LOW);
      }
  • TA的每日心情
    奋斗
    2019-6-8 11:46
  • 签到天数: 76 天

    [LV.6]常住居民II

     楼主| 发表于 2019-6-10 19:24 | 显示全部楼层
    么么 发表于 2019-6-9 21:36
    //这是esp的
    #define BLINKER_WIFI
    #include

    可以说一下程序想要做什么吗
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2019-6-10 22:20 | 显示全部楼层
    新手之帆 发表于 2019-6-10 19:24
    可以说一下程序想要做什么吗

    就是先手机控制灯亮 , 红外感应到之后触发中断函数使得灯灭并将这反馈给esp引起blinker 按键处于关灯状态
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    (三)AT指令开发mqtt    阿里云的mqtt搭建过程
    (三)AT指令开发mqtt
    前两篇介绍了如何去连接MQTT,以及MQTT与TCP协议的关系 本篇讲解一下如何在阿里云上搭
    【项目】基于Arduino Nano的多功能桌面感应垃圾桶
    【项目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感应垃圾桶随着大学生活不断往前迈进,宿舍桌面上的杂物
    【Arduino】37种传感器系列实验(35)---模拟量声音传感器模块
    【Arduino】37种传感器系
    37款传感器模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不
    如何用Arduino制作一支带逗比功能的笔
    如何用Arduino制作一支带
    一年一度的六一儿童节又到啦(划掉)过完啦,这年头谁还不是个宝宝!各位超龄儿童有没
    圆g代码生成
    圆g代码生成
    程序根据设定的参数,自动生成g代码,需要设置圆心坐标,半径,顺圆逆圆等,生成的g代
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表