Ariduino for esp8266随笔

Posted 何亚红

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ariduino for esp8266随笔相关的知识,希望对你有一定的参考价值。

Ariduino for esp8266

by HYH | 2017 年 10 月 17 日 下午 9:28

一.下载

Ariuino主程序下载:https://www.arduino.cc/en/Main/Software

esp8266库:https://github.com/esp8266/Arduino

二.安装esp8266库

这个在esp8266库的github有详细说明。

1.打开首选项

技术分享图片

 

 

 

 

 

 

 

 

 

2.添加开发板管理器网址

http://arduino.esp8266.com/stable/package_esp8266com_index.json

技术分享图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.保存设置后,重新打开Arduino

4.打开开发板管理器(编程时需要先选开发板)

技术分享图片

如果网络好,就能看见有个esp8266的开发板包(可能需要下拉才能找到)

技术分享图片

5.安装完成后(如果有网络错误,退出重新打开下载就行)

选择合适的开发板进行开发

技术分享图片三.简单开发(C/C++)

esp8266社区:http://www.esp8266.com/

esp8266 Wiki:http://www.esp8266.com/wiki/doku.php

1.串口打印信息:

开发板包提供了两个全局变量,用于使用串口。

技术分享图片

分别对应UART0,UART1(如果能用的话).

其中HardwareSerial类有如下继承关系

Print->Stream->HardwareSerial

技术分享图片

技术分享图片

打印调试信息用的最多的是:

HarhwareSerial类的begin成员函数和Print类的println成员函数/print成员函数

begin函数有多种参数形式(利用函数重载)

技术分享图片

baud为波特率,直接输入数字即可

config有如下选项

技术分享图片

mode有如下选项

技术分享图片

tx_pin:www.esp8266.com/wiki/doku.php?id=esp8266_gpio_pin_allocations

Print类中关于println(自动换行),print的定义

技术分享图片

编译程序:项目->验证/编译

技术分享图片

然后就可以导出二进制文件烧写了,编译时要选对开发板及容量。

(非准确)经验:最好不要在loop()直接使用局部变量,改为调用其它函数实现。

技术分享图片

#include “Arduino.h”
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);//初始化串口0
Serial.println(“init ok”);
}
void userfunc()
{
char i = 0, j = 0;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{

Serial.printf(“%dx%d=%d\t”, i, j, i * j);

}
Serial.print(‘\n’);
}
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println(“start:”);

userfunc();

}

技术分享图片

设置好端口后使用项目->上传将写好的程序写入esp8266

技术分享图片

技术分享图片

技术分享图片

读取串口:

除了最简单的read函数(读取字符,错误则返回-1),在Stream类里还提供了其它方便的函数。

技术分享图片

setTimeout(毫秒数);//设定读取数据时等待的毫秒数(对需要等待数据的操作而言)

技术分享图片

readStringUntil(字符);//读取数据直到某个字符出现,返回值为String类.

示例:

技术分享图片

2.读取ADC

需要用到的函数:analogRead(uint8_t pin)

其中pin为0或17时为adc的值。

技术分享图片

示例:

技术分享图片

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);//初始化串口0

}

void loop() {
// put your main code here, to run repeatedly:
delayMicroseconds(100000);//延时100000us
Serial.printf(“\rADC:%4d”,analogRead(0));//读取ADC的值,参数为0或17时读取adc的值,为其它时直接读取引脚的数字值乘上1023。

}

结果:

技术分享图片

3.GPIO操作(读写,不包括中断)

引脚分布图(pin就是GPIO后的数字)

技术分享图片

对于nodemcu,也可用nodemcu的方式(D0,A0等)表示引脚。

技术分享图片

引脚模式(即引脚功能选择)

技术分享图片

最常用的是输入(INPUT),输出(OUTPUT)

常用函数:

技术分享图片

pinMode(引脚,模式);//设置引脚模式

digitalRead(引脚);//读引脚

digitalWrite(引脚,值);//写引脚

示例:

技术分享图片

技术分享图片

技术分享图片

4.ESP8266WiFiSTA简单使用

首先加载ESP8266Wifi库

技术分享图片

然后再定义一个类名为ESP8266WiFiSTAClass的全局变量(方便在所有函数中使用,不考虑生存周期)

它的启动也是由begin函数(由于有默认参数,实际只需要给出SSID,密码(如果有的话))

技术分享图片

下面是几个常用函数

setAutoConnect();//设置自动连接

setAutoReConnnect();//设置自动重连

hostname(“新主机名”);//设置新主机名,可用于区分设备

技术分享图片

status();//查询状态

status()的返回值有如下选项,其中 WL_CONNECTED 为连接成功

技术分享图片

示例:

技术分享图片

#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

ESP8266WiFiSTAClass sta;
void setup() {
// put your setup code here, to run once:
pinMode(D0, OUTPUT);
Serial.begin(115200);
sta.begin(“HYH”, “12437856”); //设置SSID及密码
sta.setAutoConnect(true);//设置自动连接
sta.setAutoReconnect(true);//设置自动重连
sta.hostname(“ESP8266”);//设置主机名
}

void loop() {
// put your main code here, to run repeatedly:
digitalWrite(D0, !digitalRead(D0)); //改变D0的输出
delay(2000);//延时2S
if(sta.status()==WL_CONNECTED)
Serial.printf(“\rstatus:ok”);
else
Serial.printf(“\rstatus:..”);

}

技术分享图片

库文件也提供了一个全局变量Wifi,它所属的类的基类包含ESP8266WiFiSTAClass,可以直接使用(其它模式如Ap模式也可使用).

技术分享图片

技术分享图片

5.ESP8266WiFiAP简单使用

仍然需要加载ESP8266WIFI库。

技术分享图片

常用函数:

softAP(“SSID”,”密码”,通道,是否隐藏);//创建AP

softAPConfig(IP的地址,网关,子网掩码);//配置APip信息

softAPIP();//获取AP的IP地址

softAPgetStationNum();//获取客户端数

IPAddress类常用函数

toString();//将IP地址信息转化为String类。

String类常用函数

c_str();//将String类转化为字符串

技术分享图片

#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

void setup() {
// put your setup code here, to run once:
pinMode(D0, OUTPUT);
Serial.begin(115200);
IPAddress ip(192,168,0,1),gate(192,168,0,1),mask(255,255,255,0);//初始化三个IPAddress类,初始化的方法是直接将IP地址的4个部分传入构造函数
WiFi.softAP(“ESP8266”);//配置的SSID,也可配置其它信息(如密码,通道,是否隐藏等)
WiFi.softAPConfig(ip,gate,mask);//配置AP的IP,参数依次为,AP的ip地址,网关,子网掩码
}

void loop() {
// put your main code here, to run repeatedly:
digitalWrite(D0, !digitalRead(D0)); //改变D0的输出
delay(2000);//延时2S;
Serial.printf(“SoftAP IP Addr:%s\tClient:%d\n”,WiFi.softAPIP().toString().c_str(),WiFi.softAPgetStationNum());
}

技术分享图片

6.WiFIClient简单使用

首先加载ESP8266WiFI库

技术分享图片

常用函数:

connect(主机名或IP地址,端口);连接服务器

write(缓存,缓存的长度);//发送数据

read(缓存,缓存的长度);//读取数据

stop();//停止

(1)利用redis发送数据(publish)

由于redis的协议简单,可以通过发送原始数据的方式发送命令。

技术分享图片

#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>

 

ESP8266WiFiSTAClass sta;
WiFiClient cli;
void setup() {
Serial.begin(115200);
sta.begin(“HYH”, “12437856”);
sta.setAutoConnect(true);
sta.setAutoReconnect(true);
sta.hostname(“ESP8266″);

}
void senddata()
{
String cmd=”publish esp8266 send_data_ok\n”;//定义一个变量保存指令,必须以\n结尾
cli.connect(IPAddress(118,89,176,41),6379);//连接redis服务器,前一个参数为主机名(域名)或ip地址,后一个参数为端口号
cli.write(cmd.c_str(),cmd.length());//发送数据,前一个参数为字符串,后一个为字符串的长度。
cli.stop();//停止连接
delay(10000);//延时10S
}

void loop() {
Serial.printf(“status:”);
if (sta.status() == WL_CONNECTED)
{
Serial.printf(“ok\n”);
senddata();
}
else
Serial.printf(“not connected\n”);

}

技术分享图片

(2)  接收redis发送的数据(subscribe)

由于接收的是原始数据,故和客户端上看到的不一样。

WiFiClient 有如下继承关系:

Stream->Client->WiFiClient

故可以用Strem中的成员函数操作。

技术分享图片

#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

ESP8266WiFiSTAClass sta;
WiFiClient cli;
void cli_init()//初始化连接
{
String cmd = “publish esp8266 init_ok\n”;
cli.connect(“file.hyhsystem.cn”, 6379);//连接服务器
cli.write(cmd.c_str(), cmd.length());//发送publish命令
cmd = “subscribe esp8266_1\n”;
cli.write(cmd.c_str(), cmd.length());//发送subscribe命令
}
void cli_read()
{
String data;
data = cli.readStringUntil(‘\n’);//利用Stream类的成员函数进行读取
if (data.length() != 0) Serial.println(data);//如果长度不为0,则为有效数据,打印此数据。
}
void setup() {
// put your setup code here, to run once:
pinMode(D0, OUTPUT);
Serial.begin(115200);
sta.begin(“HYH”, “12437856”); //设置SSID及密码
sta.setAutoConnect(true);//设置自动连接
sta.setAutoReconnect(true);//设置自动重连
sta.hostname(“ESP8266”);//设置主机名
}

void loop() {
// put your main code here, to run repeatedly:
digitalWrite(D0, !digitalRead(D0)); //改变D0的输出
if (sta.status() == WL_CONNECTED)
{
static bool init = false;
init ? cli_read() : cli_init();//第一次进入进行初始化,其余直接读取
init = true;
}
else
Serial.printf(“status:..\n”);

}

 

技术分享图片

7.WiFiServer的简单使用

首先加载ESP8266WiFI库。

首先,WiFiServer的变量实体初始化时需要指明端口号(也可以指明ip),这是由构造函数决定的。

技术分享图片

begin()函数仅仅负责启动。

当有连接进入时,available()函数会返回一个有效的WiFiClient变量,与已经连接的客户端进行数据传输就是靠的这个变量。无连接时,available()函数的返回值为无效值(NULL)。

技术分享图片

连接是否存在由WiFiClient的connected()函数判断。

技术分享图片

示例(WiFiServer与串口相互发送数据):

技术分享图片

#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

WiFiServer srv(81);//初始化WiFiServer,端口为81,不指定ip地址
WiFiClient con;
void setup() {
// put your setup code here, to run once:
pinMode(D0, OUTPUT);
Serial.begin(115200);
IPAddress ip(192, 168, 0, 1), gate(192, 168, 0, 1), mask(255, 255, 255, 0); //初始化三个IPAddress类,初始化的方法是直接将IP地址的4个部分传入构造函数
WiFi.softAP(“ESP8266”);//配置的SSID,也可配置其它信息(如密码,通道,是否隐藏等)
WiFi.softAPConfig(ip, gate, mask); //配置AP的IP,参数依次为,AP的ip地址,网关,子网掩码
srv.begin();
Serial.println(“Server started”);
}

void loop() {
// put your main code here, to run repeatedly:
digitalWrite(D0,HIGH); //关闭led
if (con = srv.available())//当有连接时,available()返回有效的WiFiClient,进入if语句中
{
digitalWrite(D0,LOW); //打开led
Serial.println(“port connected”);//提示信息
while (1) {
String data = con.readString();//读取网络数据
String Sdata = Serial.readString();//读取串口数据
if (Sdata.length()) con.write(Sdata.c_str(), Sdata.length()); //当串口数据长度不为0时,从网络发送数据
Serial.print(data);//输出网络数据到串口(自动判断是否有效)
if (!con.connected())//判断连接是否存在,不存在退出循环
{
Serial.println(“connection is missing”);//提示信息
break;
}
}
}

}

技术分享图片

技术分享图片

 

 https://hyhsystem.cn/wordpress/

























































































































































































以上是关于Ariduino for esp8266随笔的主要内容,如果未能解决你的问题,请参考以下文章

ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置

Arduino ESP8266 For EEPROM数据存储示例

WiFiManager for ESP8266配网实例

ESP8266驱动SSD1306 ESP8266 for Arduino(NodeMCU U8G2库)

ESP8266 for Arduino开发环境安装

Arduino for ESP8266 快速入门(二)选择开发板