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/


Copyright ?2018 何亚红的博客 unless otherwise noted.

原文地址:https://www.cnblogs.com/HEYAHONG/p/8379037.html

时间: 2024-10-23 02:26:18

Ariduino for esp8266随笔的相关文章

nodemcu随笔(esp8266 wifi)

nodemcu by HYH | 2017 年 6 月 16 日 下午 8:11 一.固件刷写 http://www.cnblogs.com/yangfengwu/p/6247048.html 官方网站:http://www.nodemcu.com 参考资料:https://github.com/wangzexi/NodeMCU-Tutorial 硬件资料(相关USB转串口驱动在divers/下): https://github.com/nodemcu/nodemcu-devkit https:

用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯

最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 WIFI模块实现了这个功能.下面向大家就简单分享一下. 工具:网络调试助手  ESP8266  STM32F1开发板 首先,用网络调试助手来虚拟一个服务器,如下: 有了服务器后,接下来我们就要用WIFI来连接这个服务器.ESP8266 有三种工作模式,由于项目要求,我选用了STA中的客户端模式.下面

C#博客随笔之六:数据绑定

这一篇随笔记录的是在完成程序中遇到的一些情况 首先要讲的是MVVM 所谓MVVM就是Model,View,ViewModel 下面是MVVM的优点(引用自百度百科): MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点1. 低耦合.视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变.2. 可重用性.你可以把一些视图

Abby&#39;s 学习php5随笔

2017.6.27 Abby's cakephp2 学习之旅 下载了XAMPP集成开发环境,然后配置其数据库,参考学习教程, 1.建立表单. 配置完信息如下,Cache Apache默认在windows下是system用户,所以权限最高,但xampp集成环境中的apache确是administor 如何更改apache用户为system 静默开发.(一种开发方法,番茄ToDo中的学霸模式有些相似) 如何设置.ctp的显示 http://cakephp2.local/posts/index怎么就可

java基础随笔 字符数据类型char的单引号

public class Love{ public static void main(String[] args){ System.out.println('*'+'\t'+'*'); System.out.println("*"+"\t"+"*") } } 运行结果   第一行为  93 第二行为  *        * 原因 第一行中'\t' 单引号  识别为字符数据类型char,char类型是可以运算的,在第一行中+做了运算符. 第二行&q

web前端学习随笔

好好算下来,学习web前端已有半个月了,这半个月来主要学习的是HTML和CSS部分,期间有困惑,也有解决困惑时的快感,所以想把这段时间感受到的一些东西记下来,因为内容比较杂,所以干脆叫随笔吧.这里面不会说前端的相关基础知识,只是说一些自己对前端的一些认识. html是用来控制页面结构的我曾经对这句话有过疑问,觉得html应该是控制页面内容的,为什么要说是控制页面结构的呢?在查看京东首页的代码时,我恍然大悟,html确实是定义页面内容的,但同时它也要控制页面的结构.举例来说,京东商品分类的div包

JavaWeb学习随笔

Servlet学习随笔 1.HttpServlet init(ServletConfig)------Servlet生命周期中的初始方法,默认情况是服务器创建后第一次访问这个Servlet时调用,可以修改配置信息,使其在服务器一创建时就被调用; 修改配置信息的方法-----在web.xml的<servlet>下添加<load-on-startup>x<load-on-startup>,x是正整数,越小表示优先级越高 url路径的配置,完全匹配>目录匹配>(.

想知道博客园随笔总阅读量吗?

我真的是闲的无聊了...,前提是你写的随笔总数少于等于40条. 0.在选项里设置一页显示40条随笔 1,打开自己的随笔列表:https://i.cnblogs.com/posts 2,在当前页面f12打开浏览器控制台 3,粘贴进去以下代码 var trs=document.querySelectorAll('#post_list tr td:nth-child(4)')//取得阅读量 atrs=Array.from?Array.from(trs):Array.prototype.slice.ca

随笔1104

随笔1104 一.变量定义 var a = 10; 如果定义小数或整数的变量,等号后面值直接写 如果定义字符串的变量,等号后面的值要加双引号或单引号 类型转换 parseInt(); 强制转换为整数 parseFloat();强制转换为小数 二.运算符表达式 1.数学运算符 + - * / % 百分号是取余 例:alert(a+b); alert(a%b); a除以b的余数 2.逻辑运算符 && 并 指两者都满足 || 或 指两者其中任何一个满足 ! 非 指强制变反 真变假 假变真 3.比