环境: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和面包板结合。
网上教程还有这样连接的(TX 连 TX,RX 连 RX。给出的解释是:搭建的环境是用来编译和烧录ESP8266 01S程序的。写好的程序只会借道arduino的串口线写进ESP8266中去运行,并不会写进arduino。)本人使用上面的连线成功烧录,如果不成功,可以试试下面的连线方式。
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");
}
}
待更新。。。