数码之家

 找回密码
 立即注册
搜索
查看: 10944|回复: 24

[Arduino] 在Arduino中添加ESP8266

[复制链接]
发表于 2019-8-15 08:25:15 | 显示全部楼层 |阅读模式
上次利用ESP8266制作了一个远程遥控开关,但是有朋友说arduino编译文件会有些不懂,比如说在arduino中添加ESP8266开发板,而且程序中用到“aJSON”库;为此特新开一贴教程
本人用的Arduino-IDE版本是1.8.5。
首先打开Arduino-IDE;ESP8266开发板网址:http://arduino.esp8266.com/stable/package_esp8266com_index.json

再在开发板管理器添加ESP8266系列

再选择开发板即可

到这开发板就添加完成,但是如果没安装“aJSON”库的小伙伴是编译不过的;上一个帖子里的附件包含源代码和一个库文件,其实很简单,把库文件整个“aJSON”文件放到你的Arduino安装文件下的“libraries”文件夹内即可

要源码要库文件的伙伴到我上一个帖子:ESP8266远程遥控开关,可联网天猫精灵
如果添加过程中有什么问题可以留言,我会看的,如果没及时回复可以百度,很多教程的!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
家睦 + 20

查看全部打赏

本帖被以下淘专辑推荐:

  • · MCU|主题: 24, 订阅: 18
发表于 2019-8-15 09:17:35 | 显示全部楼层
感觉分享~

有空折腾,现在好像最没有的就是时间啊。。
回复 支持 0 反对 1

使用道具 举报

发表于 2019-8-19 17:21:12 | 显示全部楼层
Arduino严重降低了ESP8266的性能,访问同一个API,速度比AT命令都要慢,更加不用说比用官方SDK开发的了。
回复 支持 反对

使用道具 举报

发表于 2019-11-18 18:16:34 | 显示全部楼层
已经成功上传并微信控制LED,
有个问题,就是如何多路控制,
目前将你程序的io口改到了16
回复 支持 反对

使用道具 举报

发表于 2019-11-19 10:49:31 来自手机浏览器 | 显示全部楼层
记号一下我的始终读不到开发板……编译也老是出错不知道是不是这个问题……先睡觉晚点弄一下
回复 支持 反对

使用道具 举报

发表于 2019-11-19 18:25:09 | 显示全部楼层
楼主的四路代码,保存这里备用
  1. #include <ESP8266WiFi.h>
  2. #include <aJSON.h>
  3. //=============此处必须修该============
  4. String DEVICEID="*****";//你的设备编号==
  5. String APIKEY="*********";//设备密码==
  6. const char* ssid="********";//WiFi名称
  7. const char* password="********";//WiFi密码
  8. //=============此处修改输出端口========
  9. #define OUT1 0//输出控制继电器端口1
  10. #define OUT2 1//输出控制继电器端口2
  11. #define OUT3 2//输出控制继电器端口3
  12. #define OUT4 3//输出控制继电器端口4
  13. //=======================================
  14. unsigned long lastCheckInTime=0;//记录上次报到时间
  15. const unsigned long postingInterval=40000;//每隔40秒向服务器报到一次
  16. const char* host="www.bigiot.net";
  17. const int httpPort=8181;
  18. WiFiClient client;
  19. void setup()
  20. {
  21.   pinMode(OUT1,OUTPUT);//设置输出
  22.   pinMode(OUT2,OUTPUT);//设置输出
  23.   pinMode(OUT3,OUTPUT);//设置输出
  24.   pinMode(OUT4,OUTPUT);//设置输出
  25.   //上电端口默认输出低电平,想输出高电平自己把相应端口改成 HIGH
  26.   digitalWrite(OUT1,LOW);//上电打开输出
  27.   digitalWrite(OUT2,LOW);//上电打开输出
  28.   digitalWrite(OUT3,LOW);//上电打开输出
  29.   digitalWrite(OUT4,LOW);//上电打开输出
  30.   pinMode(LED_BUILTIN,OUTPUT);//设备板载LED输出模式
  31.   digitalWrite(LED_BUILTIN,HIGH);//关闭LED
  32.   Serial.begin(115200);
  33.   Serial.println();
  34.   Serial.println();
  35.   WiFi.begin(ssid,password);//连接WiFi  
  36.   while(WiFi.status()!= WL_CONNECTED)//等待WiFi连接成功
  37.   {
  38.     delay(500);
  39.     Serial.print(".");//连不上WiFi就一直串口输出打印"......"
  40.   }
  41.   Serial.println();
  42. }
  43. void loop()
  44. {  
  45.   // Use WiFiClient class to create TCP connections
  46.   if(!client.connected())
  47.   {
  48.     if(!client.connect(host, httpPort))
  49.     {
  50.       Serial.println("connection failed");
  51.       delay(5000);
  52.       return;
  53.     }
  54.   }
  55.   if(millis()-lastCheckInTime>postingInterval||lastCheckInTime==0)
  56.     checkIn();
  57.   
  58.   // Read all the lines of the reply from server and print them to Serial
  59.   if (client.available())
  60.   {
  61.     String inputString=client.readStringUntil('\n');
  62.     inputString.trim();
  63.     Serial.println(inputString);
  64.     int len=inputString.length()+1;
  65.     if(inputString.startsWith("{") && inputString.endsWith("}"))
  66.     {
  67.       char jsonString[len];
  68.       inputString.toCharArray(jsonString,len);
  69.       aJsonObject *msg = aJson.parse(jsonString);
  70.       processMessage(msg);
  71.       aJson.deleteItem(msg);         
  72.     }
  73.   }
  74. }
  75. void processMessage(aJsonObject *msg)
  76. {
  77.   aJsonObject* method=aJson.getObjectItem(msg,"M");
  78.   aJsonObject* content=aJson.getObjectItem(msg,"C");     
  79.   aJsonObject* client_id=aJson.getObjectItem(msg,"ID");
  80.   if(!method)
  81.     return;
  82.   String M=method->valuestring;
  83.   if(M=="say")
  84.   {  
  85.     String C=content->valuestring;
  86.     String F_C_ID=client_id->valuestring;
  87.     digitalWrite(LED_BUILTIN,LOW);//接收到指令就闪一下LED
  88.     delay(50);
  89.     digitalWrite(LED_BUILTIN,HIGH);
  90.     //全部控制
  91.     if(C=="offon")//接收到的是全开指令
  92.     {
  93.       digitalWrite(OUT1,LOW);//打开
  94.       digitalWrite(OUT2,LOW);//打开
  95.       digitalWrite(OUT3,LOW);//打开
  96.       digitalWrite(OUT4,LOW);//打开
  97.       sayToClient(F_C_ID,"LED All on!");   
  98.     }
  99.     if(C=="stop")//接收到的是全关指令
  100.     {
  101.       digitalWrite(OUT1,HIGH);//关闭
  102.       digitalWrite(OUT2,HIGH);//关闭
  103.       digitalWrite(OUT3,HIGH);//关闭
  104.       digitalWrite(OUT4,HIGH);//关闭
  105.       sayToClient(F_C_ID,"LED All off!");//向后台发送回复
  106.     }   
  107.     //第一路
  108.     if(C=="minus")//接收到的是1路开指令
  109.     {
  110.       digitalWrite(OUT1,LOW);//打开
  111.       sayToClient(F_C_ID,"LED1 on!");   
  112.     }
  113.     if(C=="plus")//接收到的是1路关指令
  114.     {
  115.       digitalWrite(OUT1,HIGH);//关闭
  116.       sayToClient(F_C_ID,"LED1 off!");   
  117.     }
  118.     //第二路
  119.     if(C=="left")//接收到的是2路开指令
  120.     {
  121.       digitalWrite(OUT2,LOW);//打开
  122.       sayToClient(F_C_ID,"LED2 on!");   
  123.     }
  124.     if(C=="right")//接收到的是2路关指令
  125.     {
  126.       digitalWrite(OUT2,HIGH);//关闭
  127.       sayToClient(F_C_ID,"LED2 off!");   
  128.     }
  129.     //第三路
  130.     if(C=="backward")//接收到的是3路开指令
  131.     {
  132.       digitalWrite(OUT3,LOW);//打开
  133.       sayToClient(F_C_ID,"LED3 on!");   
  134.     }
  135.     if(C=="forward")//接收到的是3路关指令
  136.     {
  137.       digitalWrite(OUT3,HIGH);//关闭
  138.       sayToClient(F_C_ID,"LED3 off!");   
  139.     }
  140.     //第四路
  141.     if(C=="up")//接收到的是1路开指令
  142.     {
  143.       digitalWrite(OUT4,LOW);//打开
  144.       sayToClient(F_C_ID,"LED4 on!");   
  145.     }
  146.     if(C=="down")//接收到的是1路开指令
  147.     {
  148.       digitalWrite(OUT4,HIGH);//关闭
  149.       sayToClient(F_C_ID,"LED4 off!");   
  150.     }
  151.   }
  152. }
  153. void checkIn()
  154. {
  155.   String msg="{"M":"checkin","ID":"" + DEVICEID + "","K":"" + APIKEY + ""}\n";
  156.   client.print(msg);
  157.   lastCheckInTime=millis();
  158. }
  159. void sayToClient(String client_id, String content)
  160. {
  161.   String msg="{"M":"say","ID":"" + client_id + "","C":"" + content + ""}\n";
  162.   client.print(msg);
  163.   lastCheckInTime=millis();
  164. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-20 20:06:46 | 显示全部楼层
触景情伤 发表于 2019-11-19 10:49
记号一下我的始终读不到开发板……编译也老是出错不知道是不是这个问题……先睡觉晚点弄一下 ...

开发板添加不成功是编译不过去的,还有添加库文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-20 20:08:18 | 显示全部楼层
28674500 发表于 2019-11-19 18:25
楼主的四路代码,保存这里备用

if(C=="offon")//接收到的是全开指令
这里要改成: if(C=="offOn")//接收到的是全开指令
大小写错误
回复 支持 反对

使用道具 举报

发表于 2019-11-20 20:19:11 | 显示全部楼层
netbeetle 发表于 2019-8-19 17:21
Arduino严重降低了ESP8266的性能,访问同一个API,速度比AT命令都要慢,更加不用说比用官方SDK开发的了。 ...

那有比较过Arduino、NodeMcu、MicroPython三者的性能吗?
回复 支持 反对

使用道具 举报

发表于 2019-11-21 14:51:16 | 显示全部楼层
mengfc 发表于 2019-11-20 20:19
那有比较过Arduino、NodeMcu、MicroPython三者的性能吗?

同样的功能肯定比nodemcu快,之前用8266直接刷595显示时钟,nodemcu的delay怎么小,只要多跑几行程序就有一点点闪烁,换到arduino就完全没问题。至于上面说比直接调用api慢好多,估计是arduino的某些功能实现没用8266的api功能而是自己通用化做了一次,这种有可能会慢。否则同样的c++算法控制gpio,怎么会有速度差异。
回复 支持 反对

使用道具 举报

发表于 2019-11-21 15:48:38 | 显示全部楼层
arduino库下载  极慢。。。。有没有好一点的办法。。
回复 支持 反对

使用道具 举报

发表于 2019-11-21 21:41:38 | 显示全部楼层
netbeetle 发表于 2019-8-19 17:21
Arduino严重降低了ESP8266的性能,访问同一个API,速度比AT命令都要慢,更加不用说比用官方SDK开发的了。 ...

怎么也抵不过方便啊。

我从Arduino Nano开始用,后来转ESP8266, 再到现在用ESP32, 环境不变。代码通用,很爽的。

就是编译时间成倍增长,Nano就几秒,8266要1-2分钟,32要7-8分钟,真要受不了了。
回复 支持 反对

使用道具 举报

发表于 2019-11-22 10:50:22 | 显示全部楼层
spirndai 发表于 2019-11-21 14:51
同样的功能肯定比nodemcu快,之前用8266直接刷595显示时钟,nodemcu的delay怎么小,只要多跑几行程序就有 ...

比如访问一个天气的API,就会发现SDK和Arduino速度上的巨大差距,用官方RTOS_SDK 开发的几乎是在访问命令发出的同时就能获得API服务器返回的数据。Arduino至少得等上1~2秒。另外ESP8266的Arduino的好像是不支持定时器硬件中断的,这带来个严重问题,就是红外遥控。虽然有个红外遥控的库,但是那个库的键码是错误的,而且代码量多了后,这个库就挂了。为题还很多,最近做了个ESP自驱VFD时钟总结出来,开始就是用Arduino写的,光时钟显示问题是不大的。但做到后面功能部分,比如SSID扫描,Wifi密码设置后,太困难了(通过复杂的标识设置,应该也能完成,但是太复杂了),放弃了,改用官方RTOS_SDK 做了。光熟悉这个SDK是怎么设置和工作的,我都用了2个晚上(业余的没办法),但是一旦上手后,一个字,爽。
回复 支持 反对

使用道具 举报

发表于 2019-11-22 14:58:21 | 显示全部楼层
28674500 发表于 2019-11-18 18:16
已经成功上传并微信控制LED,
有个问题,就是如何多路控制,
目前将你程序的io口改到了16 ...

GPIO16能用?  IO16/0/2/4 在NODEMCU是复用端口,上拉到LED了,,,
回复 支持 反对

使用道具 举报

发表于 2019-11-22 15:40:59 | 显示全部楼层
在Arduino添加NODEMCU(ESP8266EX)
1.在ArduinoIDE文件 - 首选项,添加:"http://arduino.esp8266.com/stable/package_esp8266com_index.json"
2.重启IDE,打开工具 - 开发板管理器 - 等待更新 -拉到最后 - ESP8266 by ESP8266 ***.选版本,安装
2.1 这里有点插曲,貌似是开发板编译工具是在墙外引起的,
解决办法:
  2.11 检查C:\Users\你的电脑用户名\AppData\Local\Arduino15\staging\packages下是否有
          [mkspiffs-xxx.zip/esptool-xxx.zip/python-xxx.zip/win32-xtensa-lx106-elf-xxx.tar.gz/以及IDE自带的i686-w64-mingw32.XXX.ZIP文件]缺一不可,前4个是ESP8266的编译工具,第五个是ESP工具链文件.
  2.12 如果没有就翻Q下载,或者降低IDE版本下载别人打包好的环境.
3.重启IDE.
下面废话,给懂的人.
Arduino是给Arduino的开发环境,用到的是AVR编译环境 IDE默认已经在安装时配置好,不用下载,只需要更新,包括NONA,MEGA,UNO等等.类似于C51的Keil之死S太T惨C配置
如果要增加改变其他开发板环境,就需要提供给IDE相关的编译工具.类似于C51Keil头文件.而ESP就属于不同于AVR系列的xtensa-lx106-elf系列.
xtensa-lx106-elf是什么?是乐鑫的ESP8266ex在Linux开发下的开发环境.要想xtensa-lx106-elf工作在IDE下,就需要IDE和xtensa-lx106-elf互通,这就是i686-w64-mingw32.xtensa-lx106-elf-(实现的).
向下配置,ESP的编译除了需要XTENSA和i686 XTENSA之外,还需要让IDE理解你在IDE的语句是什么指令.这一切都是在Python3下完成的,这是XTENSA能理解的转换方式,所以,还需要Python3解释器,(pythoxxxn-3.7.2.post1-embed-win32v2.zip).最后,因为ESP是SPIFF文件系统,所以还需要 MKSPIFF支持mkspiffs-x'x'x-windows.zip和烧录上传所需的esptool-xxx.zip支持.
...其实这些工具在开发板管理器索引文件内都是有记录的,可以很直观的看到C:\Users\你的电脑用户名\AppData\Local\Arduino15\package_esp8266com_index.json文件是ESP8266的开发板环境资源索引.在首选项添加开发板后第一次更新完成时生成.内部包含的工具并非全部必须,需对应开发板,ESP8266只有4个工具

package_index.json是默认的AVR开发板环境资源,毕竟是官方的,相对整齐有序一点.

library_index.json  库文件索引  用作更新下载.

其他的sig文件不要删除,这是JSON每次请求相关服务器的证书文件,保证工具安全合法性,如果删除有一定可能导致没办法获取JSON更新.包括库和开发板.


就这样,水表君,借楼了~
回复 支持 1 反对 0

使用道具 举报

发表于 2019-11-22 15:55:39 | 显示全部楼层
mengfc 发表于 2019-11-20 20:19
那有比较过Arduino、NodeMcu、MicroPython三者的性能吗?

Arduino是Arduino UNO MEGA NONA三者的IDE 是AVR内核. 目前项目速度,精度,略差与C51.通过pi运算和ns延时
NodeMcu是万用板,自身既可以运行NO-RTOS,也可以RTOS.
可以用IDE做C编译运行,(ArduinoIDE就属于混合方式,直接采用乐鑫工具链编译一个IDE指定的RTOS)
也可以Rtos做LUA/PYTHON运行.
速度,No-RTOS优于RTOS,特别是代码大于2K,对时控严格的场合.
MicroPython也是介于RTOS下的,类似于LUA方式.
回复 支持 反对

使用道具 举报

发表于 2019-11-25 16:52:32 | 显示全部楼层
netbeetle 发表于 2019-11-22 10:50
比如访问一个天气的API,就会发现SDK和Arduino速度上的巨大差距,用官方RTOS_SDK 开发的几乎是在访问命令 ...

8266对运行速度要求不高的话,nodemcu开发最快,前提是有需要的库,常见应用也够了,例如你说的ssid扫描,wifi密码设置,都是几行代码的事情。
arduino是各种奇怪的库都有,例如uwb芯片,rtos还要自己写一遍驱动,开发时间成本才是最高的。
至于你说访问天气api的速度问题,这种几十倍以上的差异肯定不是不同开发语言环境导致的,最大可能是某个库的写法有问题,没用事件响应,用延迟等待等等,或者用了个非常慢的dns服务器之类的。
回复 支持 反对

使用道具 举报

发表于 2020-2-19 20:47:49 | 显示全部楼层
sunnyquan 发表于 2019-8-15 09:17
感觉分享~

有空折腾,现在好像最没有的就是时间啊。。

xx终于有时间了,翻翻还刚好有个ESP8266模块,赶紧玩起来!

感谢分享~
回复 支持 反对

使用道具 举报

发表于 2020-3-12 20:34:33 | 显示全部楼层
:tongue: 选择正确的上网方式才是正途
回复 支持 反对

使用道具 举报

发表于 2020-4-28 15:56:25 | 显示全部楼层
如何增加断电记忆功能
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 19:23 , Processed in 0.109200 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表