ESP32入门:添加链接描述
模拟ESP32环境的在线工具:地址
Esp32的引脚知识:添加链接描述
ESP32(基于Arduino)连接EMQX的Mqtt服务器上传信息与命令控制:添加链接描述
TTL转RS-485模块:添加链接描述
等ttl转rs485模块到了,参考这篇文章:添加链接描述
Esp32连接mqtt服务器
#include <WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
#include <ArduinoJson.h>
StaticJsonDocument<200> sensor_json;
String realmsg="";
int LED=2;
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "1234";
const char* password = "123690tyq";
const char* mqttServer = "47.113.146.63";//服务器ip
//发布的消息字段
typedef struct {
int msg1;
int msg2;
int msg3;
}msg;
int count=0;//发布消息间隔
// 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
// http://www.taichi-maker.com/public-mqtt-broker/
//------------------全局变量定义-----------------
msg mymsg={123,45,6};//定义消息结构体
Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
//------------------全局变量定义-----------------
void tickerCount(){//Ticker回调函数
count++;
//数据测试
sensor_json["msg1"] = 12;
sensor_json["msg2"] =21;
sensor_json["msg3"] = 98;
serializeJson(sensor_json, realmsg);
}
//发布
void pubmsg( const String &topicString, const String &messageString){
char publishTopic[topicString.length() + 1];
strcpy(publishTopic, topicString.c_str());
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
// 实现ESP8266向主题发布信息
if(mqttClient.publish(publishTopic, publishMsg)){
Serial.println("Publish Topic:");Serial.println(publishTopic);
Serial.println("Publish message:");Serial.println(publishMsg);
} else {
Serial.println("Message Publish Failed.");
}
}
void setup() {
// pinMode(LED, OUTPUT); // 设置板上LED引脚为输出模式
// digitalWrite(LED, LOW); // 启动后关闭板上LED
Serial.begin(9600); // 启动串口通讯
// 设置定时周期为2s,回调函数为tickerCount
ticker.attach(2, tickerCount); //每过2s调用其回调函数
//设置ESP8266工作模式为无线终端模式
WiFi.mode(WIFI_STA);
// 连接WiFi
connectWifi();
// 设置MQTT服务器和端口号
mqttClient.setServer(mqttServer, 1883);
mqttClient.setCallback(receiveCallback);
// 连接MQTT服务器
connectMQTTserver();
}
void loop() {
if (mqttClient.connected()) { // 如果开发板成功连接服务器
if (count >= 2){
pubmsg("device/date",realmsg);
realmsg="";
count = 0;
}
mqttClient.loop(); // 处理信息以及心跳
} else { // 如果开发板未能成功连接服务器
connectMQTTserver(); // 则尝试连接服务器
}
}
// 连接MQTT服务器并订阅信息
void connectMQTTserver(){
// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
String clientId = "esp8266-" + WiFi.macAddress();
// 连接MQTT服务器
if (mqttClient.connect(clientId.c_str())) {
Serial.println("MQTT Server Connected.");
Serial.println("Server Address:");
Serial.println(mqttServer);
Serial.println("ClientId: ");
Serial.println(clientId);
subscribeTopic(); // 订阅指定主题
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(5000);
}
}
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message Received [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println("");
Serial.print("Message Length(Bytes) ");
Serial.println(length);
int temp=0;
while(*topic){
temp++;
topic++;
}
Serial.println("主题长度:");
Serial.println(temp);
if(temp>11){
if((char)topic[11]=='1'){
if ((char)payload[0] == 'O' && (char)payload[1] == 'F') { // 如果收到的信息以“1”为开始
digitalWrite(LED, LOW); // 则点亮LED。
} else {
digitalWrite(LED, HIGH); // 否则熄灭LED。
}
}
}
}
// 订阅指定主题
void subscribeTopic(){
// 通过串口监视器输出是否成功订阅主题1以及订阅的主题1名称
if(mqttClient.subscribe("device/dev/123")){
Serial.println("Subscrib Topic:");
Serial.println("device/action");
} else {
Serial.print("Subscribe Fail...");
}
// 通过串口监视器输出是否成功订阅主题2以及订阅的主题2名称
}
// ESP8266连接wifi
void connectWifi(){
WiFi.begin(ssid, password);
//等待WiFi连接,成功连接后输出成功信息
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Connected!");
Serial.println("");
}
esp32接土壤氮磷钾传感器(这里更改了arduino uno硬件篇里的ttl转rs485模块)
//TX 16
//RX 17
#include <Arduino.h>
#include <HardwareSerial.h>
unsigned char item[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x08,0x44, 0x0C};
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
Serial2.begin(9600);
while (!Serial)
; // wait for serial port to connect. Needed for Leonardo only
}
void loop()
{
String data = "";
// char buff[128]; // 定义存储传感器数据的数组
// String info[11];
Serial.println("输入的指令为:");
for (int i = 0; i < 8; i++)
{ // 发送测温命令
Serial2.write(item[i]); // write输出
Serial.println(item[i]);//测试
}
delay(100); // 等待测温数据返回
data = "";
Serial.println();
Serial.println("输出的指令为:");
while (Serial2.available())
{ //从串口中读取数据
unsigned char in = (unsigned char)Serial2.read(); // read读取
Serial.print(in, HEX);
Serial.print(',');
data += in;
data += ',';
}
Serial.println(";");
Serial.println();
delay(3000);
}
因为我现在身边没准备土壤,传感器便置于空气中,起码这个测出来的空气数据是准确的
注意:这里的土壤传感器和水泵需要5v及以上供电,esp32的3.3v带不动,同时esp32需要3.3v供电,后面我的太阳能供电会使用到降压模块。
蜂鸣器部分:
#define beep_pin 33
char g_i=0;
void setup() {
pinMode(beep_pin, OUTPUT);//设置引脚为输出模式
}
void loop() {
g_i=!g_i;
digitalWrite(beep_pin,g_i);//引脚输出电平翻转
delayMicroseconds(250);//延时250us
}
ESP32使用Arduino环境驱动全彩RGB红绿蓝雾状共阳LED:rgb三色灯