树莓派学习笔记(四)——温湿度检测(本地OLED显示、ONENET云平台显示)

前言

用树莓派4b做一个温湿度检测仪,温湿度传感器模块SHT20收集温湿度数据,在OLED SSD1306上显示,同时把数据上传到onenet平台用网页显示。

所需材料:树莓派SHT20温湿度传感器 ;Oled屏幕 ssd1306/1106;杜邦线;面包板

本文所出现的代码均在我的码云上,地址:temperater程序

[2020.6.11]

一、硬件连接

SHT20和SSD1306和树莓派之间使用I2C总线通信方式,引脚连接如下:

GND---GND
VCC---3.3V
SCL---SCL
SDA---SDA

SHT20:

在这里插入图片描述

SSD1306:

img

树莓派引脚图:

rpi-pins-40-0


二、树莓派开启I2C功能

参考1:SHT20温湿度采集

参考2:I2C接口的OLED在树莓派上的应用

1、使能I2C Kernel Module

远程登陆树莓派后,输入sudo raspi-config 后,选择5.Interfacing Options 选择P5 I2C 选择 ,如下图所示:

在这里插入图片描述

在这里插入图片描述

2、安装I2C-Tools

sudo apt-get install i2c-tools
sudo apt-get install python-smbus
sudo adduser pi i2c
sudo reboot

安装完成后输入i2cdetect -y 1,检查各个模块的地址

图中0x40是SHT20地址, 0x30是OLED屏幕的地址


三、本地温度显示

1、安装luma.oled的包

sudo apt-get install libfreetype6-dev libjpeg-dev build-essentia
sudo apt-get install python3-dev python3-pip
sudo -H pip3 install --upgrade luma.oled

注:目前已经不支持python3以下的版本更新了

2、点亮oled屏幕

运行oled2.py(python3运行)python3 oled2.py

# oled2.py
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
import time
import socket
import fcntl
import struct

serial = i2c(port=1, address=0x3C)
oled = ssd1306(serial)


def getIP(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15].encode('utf-8'))
    )[20:24])


def oledIP():
    with canvas(oled) as draw:
        draw.text((2, 5), "IP: " + getIP("wlan0") + '\n' + "I'm working\nbut no people", fill=255)


def oledinit():
    serial = i2c(port=1, address=0x3C)
    oled = ssd1306(serial)


def oleddisplay(In, x, y):
    with canvas(oled) as draw:
        # draw.rectangle(device.bounding_box, outline="white", fill="black")
        draw.text((x, y), In, fill="white")

'''
if __name__ == "__main__":
    oledinit()
    # oledIP()
    In = "hello "
    oleddisplay(In, 15, 20)
    '''
oledinit()
while (1):

    oledIP()
    #In = "hello "
    oleddisplay(In, 15, 20)
    time.sleep(3)

显示效果:

img

3、本地温湿度检测

运行temp_local.py(python2.7运行)python temp_local

代码如下:

# temp_local.py
import smbus
import time

F8X16=										    \
(										    \
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
  0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,\
  0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
  0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,\
  0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,\
  0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,\
  0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,\
  0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
  0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,\
  0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,\
  0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,\
  0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,\
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,\
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,\
  0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,\
  0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,\
  0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,\
  0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,\
  0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,\
  0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,\
  0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,\
  0x00,0xE0,0x10,0x88,0x88,0x18,0x00
智能家居温湿度和烟雾监测系统实现本地显示OneNET 云平台远程监控,可采用以下方案和技术: ### 硬件选择 选用 STM32 单片机作为核心控制单元,因其在集成电路芯片上集成了中央处理器 CPU、数据存储器 RAM、程序存储器 ROM、定时/计数器、中断系统、时钟部件的集成和 I/O 接口电路等元件,具有体积小、价格低、可靠性高、开发应用方便等特点,适用于智能仪表领域 [^4]。同时搭配烟雾和气敏传感器、温湿度传感器用于数据采集,再结合 ESP - 8266 通信模块用于连接网络 [^3]。 ### 数据采集本地显示 通过烟雾和气敏传感器以及温湿度传感器实时采集烟雾浓度、温湿度数据。采集到的数据可直接传输到 STM32 单片机进行处理,处理后的数据可在本地连接的显示屏上进行显示,让用户在现场就能直观了解环境数据 [^1][^3]。 ### 数据上传至 OneNET 云平台 ESP - 8266 通信模块与传感器和 STM32 单片机相连,将采集到的温湿度、烟雾浓度等数据通过 WiFi 上传到 OneNET 云平台。利用 ESP - 8266 模块的网络通信功能,将数据以特定的格式和协议发送至云平台,实现数据的远程传输 [^3]。 ### 云平台功能实现 OneNET 云平台接收到数据后,可对数据进行实时监测。平台可以设置阈值,当烟雾浓度过高、温度过高等情况发生时,触发阈值预警功能,例如通过蜂鸣器报警等方式提醒用户 [^1][^3]。还能实现 QQ 邮箱提示等功能,让用户及时了解异常情况。此外,云平台支持网页端和手机 APP 访问,用户可以在网页或 APP 上实时查看数据的变化情况 [^1][^2]。 ### 远程交互与控制 通过 HTTPS 协议使微信小程序与云平台进行交互,用户可以在微信小程序中通过 get 请求获取云平台上的数据。同时,用户还能在云平台界面上点击按钮,完成对家里电器设备的控制,如窗帘开关、空调开关、电视开关(采用 LED 灯模拟)等 [^2][^3]。 以下是一个简单的伪代码示例,展示数据采集和上传的基本逻辑: ```python # 模拟传感器数据采集 def collect_sensor_data(): # 模拟采集温湿度和烟雾浓度数据 temperature = get_temperature() humidity = get_humidity() smoke_concentration = get_smoke_concentration() return temperature, humidity, smoke_concentration # 模拟数据上传到 OneNET 云平台 def upload_data_to_cloud(temperature, humidity, smoke_concentration): # 建立与 OneNET 云平台的连接 connect_to_onenet() # 封装数据 data = { "temperature": temperature, "humidity": humidity, "smoke_concentration": smoke_concentration } # 上传数据 send_data_to_onenet(data) # 主循环 while True: temperature, humidity, smoke_concentration = collect_sensor_data() upload_data_to_cloud(temperature, humidity, smoke_concentration) # 适当延时 delay(1000) ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值