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/
Copyright ?2018 何亚红的博客 unless otherwise noted.
原文地址:https://www.cnblogs.com/HEYAHONG/p/8379037.html