本文介绍了基于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无线蓝牙温湿度和距离测量系统相关推荐

  1. LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

    目录 1.项目概述 2.项目架构 3.传感器和控制器 3.1.传感器 3.2.控制器 4.硬件环境 5.Arduino功能设计 6.LabVIEW功能设计 6.1.前面板设计 6.2.程序框图设计 1 ...

  2. 中国无线蓝牙打印机行业市场供需与战略研究报告

    无线蓝牙打印机市场的企业竞争态势 该报告涉及的主要国际市场参与者有BROTHER INDUSTRIES.Canon.Zebra Technologies.HP Development.Honeywel ...

  3. 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计

    1617基于数字电路交通灯信号灯控制系统设计(仿真电路,论文报告)  摘  要:交通灯控制系统在城市交通控制中发挥着重要的作用,本次课程设计就是以城市交通灯控制系统为背景的,主要通过运用学过的数字电路 ...

  4. 54、基于51单片机饮水机温度水位控制无线蓝牙APP控制报警系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+开题报告+元器件清单等)

    方案的选择 方案一:采用51单片机作为控制核心,配合无线蓝牙模块.水温加热模块继电器开关.基于Dallas单线数字式的DS18B20温度传感器模块.蜂鸣器报警模块.按键模块.LCD1602液晶显示器模 ...

  5. Arduino 无线继电器 蓝牙 4.0 BLE XBEE 24L01 4路遥控开关

    蓝牙4.0 技术交流讨论群 : 228014986 Arduino 无线遥控继电器 可以通过iPhone(配ZBmodule蓝牙4.0BLE模块)或Android智能手机(配蓝牙2.1模块)控制4路电 ...

  6. arduino nano 蓝牙_ESP32模拟无线蓝牙鼠标自制翻页笔神器

    平时的PPT翻页笔需要插入USB信号接收器,安装相应的驱动,在实际使用过程当中发现并不是每台电脑都能够直接正常的使用,接收器有时也因为反复拔插很容易坏掉导致无法正常使用.ESP32开发板带有WIFI和 ...

  7. arduino蓝牙通讯代码_一种基于Arduino的蓝牙通信系统的制作方法

    本实用新型涉及无线通信技术领域,具体来说,涉及一种基于Arduino的蓝牙通信系统. 背景技术: 随着通信技术的发展,无论是在物联网,还是互联网,传统的有线传输技术已经越来越不能满足企业和个人的需求. ...

  8. NanoPi NEO Air使用三:OverlayFS、CPU温度和频率、wifi、蓝牙、npi-config

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  9. arduino使用oled代码_如何做一个Arduino无线气象站

    今天我们来介绍如何利用DHT22传感器测量室外温度和湿度,并使用NRF24L01收发器模块将该数据无线发送到室内单元.在室内单元中,还有一个用于测量室内温度和湿度的DHT22传感器,以及一个DS323 ...

最新文章

  1. 微软考虑将 Python 作为 Excel 官方脚本语言
  2. deepin配置反向代理映射本地到公网
  3. python response.json()报错_python:解析requests返回的response(json格式)说明
  4. Java - Get a list of all Classes loaded in the JVM[转]
  5. Self Service Password (SSP)
  6. pandas处理大数据的一些小技巧
  7. Linux shell:执行shell脚本的几种方式
  8. 实现indexof()
  9. TCP\IP协议实践:wireshark抓包分析之链路层与网络层
  10. linux 信号量_SystemV IPC通信信号量
  11. python 打包过程
  12. 网络存储磁带库术语解释
  13. 工业摄像头传感器尺寸与像元尺寸的关系
  14. between and 用法
  15. 播布客教学视频_C学习笔记_9.1_整形转字符串
  16. Lp_LIBRARY 相关问题解决
  17. 【JS】隐匿在计算机软硬件背后的语言
  18. Apache 配置------FastCGI方式使用PHP(包含:linux下编译安装fmod_fcgid,配置apache以支持FastCGI)
  19. IBM笔记本选购注意事项(笔记本是一个大物品,所以会三思而后行的)
  20. 文秘专业计算机基础考题,文秘计算机测试题.doc

热门文章

  1. Unity3d Mesh、Texture、UI 压缩降低内存
  2. [arch Linux IDEA] 搭配MariaDB的JDBC
  3. matlab 画思维图像,「4」图像思维
  4. 在Redhat9上安装Oracle 9.2
  5. 通过three.js实现3d模型展示
  6. 推荐几个不错的编程学习网站
  7. 开发一个App来为你的女神“化妆”!
  8. 真 · 前端Vue实战:头条新闻开发项目(下)
  9. 谁将泡泡玛特推上千亿市值神坛?
  10. 线段与线段交点的求解