arduino编写Esp8266-01s响应并处理代码
主要思路
Esp8266-01s(以下简称Esp)要和远程linux服务器端互发心跳包,
且又要即时的响应控制指令,不用中断的话就不能轮询,因为在delay(
)的那段时间里无法做任何事。在主循环loop里一直等待数据,一旦有值
就和参考值比较,从而做出响应的决策。总体来说还是很简单的。
Adruino代码
开门见山:
void loop(){
serconnect_to_server();
String readstring = "";
while (client.connected())
{
if(client.available())
{
char c = client.read();
readstring += c;
if (c == 'T')
{
if (readstring.equals("DoT"))
{
pin0_state = !pin0_state;
digitalWrite(0,pin0_state);
}
else if (readstring.equals("hello EspT"))
{
client.print("from Esp hello");
}
else
{
client.stop();
digitalWrite(LED_BUILTIN,LOW);
}
readstring = "";
}
}
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 30000) {
//Serial.println(">>> Client Timeout !");
client.stop();
break;
}
}
}
delay(5000);
}
}
这是loop()里的核心代码,可以看到在while (client.connecte
d())
这个循环末尾里是没有延时的,所以就可以来一个处理一个。下面
对一些重要的语句讲一下
while (client.connected()) {
if(client.available())
只要和服务器处于连接状态且有可读的内容。
char c = client.read();
readstring += c;
if (c == 'T') {
从缓冲区中读入一个字符直到结束符'T'为止,并将这些字符拼接
到字符串readstring里。随后就是对字符串进行比较的代码了,很简单
。
如果和服务器断开连接,则跳出while (client.connected())并
运行serconnect_to_server()尝试重连。
我买的是esp8266-01s和相应的继电器,继电器由Esp的GPIO0脚低
电平使能。
全部代码在文末给出
网页端发送请求
全部代码就这一句
$obj.click(){
$.get("host:port");
host是我的服务器地址,port是nginx给tcp代理而监听的端口。
点击按钮后get语句将会向这个端口发送请求头,nginx将请求头转发给
socket绑定的端口。
当然简单的语句一般只能实现简单的功能,这么写的就只能翻转开
关,不能指定开关。
Esp代码
#include <ESP8266WiFi.h>
#ifndef STASSID
#define STASSID "CMCC-家园党的wifi"
#define STAPSK "radmm2w2"
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
const char* host = "182.61.27.236";
const uint16_t port = 9091;
WiFiClient client;
int pin0_state = 1;
unsigned long start_time ;
void setup() {
pinMode(0,OUTPUT);
digitalWrite(LED_BUILTIN,HIGH);
pinMode(LED_BUILTIN, OUTPUT);
//Serial.begin(115200);
// We start by connecting to a WiFi network
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
//Serial.println();
//Serial.println();
//Serial.print("Wait for WiFi... ");
WiFi.setAutoReconnect(false);
while (WiFi.status() != WL_CONNECTED) {
//Serial.print(".");
delay(500);
}
//Serial.println("");
//Serial.println("WiFi connected");
//Serial.println("IP address: ");
//Serial.println(WiFi.localIP());
WiFi.setSleepMode(WIFI_MODEM_SLEEP);
delay(500);
}
void wifi_conn(){
// We start by connecting to a WiFi network
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
WiFi.setAutoReconnect(false);
//Serial.println();
//Serial.println();
//Serial.print("Wait for WiFi... ");
while (WiFi.status() != WL_CONNECTED) {
//Serial.print(".");
delay(500);
}
//Serial.println("");
//Serial.println("WiFi connected");
//Serial.println("IP address: ");
//Serial.println(WiFi.localIP());
WiFi.setSleepMode(WIFI_MODEM_SLEEP);
delay(500);
}
void light_blink(){
digitalWrite(0,HIGH);
delay(1500);
digitalWrite(0,HIGH);
delay(1500);
digitalWrite(0,LOW);
delay(1500);
digitalWrite(0,HIGH);
delay(1500);
digitalWrite(0,LOW);
}
void connect_to_server()
{
//Serial.print("connecting to ");
//Serial.print(host);
//Serial.print(':');
//Serial.println(port);
if (!client.connect(host, port)) {
//Serial.println("connection failed");
delay(5000);
return;
}
if (client.connected()) {
client.print("from Esp first hello");
}
}
void loop(){
static int NewdayF;
if(NewdayF==1)
{
if(millis()-start_time>50400000)
{
wifi_conn();
NewdayF = 0;
}
else;
}
if(NewdayF==0){
connect_to_server();
String readstring = "";
while (client.connected())
{
if(client.available())
{
char c = client.read();
readstring += c;
if (c == 'T')
{
if (readstring.equals("DoT"))
{
pin0_state = !pin0_state;
digitalWrite(0,pin0_state);
//Serial.println("chang the io0 success");
}
else if (readstring.equals("hello EspT"))
{
client.print("from Esp hello");
}
else if(readstring.equals("a new dayT"))
{
light_blink();
start_time = millis();
NewdayF = 1;
client.stop();
WiFi.disconnect(true);
//Serial.println(WiFi.isConnected());
break;
}
else
{
client.stop();
digitalWrite(LED_BUILTIN,LOW);
}
//Serial.println(readstring);
readstring = "";
}
}
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 30000) {
//Serial.println(">>> Client Timeout !");
client.stop();
break;
}
}
}
delay(5000);
}
}
好啦,基本上能想起的就这些了,以后再想到再更吧,至于其他如云服务器、nginx,Esp下载程序和继电器连线这些我踩过的坑也会找时间分享。
每一次进步都来源于大家的批评,有什么好的想法的朋友可以在评论区讨论。