ESP-01S 基本参数
img

img

环境:win11 ,Arduous版本2.3.4 , ESP01S ,USB to TTL

1,安装好Arduous IDE(这个没什么好说的,修改一下安装路径。无脑下一步。使用2.3.4 注:版本不同,页面可能不同,操作大同小异。 )

2,添加开发包地址,老版的Anderson自带,新版不带。进入 【文件 > 首选项】 下的其他开发板管理器地址添加8266的官方地址 。使用其他的开发板是同样的方式。添加之后,重启Arduous

http://arduino.esp8266.com/stable/package_esp8266com_index.json

3,重启以后,【工具 > 管理库】,搜索esp8266,添加 ESP8266 Community。安装以后,【工具】一栏会出现相关的参数。一般默认的都是可以正常使用的,也可以根据自己的需求调整。

4,硬件连接方式

这里有两个接口需要连VCC,而且为esp供电需要一个稳定的电源。TTL的电源不太稳定。建议用st-link中的3.3V和面包板结合。

image-20250102221811554

网上教程还有这样连接的(TX 连 TX,RX 连 RX。给出的解释是:搭建的环境是用来编译和烧录ESP8266 01S程序的。写好的程序只会借道arduino的串口线写进ESP8266中去运行,并不会写进arduino。)本人使用上面的连线成功烧录,如果不成功,可以试试下面的连线方式。

image-20250102221923000

5,烧录(本方式适用第一种接线方式,第二种没试)

(1)当出现 Connecting........___ 的时候。这时候说明Arduous在连接串口,将VCC拔掉再插上(重启esp)

(2)重启之后出现 百分比 ,等待烧录成功即可。

(3)烧录成功后,拔掉GPIO0,然后将VCC拔掉再插上(重启esp)

这时程序已经成功烧录进了esp8266.

注:出现奇奇怪怪的错误,一般都是线没插好。

一个简单的STA模式测试
#include <ESP8266WiFi.h>

const char* ssid = "1111";  // 填写你的WiFi SSID
const char* password = "12341234";  // 填写你的WiFi密码

void setup() {
  Serial.begin(115200);  // 初始化串口,波特率设置为115200
  delay(10);  // 延时,确保串口初始化完成
  
  Serial.println("\n正在连接WiFi...");

  WiFi.begin(ssid, password);  // 开始连接WiFi

  // 等待WiFi连接成功
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");  // 打印点来指示连接尝试
  }

  // WiFi连接成功后输出WiFi相关信息
  Serial.println("\nWiFi连接成功!");
  Serial.print("IP 地址: ");
  Serial.println(WiFi.localIP());  // 获取并打印ESP8266的IP地址
  Serial.print("子网掩码: ");
  Serial.println(WiFi.subnetMask());  // 获取并打印子网掩码
  Serial.print("网关 IP: ");
  Serial.println(WiFi.gatewayIP());  // 获取并打印网关IP地址
  Serial.print("DNS: ");
  Serial.println(WiFi.dnsIP());  // 获取并打印DNS
}

void loop() {
  // 可以根据需要在这里执行其他操作
  // 比如在连接成功后定时打印WiFi信息
  
  // wifi断开以后,尝试重连
  if (WiFi.status() != WL_CONNECTED) 
  {
    Serial.println("WiFi断开,正在重新连接...");
    WiFi.begin(ssid, password);
  }


  Serial.println("----------------------------");
  delay(10000);  // 延时10秒
}

简单实现esp8266发送信息到私有云服务器

(待完善)

注:要保证服务器防火墙允许端口的通过

sudo ufw allow 5000

服务器端代码esp_server.py

from http.server import HTTPServer, BaseHTTPRequestHandler
import json
from datetime import datetime

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        # 获取POST数据的长度
        content_length = int(self.headers['Content-Length'])
        # 读取POST数据
        post_data = self.rfile.read(content_length)
        
        try:
            # 解析JSON数据
            data = json.loads(post_data.decode('utf-8'))
            # 添加时间戳
            data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            
            print("收到数据:", data)  # 打印接收到的数据
            
            # 保存数据到文件(可选)
            with open('esp8266_data.txt', 'a') as f:
                f.write(json.dumps(data) + '\n')
            
            # 发送响应
            self.send_response(200)
            self.send_header('Content-type', 'application/json')
            self.end_headers()
            response = {"status": "success", "message": "数据已接收"}
            self.wfile.write(json.dumps(response).encode())
            
        except Exception as e:
            print("错误:", str(e))
            self.send_response(400)
            self.send_header('Content-type', 'application/json')
            self.end_headers()
            response = {"status": "error", "message": str(e)}
            self.wfile.write(json.dumps(response).encode())
    
    def do_GET(self):
        # 处理GET请求(用于测试服务器是否运行)
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        self.wfile.write("服务器正在运行!".encode())

def run_server(port=5000):
    server_address = ('', port)
    httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
    print(f'启动服务器在端口 {port}...')
    httpd.serve_forever()

if __name__ == '__main__':
    run_server()

服务器端代码(能够处理任何格式的数据)

from http.server import HTTPServer, BaseHTTPRequestHandler
from datetime import datetime

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        try:
            # 获取POST数据的长度
            content_length = int(self.headers['Content-Length'])
            # 读取POST数据
            post_data = self.rfile.read(content_length)
            
            # 尝试解码数据
            try:
                decoded_data = post_data.decode('utf-8')
            except UnicodeDecodeError:
                # 如果无法解码为UTF-8,则使用原始数据的十六进制表示
                decoded_data = post_data.hex()
            
            # 创建包含时间戳的日志条目
            timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            log_entry = f"[{timestamp}] {decoded_data}"
            
            print("收到数据:", log_entry)  # 打印接收到的数据
            
            # 保存数据到文件
            with open('esp8266_data.txt', 'a', encoding='utf-8') as f:
                f.write(log_entry + '\n')
            
            # 发送响应
            self.send_response(200)
            self.send_header('Content-type', 'text/plain')
            self.end_headers()
            self.wfile.write("数据已接收".encode())
            
        except Exception as e:
            print("错误:", str(e))
            self.send_response(400)
            self.send_header('Content-type', 'text/plain')
            self.end_headers()
            self.wfile.write(f"错误: {str(e)}".encode())
    
    def do_GET(self):
        # 处理GET请求(用于测试服务器是否运行)
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        self.wfile.write("服务器正在运行!".encode())

def run_server(port=5000):
    server_address = ('', port)
    httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
    print(f'启动服务器在端口 {port}...')
    httpd.serve_forever()

if __name__ == '__main__':
    run_server()

esp_test.ino代码(能够将接收的任何数据发送到服务器)

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const char* ssid = "1111";
const char* password = "12341234";
const char* serverUrl = "http://123.56.141.154:5000";

void setup() {
  Serial.begin(9600);
  Serial.println("\n开始连接WiFi...");
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("\nWiFi连接成功!");
  Serial.print("IP地址: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  // 如果WiFi连接断开,则尝试重新连接
  if (WiFi.status() != WL_CONNECTED) 
  {
    Serial.println("WiFi连接已断开,尝试重连...");
    WiFi.begin(ssid, password);
    unsigned long startMillis = millis();
    while (WiFi.status() != WL_CONNECTED) {
      if (millis() - startMillis > 10000) {
        Serial.println("WiFi连接超时!");
        break;
      }
      delay(500);
      Serial.print(".");
    }
  } else {
    // 检查是否有串口数据
    if (Serial.available()) {
      // 给一点时间让数据完全到达
      delay(100);
      
      // 读取所有可用数据
      String receivedData = "";
      while (Serial.available()) {
        receivedData += (char)Serial.read();
      }
      
      // 发送数据到服务器
      WiFiClient client;
      HTTPClient http;
      
      if (http.begin(client, serverUrl)) {
        http.addHeader("Content-Type", "text/plain"); // 改为普通文本格式
        
        // 发送POST请求
        int httpCode = http.POST(receivedData);
        
        if (httpCode > 0) {
          if (httpCode == HTTP_CODE_OK) {
            String response = http.getString();
            Serial.println("发送成功,服务器响应:" + response);
          } else {
            Serial.printf("HTTP错误代码: %d\n", httpCode);
          }
        } else {
          Serial.println("发送失败");
        }
        
        http.end();
      } else {
        Serial.println("无法连接到服务器");
      }
    }
  }
  
  delay(100); // 短暂延时,避免过于频繁的检查
}

esp_test.ino代码

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>

const char* ssid = "1111";
const char* password = "12341234";
const char* serverUrl = "http://123.56.141.154:5000";

void setup() {
  Serial.begin(9600);
  Serial.println("\n开始连接WiFi...");
  
  WiFi.begin(ssid, password);
  
  // 等待连接成功
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("\nWiFi连接成功!");
  Serial.print("IP地址: ");
  Serial.println(WiFi.localIP());
  Serial.print("子网掩码: ");
  Serial.println(WiFi.subnetMask());
  Serial.print("网关IP: ");
  Serial.println(WiFi.gatewayIP());
  Serial.print("DNS: ");
  Serial.println(WiFi.dnsIP());
}

void loop() {
  // 如果WiFi连接断开,则尝试重新连接
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi连接已断开,尝试重连...");
    WiFi.begin(ssid, password);  // 重新开始连接
    unsigned long startMillis = millis();  // 记录连接起始时间
    while (WiFi.status() != WL_CONNECTED) {
      if (millis() - startMillis > 10000) { // 连接超时10秒
        Serial.println("WiFi连接超时,无法连接到WiFi!");
        break; // 连接超时退出
      }
      delay(500);
      Serial.print(".");
    }
  } else {
    // WiFi已连接,发送数据
    sendDataToServer();
  }

  // 每隔30秒检查一次WiFi状态
  delay(30000);
}

void sendDataToServer() {
  WiFiClient client;
  HTTPClient http;
  
  // 创建JSON数据
  StaticJsonDocument<200> doc;
  doc["device_id"] = "ESP8266_001";
  doc["temperature"] = random(20, 30);
  doc["humidity"] = random(40, 60);
  
  String jsonString;
  serializeJson(doc, jsonString);
  
  Serial.println("\n准备发送数据...");
  Serial.print("服务器地址: ");
  Serial.println(serverUrl);
  Serial.print("发送的数据: ");
  Serial.println(jsonString);
  
  // 尝试连接服务器
  Serial.println("连接服务器...");
  if (http.begin(client, serverUrl)) {
    http.addHeader("Content-Type", "application/json");
    
    // 发送POST请求
    Serial.println("发送POST请求...");
    int httpCode = http.POST(jsonString);
    
    // 检查响应
    Serial.print("HTTP响应代码: ");
    Serial.println(httpCode);
    
    if (httpCode > 0) {
      if (httpCode == HTTP_CODE_OK) {
        String response = http.getString();
        Serial.print("服务器响应: ");
        Serial.println(response);
      } else {
        Serial.printf("HTTP错误代码: %d\n", httpCode);
      }
    } else {
      Serial.print("发送失败,错误: ");
      Serial.println(http.errorToString(httpCode));
    }
    
    http.end();
  } else {
    Serial.println("无法连接到服务器");
  }
  
  // 测试网络连接
  Serial.println("\n测试网络连通性...");
  IPAddress serverIP;
  if (WiFi.hostByName(serverUrl, serverIP)) {
    Serial.print("服务器IP: ");
    Serial.println(serverIP);
  } else {
    Serial.println("无法解析服务器IP");
  }
}

待更新。。。