基于esp8266-01s 从云服务器关掉两米外的卧室灯-一路心路历程(客户端部分)

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下载程序和继电器连线这些我踩过的坑也会找时间分享。
每一次进步都来源于大家的批评,有什么好的想法的朋友可以在评论区讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值