e4a 蓝牙温度app_IIOT应用之Arduino无线蓝牙温湿度和距离测量系统
本文介绍了基于Arduino的无线/蓝牙温湿度和距离测量系统,包括下位机和上位机。
下位机功能有温湿度和距离采集,OLED显示处理,LED显示报警,蓝牙模块可与手机等蓝牙设备交互,无线模块(HC-12模块 433M)可与上位机(需要另外一块HC-12模块加TTL转USB转接)交互。
上位机(Python)功能与下位机(Arduino)交互,将信息呈现,保存数据并生成BI report分析。
所需硬件:Arduino UNO单片机/SR-04超声波测距模块/DH11温湿度传感器/I2C 0.96 OLED/蓝牙模块HC-08/无线433M模块HC-12(配对使用)/发光二极管与限流电阻/9V电池与电池扣/面包板与杜邦线若干。
零部件简介
SR-04超声波测距模块
SR-04超声波测距模块测距精确,还很便宜,在各种DIY中广泛应用。模块的测距原理比较简单,首先在TRIG控制口发一个10US以上的高电平,然后在ECHO接收口等待高电平输出,一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,该值即为声音来回的时间,根据下面的公式就可计算出距离。
测试距离=(声音来回时间乘以声速)/2
声音在各介质中传播速度不同,正常使用SR-04超声波测距模块均在空气中,所以该处声速取 340 m/s 。
注意SR-04超声波测距模块最大测距为4.5米,精度0.2厘米。
DH11温湿度传感器
DHT11温湿度传感器包括一个电阻式感湿元件和一个NTC测温元件,可以检测周围环境的湿度和温度。如果想要更高的测量范围和测量精度,可以选择DHT22温湿度传感器。
蓝牙通信模块HC-08
该模块实际就是串口的透传模式。可以快捷实现手机与下位机通信。
无线通信模块HC-12
该模块能够在多个Arduino开发板之间进行远程无线通信,距离可达1.8km。也是串口透传模式
下位机arduino代码
#include
#include
#include
#include
#define DHTTYPE DHT11
#define DHTPIN 2
#define trigPin 3
#define echoPin 4
#define ledout 5
long aver[3];
long duration, distance;
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(128, 64); //OLED屏设置
//SoftwareSerial HC08(7, 6); // HC-12 TX Pin, HC-12 RX Pin
SoftwareSerial HC12(7, 6); // HC-12 TX Pin, HC-12 RX Pin
void setup() {
pinMode(ledout,OUTPUT);
Serial.begin(9600);
//HC08.begin(9600); // Serial port to HC08
HC12.begin(9600); // Serial port to HC12
delay(100);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setRotation(0);
display.setTextWrap(false);
display.dim(0);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
dht.begin(); //DHT开始工作
}
void measure() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
distance = duration *0.034 / 2; //测距过程
}
void lightalarm()
{
int i;
for(i=0;i<3;i++)
{
digitalWrite(ledout,HIGH);
delay(200);
digitalWrite(ledout,LOW);
delay(200);
}
}
void loop() {
//BMMC IIOT
display.clearDisplay();
display.setTextSize(2); //字体大小设置
display.setCursor(0, 10);
display.println("BMMC");
display.setCursor(0, 30);
display.println("IIOT DEMO");
display.display();
delay(3000);
//Distance
for (int i=0;i<=2;i++) {
measure();
aver[i]=distance;
delay(50);
}
distance=(aver[0]+aver[1]+aver[2])/3; //取三次测量平均
if (distance>30)
{
lightalarm();
HC12.println("Distance Alarm"); // Send that data to HC-12
HC12.print(distance); // Send that data to HC-12
HC12.println("cm"); // Send that data to HC-12
}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 10);
display.println("Distance:");
display.setCursor(0, 30);
display.println(distance);
display.setCursor(60, 30);
display.println("cm");
display.display();
delay(3000);
//DHT11
float h = dht.readHumidity();//读湿度
float t = dht.readTemperature();//读温度,默认为摄氏度
if (h>60 || t>30)
{
lightalarm();
HC12.println("DHT Alarm"); // Send that data to HC-12
HC12.print(t); // Send that data to HC-12
HC12.println("C"); // Send that data to HC-12
HC12.print(h); // Send that data to HC-12
HC12.println("cm"); // Send that data to HC-12
}
HC12.println("Distance(cm)/Temperature(C)/Humdity(%)");
HC12.println(distance);
HC12.println(t);
HC12.println(h);
display.clearDisplay();
display.setTextSize(2); //字体大小设置
display.setCursor(0, 10);
display.println("Tem:");
display.setCursor(0, 40);
display.println("Hum:");
display.setCursor(110, 10);
display.println("C");
display.setCursor(110, 40);
display.println("%");
display.setCursor(50, 10);
display.println(t);
display.setCursor(50, 40);
display.println(h);
display.display();
delay(3000);
}
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
if(inChar == 'H' || inChar == 'h' )
{
Serial.println("Received-Forward-1s");
Serial.println("Light On 5S");
digitalWrite(ledout,HIGH);
delay(5000);
digitalWrite(ledout,LOW);
}
}
}
上位机Python代码
# UART Tx/Rx demo
import tkinter as tk
from tkinter import ttk
import serial
import threading
class GUI:
def __init__(self):
window = tk.Tk()
window.title("Welcome to BMMC IIOT")
self.uartState = False # is uart open or not
# a frame contains COM's information, and start/stop button
frame_head = tk.Frame(window)
frame_head.grid(row = 1, column = 1)
labelCOM = tk.Label(frame_head,text="BMMC IIOT DEMO")
labelCOM.grid(row = 1, column = 1, padx = 5, pady = 3)
frame_COMinf = tk.Frame(window)
frame_COMinf.grid(row = 2, column = 1)
labelCOM = tk.Label(frame_COMinf,text="COMx: ")
self.COM= tk.StringVar(value = "COM4")
ertryCOM = tk.Entry(frame_COMinf, textvariable = http://self.COM)
labelCOM.grid(row = 1, column = 1, padx = 5, pady = 3)
ertryCOM.grid(row = 1, column = 2, padx = 5, pady = 3)
labelBaudrate = tk.Label(frame_COMinf,text="Baudrate: ")
self.Baudrate = tk.IntVar(value = 9600)
ertryBaudrate = tk.Entry(frame_COMinf, textvariable = self.Baudrate)
labelBaudrate.grid(row = 1, column = 3, padx = 5, pady = 3)
ertryBaudrate.grid(row = 1, column = 4, padx = 5, pady = 3)
labelParity = tk.Label(frame_COMinf,text="Parity: ")
self.Parity = tk.StringVar(value ="NONE")
comboParity = ttk.Combobox(frame_COMinf, width = 17, textvariable=self.Parity)
comboParity["values"] = ("NONE","ODD","EVEN","MARK","SPACE")
comboParity["state"] = "readonly"
labelParity.grid(row = 2, column = 1, padx = 5, pady = 3)
comboParity.grid(row = 2, column = 2, padx = 5, pady = 3)
labelStopbits = tk.Label(frame_COMinf,text="Stopbits: ")
self.Stopbits = tk.StringVar(value ="1")
comboStopbits = ttk.Combobox(frame_COMinf, width = 17, textvariable=self.Stopbits)
comboStopbits["values"] = ("1","1.5","2")
comboStopbits["state"] = "readonly"
labelStopbits.grid(row = 2, column = 3, padx = 5, pady = 3)
comboStopbits.grid(row = 2, column = 4, padx = 5, pady = 3)
self.buttonSS = tk.Button(frame_COMinf, text = "Start", command = self.processButtonSS)
self.buttonSS.grid(row = 3, column = 4, padx = 5, pady = 3, sticky = tk.E)
# serial object
self.ser = serial.Serial()
# serial read threading
self.ReadUARTThread = threading.Thread(target=self.ReadUART)
self.ReadUARTThread.start()
frameRecv = tk.Frame(window)
frameRecv.grid(row = 3, column = 1)
labelOutText = tk.Label(frameRecv,text="Received Data:")
labelOutText.grid(row = 1, column = 1, padx = 3, pady = 2, sticky = tk.W)
frameRecvSon = tk.Frame(frameRecv)
frameRecvSon.grid(row = 2, column =1)
scrollbarRecv = tk.Scrollbar(frameRecvSon)
scrollbarRecv.pack(side = tk.RIGHT, fill = tk.Y)
self.OutputText = tk.Text(frameRecvSon, wrap = tk.WORD, width = 60, height = 20, yscrollcommand = scrollbarRecv.set)
self.OutputText.pack()
frameTrans = tk.Frame(window)
frameTrans.grid(row = 4, column = 1)
labelInText = tk.Label(frameTrans,text="To Transmit Data:")
labelInText.grid(row = 1, column = 1, padx = 3, pady = 2, sticky = tk.W)
frameTransSon = tk.Frame(frameTrans)
frameTransSon.grid(row = 2, column =1)
scrollbarTrans = tk.Scrollbar(frameTransSon)
scrollbarTrans.pack(side = tk.RIGHT, fill = tk.Y)
self.InputText = tk.Text(frameTransSon, wrap = tk.WORD, width = 60, height = 5, yscrollcommand = scrollbarTrans.set)
self.InputText.pack()
self.buttonSend = tk.Button(frameTrans, text = "Send", command = self.processButtonSend)
self.buttonSend.grid(row = 3, column = 1, padx = 5, pady = 3, sticky = tk.E)
window.mainloop()
def processButtonSS(self):
# print(self.Parity.get())
if (self.uartState):
self.ser.close()
self.buttonSS["text"] = "Start"
self.uartState = False
else:
# restart serial port
self.ser.port = self.COM.get()
self.ser.baudrate = self.Baudrate.get()
strParity = self.Parity.get()
if (strParity=="NONE"):
self.ser.parity = serial.PARITY_NONE;
elif(strParity=="ODD"):
self.ser.parity = serial.PARITY_ODD;
elif(strParity=="EVEN"):
self.ser.parity = serial.PARITY_EVEN;
elif(strParity=="MARK"):
self.ser.parity = serial.PARITY_MARK;
elif(strParity=="SPACE"):
self.ser.parity = serial.PARITY_SPACE;
strStopbits = self.Stopbits.get()
if (strStopbits == "1"):
self.ser.stopbits = serial.STOPBITS_ONE;
elif (strStopbits == "1.5"):
self.ser.stopbits = serial.STOPBITS_ONE_POINT_FIVE;
elif (strStopbits == "2"):
self.ser.stopbits = serial.STOPBITS_TWO;
if (self.ser.isOpen()): # open success
self.buttonSS["text"] = "Stop"
self.uartState = True
def processButtonSend(self):
if (self.uartState):
strToSend = self.InputText.get(1.0,tk.END)
bytesToSend = strToSend[0:-1].encode(encoding='ascii')
self.ser.write(bytesToSend)
print(bytesToSend)
else:
print("Not In Connect!")
def ReadUART(self):
# print("Threading...")
while True:
if (self.uartState):
try:
ch = self.ser.read().decode(encoding='ascii')
print(ch,end='')
self.OutputText.insert(tk.END,ch)
except:
print("Something wrong in receiving.")
GUI()
e4a 蓝牙温度app_IIOT应用之Arduino无线蓝牙温湿度和距离测量系统相关推荐
- LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)
目录 1.项目概述 2.项目架构 3.传感器和控制器 3.1.传感器 3.2.控制器 4.硬件环境 5.Arduino功能设计 6.LabVIEW功能设计 6.1.前面板设计 6.2.程序框图设计 1 ...
- 中国无线蓝牙打印机行业市场供需与战略研究报告
无线蓝牙打印机市场的企业竞争态势 该报告涉及的主要国际市场参与者有BROTHER INDUSTRIES.Canon.Zebra Technologies.HP Development.Honeywel ...
- 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计
1617基于数字电路交通灯信号灯控制系统设计(仿真电路,论文报告) 摘 要:交通灯控制系统在城市交通控制中发挥着重要的作用,本次课程设计就是以城市交通灯控制系统为背景的,主要通过运用学过的数字电路 ...
- 54、基于51单片机饮水机温度水位控制无线蓝牙APP控制报警系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+开题报告+元器件清单等)
方案的选择 方案一:采用51单片机作为控制核心,配合无线蓝牙模块.水温加热模块继电器开关.基于Dallas单线数字式的DS18B20温度传感器模块.蜂鸣器报警模块.按键模块.LCD1602液晶显示器模 ...
- Arduino 无线继电器 蓝牙 4.0 BLE XBEE 24L01 4路遥控开关
蓝牙4.0 技术交流讨论群 : 228014986 Arduino 无线遥控继电器 可以通过iPhone(配ZBmodule蓝牙4.0BLE模块)或Android智能手机(配蓝牙2.1模块)控制4路电 ...
- arduino nano 蓝牙_ESP32模拟无线蓝牙鼠标自制翻页笔神器
平时的PPT翻页笔需要插入USB信号接收器,安装相应的驱动,在实际使用过程当中发现并不是每台电脑都能够直接正常的使用,接收器有时也因为反复拔插很容易坏掉导致无法正常使用.ESP32开发板带有WIFI和 ...
- arduino蓝牙通讯代码_一种基于Arduino的蓝牙通信系统的制作方法
本实用新型涉及无线通信技术领域,具体来说,涉及一种基于Arduino的蓝牙通信系统. 背景技术: 随着通信技术的发展,无论是在物联网,还是互联网,传统的有线传输技术已经越来越不能满足企业和个人的需求. ...
- NanoPi NEO Air使用三:OverlayFS、CPU温度和频率、wifi、蓝牙、npi-config
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- arduino使用oled代码_如何做一个Arduino无线气象站
今天我们来介绍如何利用DHT22传感器测量室外温度和湿度,并使用NRF24L01收发器模块将该数据无线发送到室内单元.在室内单元中,还有一个用于测量室内温度和湿度的DHT22传感器,以及一个DS323 ...
最新文章
- 微软考虑将 Python 作为 Excel 官方脚本语言
- deepin配置反向代理映射本地到公网
- python response.json()报错_python:解析requests返回的response(json格式)说明
- Java - Get a list of all Classes loaded in the JVM[转]
- Self Service Password (SSP)
- pandas处理大数据的一些小技巧
- Linux shell:执行shell脚本的几种方式
- 实现indexof()
- TCP\IP协议实践:wireshark抓包分析之链路层与网络层
- linux 信号量_SystemV IPC通信信号量
- python 打包过程
- 网络存储磁带库术语解释
- 工业摄像头传感器尺寸与像元尺寸的关系
- between and 用法
- 播布客教学视频_C学习笔记_9.1_整形转字符串
- Lp_LIBRARY 相关问题解决
- 【JS】隐匿在计算机软硬件背后的语言
- Apache 配置------FastCGI方式使用PHP(包含:linux下编译安装fmod_fcgid,配置apache以支持FastCGI)
- IBM笔记本选购注意事项(笔记本是一个大物品,所以会三思而后行的)
- 文秘专业计算机基础考题,文秘计算机测试题.doc