Ariduino for esp8266隨筆

Ariduino for esp8266

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

一.下載node

Ariuino主程序下載:https://www.arduino.cc/en/Main/Softwaregit

esp8266庫:https://github.com/esp8266/Arduinogithub

二.安裝esp8266庫redis

這個在esp8266庫的github有詳細說明。編程

1.打開首選項json

 

 

 

 

 

 

 

 

 

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/


相關文章
相關標籤/搜索