Micropython学习交流群 学习QQ群:786510434 提供多种固件下载和学习交流。

Micropython-扇贝物联 QQ群:31324057 扇贝物联是一个让你与智能设备沟通更方便的物联网云平台

Micropython学习交流群 学习QQ群:468985481 学习交流ESP8266、ESP32、ESP8285、wifi模块开发交流、物联网。

Micropython老哥俩的IT农场分享QQ群:929132891 为喜欢科创制作的小白们分享一些自制的计算机软硬件免费公益课程,由两位多年从事IT研发的中年大叔发起。

Micropython ESP频道

ESP32(MicroPython) 多功能显示(RTC、DHT11、SR04)


ESP32(MicroPython) 多功能显示(RTC、DHT11、SR04)


本程序用于在LCD1602(I2C)上显示RTC实时时钟、DHT11温湿度传感器、SR04超声波传感器的数据。


普通版本


'''

接线:SCL-->25

     SDA-->26

     DS-->27

     (Trig)-->(12)

     (Echo)-->(14)

'''

 

from machine import Pin,I2C

import time

from i2c_lcd import I2cLcd

import dht

from machine import RTC

from hcsr04 import HCSR04

 

#定义DHT11控制对象

dht11=dht.DHT11(Pin(27))

#定义RTC控制对象

rtc=RTC()

# LCD 1602 I2C 地址

DEFAULT_I2C_ADDR = 0x27

#定义HCSR04控制对象

hcsr04=HCSR04(trigger_pin=12, echo_pin=14)

 

# 初始化GPIO口

# def setup():

# global lcd

i2c = I2C(1,sda=Pin(26),scl=Pin(25),freq=400000)

lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)  # 初始化(设备地址, 背光设置)

 

#定义星期

week=("Mon","Tue","Wed","Thu","Fri","Sat","Sun")

 

# 循环函数

def loop():    

    while True:

        dht11.measure()  #调用DHT类库中测量数据的函数

        temp = dht11.temperature()

        humi = dht11.humidity()

        date_time=rtc.datetime()

        distance=hcsr04.distance_cm()

        lcd.putstr("%d%02d%02d t%d h%d"%(date_time[0],date_time[1],date_time[2],temp,humi))       

        lcd.putstr("%02d:%02d:%02d %s %03d"%(date_time[4],date_time[5],date_time[6],week[date_time[3]],distance))

        time.sleep_ms(1000)  #如果延时时间过短,DHT11温湿度传感器不工作

 

# 程序入口

if __name__ == '__main__':    

#     setup()           # 初始化GPIO口

    loop()            # 循环函数

增加RGB灯(WS2812)


'''

接线:SCL-->25

     SDA-->26

     DS-->27

     (Trig)-->(12)

     (Echo)-->(14)

     WS-->(36)

'''

import random

from machine import Pin,I2C

import time

from i2c_lcd import I2cLcd

import dht

from machine import RTC

from hcsr04 import HCSR04

from neopixel import NeoPixel

 

#定义DHT11控制对象

dht11=dht.DHT11(Pin(27))

#定义RTC控制对象

rtc=RTC()

# LCD 1602 I2C 地址

DEFAULT_I2C_ADDR = 0x27

#定义HCSR04控制对象

hcsr04=HCSR04(trigger_pin=12, echo_pin=14)

pin=23

rgb_num=5

rgb_led=NeoPixel(Pin(pin,Pin.OUT),rgb_num)  

 

# 初始化GPIO口

# def setup():

# global lcd

i2c = I2C(1,sda=Pin(26),scl=Pin(25),freq=400000)

lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)  # 初始化(设备地址, 背光设置)

 

#定义星期

week=("Mon","Tue","Wed","Thu","Fri","Sat","Sun")

 

# 循环函数

def loop():    

    while True:

        dht11.measure()  #调用DHT类库中测量数据的函数

        temp = dht11.temperature()

        humi = dht11.humidity()

        date_time=rtc.datetime()

        distance=hcsr04.distance_cm()

        lcd.putstr("%d%02d%02d t%d h%d"%(date_time[0],date_time[1],date_time[2],temp,humi))       

        lcd.putstr("%02d:%02d:%02d %s %03d"%(date_time[4],date_time[5],date_time[6],week[date_time[3]],distance))

        for i in range(rgb_num):

                a=random.randint(0,255)

                b=random.randint(0,255)

                c=random.randint(0,255)

                rgb_led[i]=(a, b, c)

                rgb_led.write()

        time.sleep_ms(1000)  #如果延时时间过短,DHT11温湿度传感器不工作

 

# 程序入口

if __name__ == '__main__':    

#     setup()           # 初始化GPIO口

    loop()            # 循环函数

以下是外设驱动(非原创,发出是为了方便移植)


hcsr04.py


import machine, time

from machine import Pin

 

__version__ = '0.2.0'

__author__ = 'Roberto Sánchez'

__license__ = "Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0"

 

class HCSR04:

    """

    Driver to use the untrasonic sensor HC-SR04.

    The sensor range is between 2cm and 4m.

    The timeouts received listening to echo pin are converted to OSError('Out of range')

    """

    # echo_timeout_us is based in chip range limit (400cm)

    def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):

        """

        trigger_pin: Output pin to send pulses

        echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor

        echo_timeout_us: Timeout in microseconds to listen to echo pin. 

        By default is based in sensor limit range (4m)

        """

        self.echo_timeout_us = echo_timeout_us

        # Init trigger pin (out)

        self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)

        self.trigger.value(0)

 

        # Init echo pin (in)

        self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)

 

    def _send_pulse_and_wait(self):

        """

        Send the pulse to trigger and listen on echo pin.

        We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received.

        """

        self.trigger.value(0) # Stabilize the sensor

        time.sleep_us(5)

        self.trigger.value(1)

        # Send a 10us pulse.

        time.sleep_us(10)

        self.trigger.value(0)

        try:

            pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)

            return pulse_time

        except OSError as ex:

            if ex.args[0] == 110: # 110 = ETIMEDOUT

                raise OSError('Out of range')

            raise ex

 

    def distance_mm(self):

        """

        Get the distance in milimeters without floating point operations.

        """

        pulse_time = self._send_pulse_and_wait()

 

        # To calculate the distance we get the pulse_time and divide it by 2 

        # (the pulse walk the distance twice) and by 29.1 becasue

        # the sound speed on air (343.2 m/s), that It's equivalent to

        # 0.34320 mm/us that is 1mm each 2.91us

        # pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582 

        mm = pulse_time * 100 // 582

        return mm

 

    def distance_cm(self):

        """

        Get the distance in centimeters with floating point operations.

        It returns a float

        """

        pulse_time = self._send_pulse_and_wait()

 

        # To calculate the distance we get the pulse_time and divide it by 2 

        # (the pulse walk the distance twice) and by 29.1 becasue

        # the sound speed on air (343.2 m/s), that It's equivalent to

        # 0.034320 cm/us that is 1cm each 29.1us

        cms = (pulse_time / 2) / 29.1

        return cms

i2c_lcd.py


from lcd_api import LcdApi

from machine import I2C

from time import sleep_ms

 

# The PCF8574 has a jumper selectable address: 0x20 - 0x27

DEFAULT_I2C_ADDR = 0x27

 

# Defines shifts or masks for the various LCD line attached to the PCF8574

 

MASK_RS = 0x01

MASK_RW = 0x02

MASK_E = 0x04

SHIFT_BACKLIGHT = 3

SHIFT_DATA = 4

 

 

class I2cLcd(LcdApi):

    """Implements a HD44780 character LCD connected via PCF8574 on I2C."""

 

    def __init__(self, i2c, i2c_addr, num_lines, num_columns):

        self.i2c = i2c

        self.i2c_addr = i2c_addr

        self.i2c.writeto(self.i2c_addr, bytearray([0]))

        sleep_ms(20)   # Allow LCD time to powerup

        # Send reset 3 times

        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)

        sleep_ms(5)    # need to delay at least 4.1 msec

        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)

        sleep_ms(1)

        self.hal_write_init_nibble(self.LCD_FUNCTION_RESET)

        sleep_ms(1)

        # Put LCD into 4 bit mode

        self.hal_write_init_nibble(self.LCD_FUNCTION)

        sleep_ms(1)

        LcdApi.__init__(self, num_lines, num_columns)

        cmd = self.LCD_FUNCTION

        if num_lines > 1:

            cmd |= self.LCD_FUNCTION_2LINES

        self.hal_write_command(cmd)

 

    def hal_write_init_nibble(self, nibble):

        """Writes an initialization nibble to the LCD.

        This particular function is only used during initialization.

        """

        byte = ((nibble >> 4) & 0x0f) << SHIFT_DATA

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

 

    def hal_backlight_on(self):

        """Allows the hal layer to turn the backlight on."""

        self.i2c.writeto(self.i2c_addr, bytearray([1 << SHIFT_BACKLIGHT]))

 

    def hal_backlight_off(self):

        """Allows the hal layer to turn the backlight off."""

        self.i2c.writeto(self.i2c_addr, bytearray([0]))

 

    def hal_write_command(self, cmd):

        """Writes a command to the LCD.

        Data is latched on the falling edge of E.

        """

        byte = ((self.backlight << SHIFT_BACKLIGHT) | (((cmd >> 4) & 0x0f) << SHIFT_DATA))

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

        byte = ((self.backlight << SHIFT_BACKLIGHT) | ((cmd & 0x0f) << SHIFT_DATA))

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

        if cmd <= 3:

            # The home and clear commands require a worst case delay of 4.1 msec

            sleep_ms(5)

 

    def hal_write_data(self, data):

        """Write data to the LCD."""

        byte = (MASK_RS | (self.backlight << SHIFT_BACKLIGHT) | (((data >> 4) & 0x0f) << SHIFT_DATA))

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

        byte = (MASK_RS | (self.backlight << SHIFT_BACKLIGHT) | ((data & 0x0f) << SHIFT_DATA))

        self.i2c.writeto(self.i2c_addr, bytearray([byte | MASK_E]))

        self.i2c.writeto(self.i2c_addr, bytearray([byte]))

lcd_api.py


"""Provides an API for talking to HD44780 compatible character LCDs."""

 

import time

 

class LcdApi:

    """Implements the API for talking with HD44780 compatible character LCDs.

    This class only knows what commands to send to the LCD, and not how to get

    them to the LCD.

    It is expected that a derived class will implement the hal_xxx functions.

    """

 

    # The following constant names were lifted from the avrlib lcd.h

    # header file, however, I changed the definitions from bit numbers

    # to bit masks.

    #

    # HD44780 LCD controller command set

 

    LCD_CLR = 0x01              # DB0: clear display

    LCD_HOME = 0x02             # DB1: return to home position

 

    LCD_ENTRY_MODE = 0x04       # DB2: set entry mode

    LCD_ENTRY_INC = 0x02        # --DB1: increment

    LCD_ENTRY_SHIFT = 0x01      # --DB0: shift

 

    LCD_ON_CTRL = 0x08          # DB3: turn lcd/cursor on

    LCD_ON_DISPLAY = 0x04       # --DB2: turn display on

    LCD_ON_CURSOR = 0x02        # --DB1: turn cursor on

    LCD_ON_BLINK = 0x01         # --DB0: blinking cursor

 

    LCD_MOVE = 0x10             # DB4: move cursor/display

    LCD_MOVE_DISP = 0x08        # --DB3: move display (0-> move cursor)

    LCD_MOVE_RIGHT = 0x04       # --DB2: move right (0-> left)

 

    LCD_FUNCTION = 0x20         # DB5: function set

    LCD_FUNCTION_8BIT = 0x10    # --DB4: set 8BIT mode (0->4BIT mode)

    LCD_FUNCTION_2LINES = 0x08  # --DB3: two lines (0->one line)

    LCD_FUNCTION_10DOTS = 0x04  # --DB2: 5x10 font (0->5x7 font)

    LCD_FUNCTION_RESET = 0x30   # See "Initializing by Instruction" section

 

    LCD_CGRAM = 0x40            # DB6: set CG RAM address

    LCD_DDRAM = 0x80            # DB7: set DD RAM address

 

    LCD_RS_CMD = 0

    LCD_RS_DATA = 1

 

    LCD_RW_WRITE = 0

    LCD_RW_READ = 1

 

    def __init__(self, num_lines, num_columns):

        self.num_lines = num_lines

        if self.num_lines > 4:

            self.num_lines = 4

        self.num_columns = num_columns

        if self.num_columns > 40:

            self.num_columns = 40

        self.cursor_x = 0

        self.cursor_y = 0

        self.backlight = True

        self.display_off()

        self.backlight_on()

        self.clear()

        self.hal_write_command(self.LCD_ENTRY_MODE | self.LCD_ENTRY_INC)

        self.hide_cursor()

        self.display_on()

 

    def clear(self):

        """Clears the LCD display and moves the cursor to the top left

        corner.

        """

        self.hal_write_command(self.LCD_CLR)

        self.hal_write_command(self.LCD_HOME)

        self.cursor_x = 0

        self.cursor_y = 0

 

    def show_cursor(self):

        """Causes the cursor to be made visible."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

                               self.LCD_ON_CURSOR)

 

    def hide_cursor(self):

        """Causes the cursor to be hidden."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY)

 

    def blink_cursor_on(self):

        """Turns on the cursor, and makes it blink."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

                               self.LCD_ON_CURSOR | self.LCD_ON_BLINK)

 

    def blink_cursor_off(self):

        """Turns on the cursor, and makes it no blink (i.e. be solid)."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY |

                               self.LCD_ON_CURSOR)

 

    def display_on(self):

        """Turns on (i.e. unblanks) the LCD."""

        self.hal_write_command(self.LCD_ON_CTRL | self.LCD_ON_DISPLAY)

 

    def display_off(self):

        """Turns off (i.e. blanks) the LCD."""

        self.hal_write_command(self.LCD_ON_CTRL)

 

    def backlight_on(self):

        """Turns the backlight on.

        This isn't really an LCD command, but some modules have backlight

        controls, so this allows the hal to pass through the command.

        """

        self.backlight = True

        self.hal_backlight_on()

 

    def backlight_off(self):

        """Turns the backlight off.

        This isn't really an LCD command, but some modules have backlight

        controls, so this allows the hal to pass through the command.

        """

        self.backlight = False

        self.hal_backlight_off()

 

    def move_to(self, cursor_x, cursor_y):

        """Moves the cursor position to the indicated position. The cursor

        position is zero based (i.e. cursor_x == 0 indicates first column).

        """

        self.cursor_x = cursor_x

        self.cursor_y = cursor_y

        addr = cursor_x & 0x3f

        if cursor_y & 1:

            addr += 0x40    # Lines 1 & 3 add 0x40

        if cursor_y & 2:

            addr += 0x14    # Lines 2 & 3 add 0x14

        self.hal_write_command(self.LCD_DDRAM | addr)

 

    def putchar(self, char):

        """Writes the indicated character to the LCD at the current cursor

        position, and advances the cursor by one position.

        """

        if char != '\n':

            self.hal_write_data(ord(char))

            self.cursor_x += 1

        if self.cursor_x >= self.num_columns or char == '\n':

            self.cursor_x = 0

            self.cursor_y += 1

            if self.cursor_y >= self.num_lines:

                self.cursor_y = 0

            self.move_to(self.cursor_x, self.cursor_y)

 

    def putstr(self, string):

        """Write the indicated string to the LCD at the current cursor

        position and advances the cursor position appropriately.

        """

        for char in string:

            self.putchar(char)

 

    def custom_char(self, location, charmap):

        """Write a character to one of the 8 CGRAM locations, available

        as chr(0) through chr(7).

        """

        location &= 0x7

        self.hal_write_command(self.LCD_CGRAM | (location << 3))

        time.sleep_us(40)

        for i in range(8):

            self.hal_write_data(charmap[i])

            time.sleep_us(40)

        self.move_to(self.cursor_x, self.cursor_y)

 

    def hal_backlight_on(self):

        """Allows the hal layer to turn the backlight on.

        If desired, a derived HAL class will implement this function.

        """

        pass

 

    def hal_backlight_off(self):

        """Allows the hal layer to turn the backlight off.

        If desired, a derived HAL class will implement this function.

        """

        pass

 

    def hal_write_command(self, cmd):

        """Write a command to the LCD.

        It is expected that a derived HAL class will implement this

        function.

        """

        raise NotImplementedError

 

    def hal_write_data(self, data):

        """Write data to the LCD.

        It is expected that a derived HAL class will implement this

        function.

        """

        raise NotImplementedError


————————————————

版权声明:本文为CSDN博主「路易斯720」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_74155302/article/details/131005059



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 ESP56.com All Rights Reserved

执行时间: 0.009843111038208 seconds