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

浙公网安备 33010602011771号