智慧农业
监测农业大棚内的温湿度并上传到云端,可以使用手机 app 或网页查看。
一、需求
1、采集环境温度和土壤湿度信息
2、云平台查看
二、方案
硬件设备:
1⃣️ESP32-CAM
2⃣️温度传感器、土壤温湿度传感器
软件设备:
1⃣️Arduino IDEA 编译器 + VS CODE
借助 Arduino 平台的开发板管理系统,可以安装 ESP32 系列的开发板,进行硬件设备调试编译。
2⃣️ThingsCloud 物联网平台
借助 HTTP 协议上传 ESP32 采集的数据,上传到 ThingsCloud 服务器中,之后在服务器里面配置面板显示。
三、细则
1、ESP32-CAM 接线 TTL 烧录器。参考
U0T——RXD
U0R——TXD
GND——GND
5V——5V
ESP32-CAM 的 IO0 和 GND 连接条线
需要注意的是:GND/R 这个 PIN 不能当成 GND 来使用,烧录的时候短接,部署的时候短开,可能在编译完成上传的时候需要点击 RST 按钮。需要点击 Arduino 的左上角向右箭头来完成编译和上传。
2、烧录失败
传输速不达标,改为 115200 后成功烧录
3、上传固件失败(参考)
A fatal error occurred: Failed to connect to ESP32: Invalid head of packet
将串口旁边的GND/R(黄色闪光灯旁的)此针脚接GND了,不要连接,即可上传固件成功
4、macOS CH340驱动安装(参考)
文件名:CH34x_Install_V1.5.pkg
文件存储与GitHub私人仓库:https://github.com/xdtxAM/CangKu/tree/main/CH341SER_MAC
「参考资料」
5、代码写入之后,需要断开ESP32-CAM 的 IO0 和 GND 连接条线,才能正常工作。
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "Space X";
const char* password = "Tong990608";
void setup() {
Serial.begin(9600); // 初始化串口,设置波特率为 9600
delay(1000);
WiFi.begin(ssid, password);
// 等待WiFi连接,如果连接成功,跳出循环
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
// 连接成功后,打印
Serial.println("Connected to WiFi——SUCCESS");
randomSeed(analogRead(0)); // 使用模拟引脚0的读值来设置随机数种子
}
float generateTemperature() { // 生成温度
float temperature = random(200, 300) / 10.0; // 生成20.0到30.0之间的浮点数
return temperature;
}
float generateHumidity() { // 生成湿度
float humidity = random(1300, 1400) / 10.0; // 生成130.0到140.0之间的浮点数
return humidity;
}
void loop() { // 主循环函数,Arduino 将不断地重复执行 loop() 函数,实现代码的循环运行
float temperature = generateTemperature();
float humidity = generateHumidity();
// Serial 发送数据到串口监视器
Serial.print("Temperature: ");
Serial.print(temperature, 1); // 打印温度,保留一位小数
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity, 1); // 打印湿度,保留一位小数
Serial.println("%");
// 连接WiFi
// WiFi.begin(ssid, password);
// while (WiFi.status() != WL_CONNECTED) {
// delay(1000);
// Serial.println("Connecting to WiFi...");
// }
// 创建HTTPClient对象
HTTPClient http;
// 设置URL
String url = "http://bj-2-api.iot-api.com/device/v1/xhixxpjpsksvnns9/attributes";
http.begin(url);
// 添加请求头部信息
http.addHeader("Content-Type", "application/json");
http.addHeader("Project-Key", "cKqv7Z7Ypc");
// 构建要上传的数据
String data = "{\"temperature\": \"" + String(temperature, 1) + "\", \"humidity\": \"" + String(humidity, 1) + "\"}";
// 执行POST请求,并获取响应
int httpResponseCode = http.POST(data);
String response = http.getString();
// 打印HTTP响应内容
Serial.println(response);
// 判断请求是否成功
if (httpResponseCode == 200) {
Serial.println("请求成功");
} else {
Serial.print("请求失败,错误码: ");
Serial.println(httpResponseCode);
}
// 结束HTTP请求
http.end();
// 延迟5秒钟,然后再生成下一组数据
delay(50000000);
}
上传端口
void setup() {
Serial.begin(9600);
}
void loop() {
// 在这里添加你的主要代码逻辑
if (millis() % 1000 == 0) {
Serial.println("Hello, World!");
}
}
连接Wi-Fi
可以发送,调试信息,目前没有测试是否在不重启的情况下,可以进行调试。
#include <WiFi.h>
const char* ssid = "Space X"; // 替换为你的 Wi-Fi 网络名称
const char* password = "Tong990608"; // 替换为你的 Wi-Fi 密码
void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
if (millis() % 1000 == 0) {
Serial.println("Connection established successfully");
}
// 在这里添加你的主要代码逻辑 测试同步
}
发送http请求,并向9600发送状态数据
{“result”:1,“ts”:1688970537422}
请求成功
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "Space X";
const char* password = "Tong990608";
void setup() {
Serial.begin(9600);
delay(1000);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
String url = "http://bj-2-api.iot-api.com/device/v1/xhixxpjpsksvnns9/attributes"; // 意思是
HTTPClient http;
http.begin(url);
http.addHeader("Content-Type", "application/json");
http.addHeader("Project-Key", "cKqv7Z7Ypc");
String data = "{\"temperature\": \"test\", \"humidity\": 69}";
int httpResponseCode = http.POST(data);
String response = http.getString();
Serial.println(response);
if (httpResponseCode == 200) {
Serial.println("请求成功");
} else {
Serial.print("请求失败,错误码: ");
Serial.println(httpResponseCode);
}
http.end();
delay(5000); // 等待5秒钟,然后再发送请求
}
输出温湿度到 9600 测试代码。