arduino监控温度 python显示温度变化

传感器模块 dht11(供电3.3v|5v 测量范围,精度:-20~60 +-2℃ 5~95 +-5%RH 分辨率0.1 响应:5s 工作温度0-50)价格3.89
arduino (unor3 atmega328p) 36.8
杜邦线(公对母 20cm )3.13

arduino代码

改变为统一输出(小坑 统一输出时字符串中有回车回导致多次输出)

点击查看代码

#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.println("/n");
  int chk = DHT11.read(DHT11PIN);
   Serial.print("Read sensor: ");
  switch (chk)
  {
    case DHTLIB_OK: 
                Serial.println("OK"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.println("Checksum error"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.println("Time out error"); 
                break;
    default: 
                Serial.println("Unknown error"); 
                break;
  }
  String s = "dht11:";
  s.concat("Humidity (%): ");
  s.concat((float)DHT11.humidity);

   s.concat("  Temperature (oC): ");
    s.concat((float)DHT11.temperature);
  Serial.println(s);
 delay(2000);
}

python串口获取数据

读取arduino串口数据并保存

模块serial 主要方法 readline() 读取串口数据 decode() 读进来的数据是bytes形式,需要转化为字符串格式
数据保存到sqlite db文件中
数据 时间 温度 湿度 时间戳

点击查看代码

from datetime import datetime
from time import sleep
import serial
import sqlite3,time,re


class read_com:
    ser = serial.Serial('com3', 9600)

    def get_data(self):
        # sleep(2)
        data = self.ser.readline()  # 按行读取串口数据进来
        data = data.decode()  # 读进来的数据是bytes形式,需要转化为字符串格式
        return data


con=sqlite3.connect(r'C:\Users\*\Videos\buffer\ard.db')
c=con.cursor()
c.execute("create table if not exists temp (date timestamp not null default (datetime('now','localtime')),t integer,h integer,point integer)")
con.commit()
g=read_com()

max=10
while True:
    inss=[]
    for i in range(max):
        data=g.get_data()
        print(data,flush=True)
        try:
            h,t=re.findall('(\d{2})\.',data)
        except:
            continue
        now= time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 
        strap= int(time.time())
        inss.append((now,t,h,strap))
   
    c.executemany('insert into temp(date,t,h,point) values(?,?,?,?)',inss)
    con.commit()
    pass

python画折线图

一小时内 均匀取25条数据(过大无法分辨x轴)

点击查看代码
from pylab import *

def draw_pic(x,y,xlabel='xx',ylabel='yy'):
    mpl.rcParams['font.sans-serif'] = ['SimHei']  # 添加这条可以让图形显示中文
   

    # plot中参数的含义分别是横轴值,纵轴值,线的形状,颜色,透明度,线的宽度和标签
    if len(y)==2:
        plt.plot(x,y[0], 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label=xlabel)
        plt.plot(x,y[1], 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label=xlabel)
    else:
        plt.plot(x,y, 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label=xlabel)

    # 显示标签,如果不加这句,即使在plot中加了label='一些数字'的参数,最终还是不会显示标签
    plt.legend(loc="upper right")
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    plt.show()
def arduino_1_min(n=60):
    con=sqlite3.connect(r'C:\Users\xin\Videos\buffer\ard.db')
    c=con.cursor()
    start=int(time.time())-n
    data=c.execute('select *from temp where point>{} order by date '.format(start)).fetchall()
    if n>60:
        l=1
    x=[i[0][-4-l:] for i in data]
    y=[i[1] for  i in data]
    y2=[i[2] for  i in data]
    all_l=len(x)
    mul=all_l//25
    if mul>2:
        x=x[::mul]
        y=y[::mul]
        y2=y2[::mul]

    
    # y=(y,y2)
    draw_pic(x,y,xlabel='time',ylabel='sta')

arduino_1_min(3600)

数据更新

使用esp8266作为主设备通过局域网传递信息
代码中添加网络支持
arduino

点击查看代码

#include <OneWire.h>
#include <DallasTemperature.h>

// 数据输出脚接开发板数字引脚2
#define ONE_WIRE_BUS 5 //D1

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);


#include <ESP8266WiFi.h> 
#define AP_SSID "esp"//const char *ssid = "EPS8266";
#define AP_PSW  "2466315535"//const char *password = "12345678";
 
const IPAddress serverIP(192, 168, 31, 99); //欲访问的地址
uint16_t serverPort = 4530;         //服务器端口号
 
WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
void setup()
{   Serial.begin(9600);
    Serial.println();
 
    WiFi.mode(WIFI_STA);
    WiFi.begin(AP_SSID, AP_PSW);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Connected");
    Serial.print("IP Address:");
    Serial.println(WiFi.localIP());
 

    
}
 
void loop()
{ 
   sensors.requestTemperatures(); // 发送命令获取温度
   float h=sensors.getTempCByIndex(0); 
   
   Serial.println("尝试访问服务器");
    if (client.connect(serverIP, serverPort)) //尝试访问目标地址
    {
        Serial.println("访问成功");
        Serial.println(String(h));
        client.print(String(h));                    //向服务器发送数据
 /*       while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据
        {
            if (client.available()) //如果有数据可读取
            {
                String line = client.readStringUntil('\n'); //读取数据到换行符
                Serial.print("读取到数据:");
                Serial.println(line);
                //client.write(line.c_str()); //将收到的数据回发
            }
        }
 */       
        Serial.println("关闭当前连接");
        client.stop(); //关闭客户端
    }
    else
    {
        Serial.println("访问失败");
        client.stop(); //关闭客户端
    }
    delay(1000);
}

python tcp服务器

点击查看代码
class tcp_server_accept:
    # 创建tcp服务端套接字
    # 参数同客户端配置一致,这里不再重复
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 设置端口号复用,让程序退出端口号立即释放,否则的话在30秒-2分钟之内这个端口是不会被释放的,这是TCP的为了保证传输可靠性的机制。
    tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 给客户端绑定端口号,客户端需要知道服务器的端口号才能进行建立连接。IP地址不用设置,默认就为本机的IP地址。
    tcp_server.bind(("192.168.31.99", 4530))

    def get(self):
        self.tcp_server.listen(128)
        tcp_client, tcp_client_address= self.tcp_server.accept()
        # 代码执行到此说明连接建立成功
        # print("客户端的ip地址和端口号:", tcp_client_address)
        recv_data = tcp_client.recv(1024)
        # 对服务器发来的数据进行解码保存到变量recv_content中
        recv_content = recv_data.decode(encoding = "utf-8")
        # print("接收客户端的数据为:", recv_content)
        # 关闭服务与客户端的套接字, 终止和客户端通信的服务
        tcp_client.close()
        return recv_content
调用
点击查看代码

con=sqlite3.connect(r'C:\Users\xin\Videos\buffer\ard.db')
c=con.cursor()
c.execute("create table if not exists temp (date timestamp not null default (datetime('now','localtime')),t integer,point integer primary key)")
con.commit()
data_input=tcp_server_accept()

max=10
while True:
    inss=[]
    for i in range(max):
        data=data_input.get()
        data=int(float(data)*100)
        if data==12700:
            continue
        now= time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 
        print(now,data,flush=True)
        strap= int(time.time())
        inss.append((now,data,strap))
   
    # c.executemany('insert or ignore into temp(date,t,point) values(?,?,?)',inss)
    # con.commit()
    pass

posted @ 2022-07-24 16:27  caiusxin  阅读(155)  评论(0)    收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css