博主想通过NodeMcu采集超声波传感器上的数据,然后将数据传输到云服务器上,但现今各大网络论坛上对于NodeMcu的开发案例都很少,内容也十分零碎,没有较为完善而且已经可以投入实际应用的文案去学习,因此博主特地写了这篇文章,以一个较为实用的开发,向大家阐述一下如何使用NodeMcu快速高效的将传感器采集到的数据传到云服务器上,并且以Json档的格式实时保存传到云服务器上的传感器数据!
硬件要求
软件要求
本文将使用Arduino IDE对NodeMcu进行编程,主要因为Arduino IDE作为一款官方软件,具有大量Arduino系列下不同开发板进行开发所需用到的库文件,并且使用这款软件进行编译内容十分方便,能够大大缩减项目的开发周期!
Arduino IDE下载(3月1日更新到1.8.12)
https://www.arduino.cn/thread-5838-1-1.html
(出处: Arduino中文社区)
根据教程,一步一步的安装就行了!
Arduino IDE安装esp8266 SDK(Windows)
https://www.arduino.cn/thread-76029-1-1.html
(出处: Arduino中文社区)
需要注意的是,一定要按照默认安装地址!
HC-SR04 需要 5v电压
HC-SR04P 需要 3.3V – 5V电压
我们平时用的HC-SR04,把VCC连接到NodeMcu的vin口就可以工作了
内容取自:《nodemcu初级:利用超声波传感器测距》
内容补充:Arduino IDE 数字引脚 对应 NodeMcu 管脚
#include
const char* ssid = "ABC123";//wifi名称
const char* password = "123456";//wifi密码
const char* host = "123.123.123.123"; //服务器公网ip
const char* deviceid1 = "HC-SR40-01"; // 设置第一个超声波传感器的设备号
//定义引脚编号
const int trigPin = 5; //D4
const int echoPin = 4; //D3
//定义变量
long duration;
int distance;
WiFiServer server(135);//开启135端口,需要注意查看系统是否已经开放该端口号
void setup() {
pinMode(trigPin, OUTPUT); // 将trigPin设置为输出
pinMode(echoPin, INPUT); // 将echoPin设置为输入
Serial.begin(115200);//开启串口监视器
delay(10);
Serial.print("Connecting to");
Serial.println(ssid);
WiFi.begin(ssid, password);//使用名称和密码链接wifi
while (WiFi.status() != WL_CONNECTED) {//如果连接成功跳出循环,没成功则一直尝试连接
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();//开启服务器
Serial.println("Server started");
// Print the IP address
Serial.println(WiFi.localIP());//输出板子的ip
}
int value = 0;
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// //将trigPin设置为HIGH状态10微秒
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 读取echoPin,以微秒为单位返回声波传播时间microseconds
time = pulseIn(echoPin, HIGH);
// // 计算距离
distance= time*0.034/2;
Serial.print("Connecting to");
Serial.println(host);
WiFiClient client;//tcp连接
const int httpPort = 1234; //端口号,需要注意查看系统是否已经开放该端口号
if (!client.connect(host, httpPort)) { //连接失败
Serial.println("connection failed");
Serial.println(WiFi.localIP());
return;
}
//向服务器发送装置的ID、IP地址、传感器检测垃圾高度
client.print("deviceID:");
client.println(deviceid1);
client.print("IP:");
client.println(WiFi.localIP());
client.print("Distance: ");
client.println(distance);
delay(2000);
//读取返回值
while (client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("----------------------------");
delay(5000);
}
# python 版本 2.7.3
import threading
import socket
import json
encoding = 'utf-8'
BUFSIZE = 1024
##获取客户端
class Reader(threading.Thread):
def __init__(self, client):##获取客户端
threading.Thread.__init__(self)
self.client = client
def run(self):##持续接收消息并处理
while True:
data = self.client.recv(BUFSIZE))##接收字节消息
if (data):
string = bytes.decode(data, encoding)##转化为字符串
a = string.split('\r\n')
list1 = map(str, a)##字符串切割,去除“\r\n”
#列表转字典
a1 = []
a2 = []
for i in range(len(list1)):
x = list1[i].split(":")
for z in range(len(x)):
if(z%2==0 or z==0):
a1.append(x[z])
else:
a2.append(x[z])
a3 = dict(zip(a1,a2))
##dump: 将数据写入json文件中
json_str = json.dumps(a3)
#loads: 将字符串转换为字典
new_dict = json.loads(json_str)
#print(new_dict)
#load:把文件打开,并把字符串变换为数据类型
with open("device_HC-SR40","w") as f:
json.dump(new_dict,f)
#print("Loda in file complete!")
with open('device_HC-SR40','r') as load_f:
load_dict = json.load(load_f)
#print(load_dict)
self.client.send("Send successfully")##回复消息
else:
break
# print("close:", self.client.getpeername())
##建立端口监听
class Listener(threading.Thread):
def __init__(self, port):
threading.Thread.__init__(self)
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(("0.0.0.0", port))
self.sock.listen(0)
def run(self):
print("listener started")
while True:
client, cltadd = self.sock.accept()
Reader(client).start()
# client.send("hello you!".encode())
cltadd = cltadd
# print("accept a connect")
lst = Listener(1234) # create a listen thread
lst.start() # then start
(一)Windows 上使用cmd命令行查找空闲端口号 查看方法
(二)Linux Ubuntu上开放指定端口号:
第一步:开启Ubuntu防火墙 查看方法
第二步:开启Ubuntu指定端口
1、安装iptables,在终端输入:
sudo apt-get install iptables
2、添加规则,在终端输入:
sudo iptables -I INPUT -p tcp --dport 1234 -j ACCEP
注意:中间的 “1234” 为所需要开放的端口!
3、保存规则,在终端输入:
sudo iptables-save
4、持续化规则,在终端输入:
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload
提醒:如果是第一次对你的Ubuntu系统开放防火墙,那么可能会在你下一次ssh登录云服务器的时候出现“连接超时”的现象!
博主当时使用的是腾讯云的服务器,出现“连接超时”的原因是这个!
解决方法: 点击查看
在文本编辑中按ESC后执行对文件内容修改后的操作指令:
:wq! 表示保存后退出
:w 表示保存不退出
:q! 表示退出不保存
:! 表示强制退出