在Arduino IDE上对NodeMcu进行编码,向服务器发送超声波传感器采集数据并以json档的格式实时保存数据

博主想通过NodeMcu采集超声波传感器上的数据,然后将数据传输到云服务器上,但现今各大网络论坛上对于NodeMcu的开发案例都很少,内容也十分零碎,没有较为完善而且已经可以投入实际应用的文案去学习,因此博主特地写了这篇文章,以一个较为实用的开发,向大家阐述一下如何使用NodeMcu快速高效的将传感器采集到的数据传到云服务器上,并且以Json档的格式实时保存传到云服务器上的传感器数据!

一、需要准备的元器件清单

硬件要求

  • NodeMcu开发板
  • 路由器
  • HC-SR04(超声波传感器)
  • 跳线
  • USB连接线

软件要求

  • Arduino IDE
  • 云服务器(Ubuntu系统)

二、安装NodeMcu的编译环境

本文将使用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中文社区)
需要注意的是,一定要按照默认安装地址!

三、配置NodeMcu的编译环境

在Arduino IDE上对NodeMcu进行编码,向服务器发送超声波传感器采集数据并以json档的格式实时保存数据_第1张图片

三、NodeMcu与HC-SR04电路连线

  • HC-SR04传感器Vcc连接到 NodeMCU vin 管脚
  • HC-SR04传感器Trig Pin连接到NodeMCU数字I / O D4 管脚
  • HC-SR04传感器Echo Pin连接到NodeMCU数字I / O D3 管脚

HC-SR04 需要 5v电压
HC-SR04P 需要 3.3V – 5V电压
我们平时用的HC-SR04,把VCC连接到NodeMcu的vin口就可以工作了
内容取自:《nodemcu初级:利用超声波传感器测距》

内容补充:Arduino IDE 数字引脚 对应 NodeMcu 管脚
在Arduino IDE上对NodeMcu进行编码,向服务器发送超声波传感器采集数据并以json档的格式实时保存数据_第2张图片

四、在 Arduino IDE 编写代码

#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);
}

五、在 Linux Ubuntu 编写 python 代码

# 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登录云服务器的时候出现“连接超时”的现象!
博主当时使用的是腾讯云的服务器,出现“连接超时”的原因是这个!
解决方法: 点击查看

在这里插入图片描述
(三)一些简单的Linux操作指令

  • cd /home 进入home目录
  • cd 返回上一级目录
  • lsof -i:端口号 查看端口使用情况,如果没返回则表示端口未打开
  • netstat -aptn 查询开放端口
  • rm 文件名 删除文件
  • touch 文件名 创建文件
  • vim 文件名 进入文件进行编辑

在文本编辑中按ESC后执行对文件内容修改后的操作指令:
:wq! 表示保存后退出
:w 表示保存不退出
:q! 表示退出不保存
:! 表示强制退出

你可能感兴趣的:(Nodemcu)