背景
nodemcu 以及arduino nano开发板的资源引脚有限,使用mega2560单片机作为系统控制模块的资源优势可以解决很多问题,那么使用mega2560怎么实现物联网的功能呢?
本次教程以连接公用emqx物联网服务器为例,使用mega2560单片机+esp01s模块实现物联网,主要是完成数据上行和数据下行功能。
一、实现思想
mega2560单片机与wifi模块esp01之间的通信是通过AT指令,所以这次的通信还是通过串口完成的.而arduino提供了软串口的方式完成串口通信。
既然是通过软串口的方式,那么就需要为两个模块分别编程,模块之间的串口数据收发,mega2560单片机将采集的传感器数据通过串口发送给esp01模块,esp01模块接受到从而发送给到云服务器上。同样,下行数据是esp01模块接受到服务器下发的消息后,通过at指令发给mega2560从而执行控制功能。
二、ESP01部分
#include
#include
// WiFi
const char *ssid = "XXX"; // Enter your WiFi name
const char *password = "XXXXX"; // Enter WiFi password
// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *topicSub = "/XXX/sub";
const char *topicPub = "/XXX/pub";
const char *mqtt_username = "emqxeqwe";
const char *mqtt_password = "publicdasds";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsMain = 0;
String content = ""; //用来存储
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
//connecting to a mqtt broker
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp8266-client-";
client_id += String(WiFi.macAddress());
Serial.println("Connecting to public emqx mqtt broker.....");
if (client.connect("sdafsafaf",NULL,NULL)) {
Serial.println("Public emqx mqtt broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
client.publish(topicPub, "hello emqx");
client.subscribe(topicSub);
}
void loop() {
// put your main code here, to run repeatedly:
client.loop();
//解析MEGA2560单片机发来的消息
while (Serial.available() > 0)
{
content += char(Serial.read()); //使用这个直接循环加起来
delay(5);
}
if (content.length() > 0)
{
//Serial.println(content);
char attributes[100];
content.toCharArray( attributes, 100 );
client.publish(topicPub,attributes);
content = "";
}
}
void callback(char *topic, byte *payload, unsigned int length) {
String message;
for (int i = 0; i length; i++) {
message = message + (char) payload[i]; // convert *byte to string
}
Serial.print(message);
}
三、mega2560部分
#include
//mega2560的12号引脚接外设的RX端 11号接外设的TX端
SoftwareSerial mySerial(11, 12); // RX, TX
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
mySerial.begin(9600);
}
void loop() { // run over and over
//读取ESP8266 发来的消息
while (mySerial.available() > 0)
{
content += char(mySerial.read()); //使用这个直接循环加起来
delay(2);
}
if (content.length() > 0)
{
Serial.println(content);
//将接收的消息进行比对
if(content=="LED3")
{
digitalWrite(LED3,!digitalRead(LED3));
}
if(content=="LED4")
{
digitalWrite(LED4,!digitalRead(LED4));
}
if(content=="LED5")
{
digitalWrite(LED5,!digitalRead(LED5));
}
if(content=="LED6")
{
digitalWrite(LED6,!digitalRead(LED6));
}
content = "";
}
//mega2560 发给wifi模块
if (millis() - lastMsMain >= 5000) //5s
{
lastMsMain = millis();
String a =publicMessage();
mySerial.print(a);
}
}
本文章来源于互联网,如有侵权,请联系删除!
相关推荐: 华为担纲建设基础软硬件国家新一代AI开放创新平台
【摘要】 全栈全场景AI能力爆发! 【上海,2019年8月29日】 凭借领先的全栈全场景AI能力华为入选国家新一代人工智能开放创新平台 8月29日,科技部在2019世界人工智能大会宣布,将依托华为建设基础软硬件国家新一代人工智能开放创新平台,面向各行业、初创公…