Micropython+esp32+dht11 在oled屏显示时间,温度和湿度的多功能时钟

# -*- coding: utf-8 -*-
#导入所需模块
import network
import ntptime
import gc
from time import sleep
from machine import Pin, I2C, RTC
from ssd1306 import SSD1306_I2C
from dht import DHT11
# 初始化OLED显示屏
i2c=I2C(scl=Pin(18),sda=Pin(19))
led=SSD1306_I2C(128, 64, i2c=i2c)
led.font_load("GB2312-12.fon")
# 初始化WLAN
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# 扫描可用的WiFi网络并打印名称
aa = wlan.scan()
wifi_names=[net[0].decode() for net in aa]
print(wifi_names)
# 初始化LED指示灯
led1 = Pin(2,Pin.OUT)
# 初始化DHT11传感器
dht = DHT11(Pin(14))
# 尝试连接到WiFi
while not wlan.isconnected():
    led1.value(1)
    print('connecting to network...')
    wlan.connect('你的wifi', '你的密码')
    sleep(1)
    led.fill(0)
    led.text("正在链接wifi中...{}".format(p), 2, 0)
    led1.value(0)
    led.show()
    p += 1
    if p == 15:
        while True:
            if not wlan.isconnected():
                wlan.connect('你的wifi', '你的密码')
            try:
                dht.measure()
            except OSError:
                led.fill(0)
                led.text('DHT11传感器检测失败!', 2, 0)
                led.show()
            led.text('环境温度:{}'.format(dht.temperature()), 2, 0)
            led.text('环境湿度:{}'.format(dht.humidity()), 2, 12)
            led.show()
            sleep(1)
            if wlan.isconnected():
                break
# 设置NTP时间同步
ntptime.NTP_DELTA = 3155644800  # 东八区的偏移量
ntptime.host = "ntp.aliyun.com"
ntptime.settime()
# 获取星期的映射
week = ("星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日")
# 主循环
while True:
    gc.collect()
    try:
        dht.measure()
    except OSError:
        led.fill(0)
        led.text('DHT11传感器检测失败!', 2, 0)
        led.show()
    mg = RTC().datetime()
    led.fill(0)
    # 格式化日期,注意mg[3]是星期几的索引,从0开始,所以星期日是索引6
    led.text('日期:{}-{}-{} {}'.format(mg[0], mg[1], mg[2], week[mg[3]]), 2, 0)
    # 格式化时间,mg[4]是小时,mg[5]是分钟,mg[6]是秒
    led.text('时间:{}:{}:{}'.format(mg[4], mg[5], mg[6]), 2, 13)
    # 显示温度和湿度
    led.text('环境温度:{}度'.format(dht.temperature()), 2, 25)
    led.text('环境湿度:{}%'.format(dht.humidity()), 2, 37)
    led.show()
    sleep(1)

 

### 回答1: 要用STM32C8T6和DHT11温度湿度显示OLED幕上,我们需要编写一些程序代码。下面是可能的代码示例: ``` #include <DHT11.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); DHT11 dht11(D1); void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); } void loop() { int chk = dht11.read(DHT11_PIN); if (chk == DHT11_OK) { display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(10,10); display.print("Temperature: "); display.print(dht11.temperature); display.print("C"); display.setCursor(10,20); display.print("Humidity: "); display.print(dht11.humidity); display.print("%"); display.display(); } delay(2000); } ``` 在这个程序中,我们首先定义了OLED显示器的宽度和高度,然后初始化了显示器。在循环中,我们读取DHT11传感器的温度湿度值,将它们显示显示器上。显示文本的位置可以调整,以适应您的OLED尺寸。我们还包括一个2秒的延迟,以避免在显示上刷新文本太快。 请注意,此代码示例使用了DHT11OLED库。库应该先下载并在代码中导入,否则编译时会出现错误。 ### 回答2: 首先,需要准备好以下材料: 1. STM32C8T6主控板 2. DHT11温度湿度传感器 3. OLED显示 4. 接线材料 在开始编写源代码之前,需要将上述材料进行连接。具体的连接方式如下: DHT11的接线方式如下: 1. VCC接STM32C8T6板的5V电源端口 2. GND接STM32C8T6板的GND电源端口 3. DATA接STM32C8T6的GPIO口 OLED显示的接线方式如下: 1. VCC接STM32C8T6的5V电源端口 2. GND接STM32C8T6的GND电源端口 3. SCL接STM32C8T6的GPIO端口 4. SDA接STM32C8T6的GPIO端口 5. RES接STM32C8T6的GPIO端口 6. DC接STM32C8T6的GPIO端口 7. CS接STM32C8T6的GPIO端口 接线完成后,可以开始编写源代码。以下是参考代码,可以根据实际情况进行修改: #include "stm32f10x.h" #include "oled.h" #include "dht11.h" int main(void) { //初始化OLED显示 OLED_Init(); //初始化DHT11传感器 DHT11_Init(); //定义变量,保存温度湿度的值 int temperature, humidity; while(1) { //获取温度湿度的值 DHT11_Read_Data(&temperature, &humidity); //将获取到的温度湿度值进行显示 OLED_ShowNum(0, 0, temperature, 2, 16); OLED_ShowString(2 * 8, 0, "℃", 16); OLED_ShowNum(0, 2 * 8, humidity, 2, 16); OLED_ShowString(2 * 8, 2 * 8, "%", 16); //延时一段时间,避免数据频繁更新 delay_ms(2000); } } 在此代码中,首先进行OLED显示DHT11温度湿度传感器的初始化。然后,定义变量保存温度湿度的值。使用DHT11_Read_Data函数获取温度湿度的值,并且将获取到的温度湿度值进行显示。最后,通过delay_ms函数延时一段时间,避免数据频繁更新导致幕闪烁。 需要注意的是,以上代码仅为参考,具体情况可能需要根据实际情况进行修改。例如,具体的GPIO口需要根据实际的连接情况进行选择。同时,需要根据实际需求自行调整显示内容的位置、大小等参数。 ### 回答3: STM32C8T6是一款高性能的32位单片机DHT11是一个数字湿度温度传感器,OLED是一种小型的有机发光显示器。将这三个设备结合起来,可以制作一个简单的温湿度显示器。 以下是基于STM32C8T6、DHT11OLED的温湿度显示源代码: 首先,我们需要引用必要的库头文件: #include "stm32f10x.h" #include "dht11.h" #include "oled.h" 然后,我们需要定义一些常量和变量来初始化设备和存储输出结果: #define DHT11_DATA_PIN GPIO_Pin_0 #define DHT11_DATA_PORT GPIOA #define OLED_WIDTH 128 #define OLED_HEIGHT 64 uint8_t humi_int, humi_deci, temp_int, temp_deci; char text[20]; 接下来,我们需要实现初始化函数来初始化STM32C8T6和OLED: void init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); DHT11_Init(DHT11_DATA_PORT, DHT11_DATA_PIN); OLED_Init(); } 然后,我们可以实现主函数,以读取温湿度传感器并在OLED显示结果: int main(void) { init(); while (1) { // 读取温湿度 if (DHT11_Read_Pin(DHT11_DATA_PORT, DHT11_DATA_PIN) == 1) { DHT11_Read_Data(&humi_int, &humi_deci, &temp_int, &temp_deci); } // 渲染温湿度幕 sprintf(text, "Temp: %d.%dC", temp_int, temp_deci); OLED_Clear(); OLED_ShowString(0, 0, text, 1); sprintf(text, "Humi: %d.%d%%", humi_int, humi_deci); OLED_ShowString(0, 20, text, 1); OLED_Refresh(); // 等待1s for (volatile int i = 0; i < 1000000; i++); } } 以上就是基于STM32C8T6、DHT11OLED的温湿度显示代码。需要注意的一些细节是: - 在渲染文本字符串之前,我们需要先清除OLED幕上的所有内容。 - 在渲染文本字符串之后,我们需要调用OLED_Refresh()函数才能将结果渲染到实际幕上。 - 我们使用sprintf()函数来将温湿度转换为文本字符串。这个函数可以将格式化的字符串输出到一个字符数组中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值