esp8266 作为webserver 控制LED

本项目介绍如何使用ESP8266模块创建一个简单的Web服务器,通过I2C接口连接SSD1306 OLED显示屏显示状态。服务器能响应网页请求并允许远程控制LED灯的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <ESP8266WiFi.h>
#include <Arduino.h>
#include <U8g2lib.h>
/*** 该工程可以在2.6.3版本esp8266库中运行,没在更高版本库中进行测试 ***/SDA接D2,SCL接D1 I2C接口屏
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display, Full screen buffer mode
//U8G2_R0  正常显示
//U8G2_R1 90度顺时针旋转
//U8G2_R2 180度顺时针旋转
//U8G2_R3 270度顺时针旋转
const char* ssid = "zhiyong";//待连接WIFI,改成自己的wifi账号密码
const char* password = "l13314167123";//待连接WIFI密码

WiFiServer server(80);//默认端口

String readString = ""; //建立一个字符串对象用来接收存放来自客户的数据

//响应头
String responseHeaders =
  String("") +
  "HTTP/1.1 200 OK\r\n" +
  "Content-Type: text/html\r\n" +
  "Connection: close\r\n" +
  "\r\n";

//网页
String myhtmlPage =
  String("") +
  "<html>" +
  "<head>" +
  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"+//增加中文显示UTF-8是网络中文默认编码
  "    <title>ESP8266 Web Server Test</title>" +
  "    <script defer=\"defer\">" +
  "        function ledSwitch() {" +
  "            var xmlhttp;" +
  "            if (window.XMLHttpRequest) {" +
  "                xmlhttp = new XMLHttpRequest();" +
  "            } else {" +
  "                xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");" +
  "            }" +
  "            xmlhttp.onreadystatechange = function () {" +
  "                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {" +
  "                    document.getElementById(\"txtState\").innerHTML = xmlhttp.responseText;" +
  "                }" +
  "            }," +
  "            xmlhttp.open(\"GET\", \"Switch\", true);" +
  "            xmlhttp.send(); " +
  "        }" +
  "    </script>" +
  "</head>" +
  "<body>" +
  "    <div id=\"txtState\">关闭状态</div>" +
  "    <input type=\"button\" value=\"切换\" οnclick=\"ledSwitch()\">" +
  "</body>" +
  "</html>


bool isLedTurnOpen = false; // 记录LED状态
int LED = 2 //对应板子编号D4
          void setup()
{
  u8g2.begin();
  u8g2.enableUTF8Print();    // enable UTF8 support for the Arduino print() function

  u8g2.setFont(u8g2_font_wqy15_t_chinese2); //u8g2_font_unifont_t_chinese2
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW); // 熄灭LED


  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    show("正在连接中", 1);
    delay(500);

  }
  show("服务端已连接", 3);
  delay(500);
  server.begin();

  show( WiFi.localIP().toString().c_str(), 3);
  delay(1000);
}
void show(String str, int n) {
  u8g2.clearBuffer();         // 清除内部缓冲区
  u8g2.setCursor(0, 15);
  u8g2.print("Web Server");
  u8g2.setCursor(0, 15 + 15 * n);
  u8g2.print(str);
  u8g2.sendBuffer();          // transfer internal memory to the display
  delay(500);
}
void loop()
{
  WiFiClient client = server.available(); //尝试建立客户对象
  if (client)                             //如果当前有客户可用
  {
    boolean currentLineIsBlank = true;
    show("客户端已连接", 3);
    delay(100);
    while (client.connected()) //如果客户端建立连接
    {

      if (client.available()) //等待有可读数据
      {

        char c = client.read(); //读取一字节数据
        readString += c;        //拼接数据
        /************************************************/
        if (c == '\n' && currentLineIsBlank) //等待请求头接收完成(接收到空行)
        {
          //比较接收到的请求数据
          if (readString.startsWith("GET / HTTP/1.1")) //如果是网页请求
          {
            client.print(responseHeaders); //向客户端输出网页响应
            client.print(myhtmlPage);      //向客户端输出网页内容
            client.print("\r\n");
          }
          else if (readString.startsWith("GET /Switch")) //如果是改变LED状态请求
          {
            if (isLedTurnOpen == false)
            {
              show("LED 已经点亮", 2);
              delay(100);
              digitalWrite(LED, HIGH); // 点亮LED点亮(高电平控制),led灯如果是低电平控制,把D4脚接LED负极(短脚),LED正极(长脚)接3.3,digitalWrite(LED, LOW)为灯亮
              client.print("LED 已经点亮");
              isLedTurnOpen = true;
            }
            else
            {
              show("LED 已经关闭", 2);
              delay(100);
              digitalWrite(LED, LOW ); // 熄灭LED
              client.print("LED 已经关闭");
              isLedTurnOpen = false;
            }
          }
          else
          {
            client.print("\r\n");
          }
          break;
        }

        if (c == '\n')
        {
          currentLineIsBlank = true; //开始新行
        }
        else if (c != '\r')
        {
          currentLineIsBlank = false; //正在接收某行中
        }
 
      }
    }
    delay(1);      //等待客户完成接收
    client.stop(); //结束当前连接:

    show("客户端已断开", 3);
    delay(1000);

    readString = "";
  }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值