Junior i elektronika: Wyświetlamy temperaturę na ekranie LCD

in #pl-artykuly6 years ago (edited)

Zacznę od przedstawienia efektu końcowego:

Wyświetlacz LCD 2x16 podłączony przez płytkę stykową do Raspberry Pi Zero, który odbiera dane od cyfrowego czujnika temperatury DS18B20 oraz od analogowego czujnika światła GL5537-1. Podłączyłem również niebieską diodę, która zapala się przy natężeniu światła mniejszym niż 80%.

Wyświetlacz LCD

Podłączenie wyświetlacza okazało nader trudnym zadaniem do którego podchodziłem z trzy razy w różnych odstępach czasowych. Samo podłączenie odpowiednich kabli do pasujących pinów nie stanowiło większego problemu, problem polegał na tym, że wetknięte przewody nie za mocno trzymają się płytki stykowej, więc wystarczył minimalny ruch by dochodziło do rozłączenia. Przy pracy wspomagałem się poradnikami na YouTubie, których nie brakowało.

Należy podłączyć cztery piny od przesyłu danych, RS, RW, podświetlenie, zasilanie, uziemienie i kontrast. Ten ostatni jest ważny ponieważ jeśli nie posiada się potencjometru (tak jak ja) kontrast należy wyregulować kombinacją rezystorów. Metoda prób i błędów w tym przypadku nie zawiodła.

Od strony programistycznej wykorzystałem pythonową bibliotekę Adafruit_CharLCD dostępną w internecie. Następnie powiedziałem programowi do jakich pinów popodłączałem odpowiednie porty i voilà.

import Adafruit_CharLCD as LCD

lcd_rs = 25
lcd_en = 24
lcd_d4 = 23
lcd_d5 = 17
lcd_d6 = 18
lcd_d7 = 22
lcd_backlight = 4

lcd_columns = 16
lcd_rows = 2

lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)

Czujnik temperatury

Swoją przygodę z podłączaniem czujnika temperatury opisałem w wpisie Junior i elektronika: Sprawdzamy temperaturę. Wszystko ubrałem w jedną funkcję:

def get_temp():
    with open('/sys/devices/w1_bus_master1/28-000009ba619f/w1_slave', 'r') as f:
        temp = int(f.readlines()[-1].split()[-1][2:]) / 1000
    return temp

Fotorezystor

Z Raspberry Pi jest jeden "mały" problem - nie ma pinów analogowych, które potrafią mierzyć napięcie na linii. By podłączyć czujnik analogowy i odbierać od niego jakieś w miare sensowne dane (chociaż i tak mocno umowne) można zastosować obejście w postaci kondensatora zbierającego ładunek elektryczny - na podstawie czasu ładowania oszacować jaka jest rezystancja wytworzona przez fotorezystor. Tutaj również Youtube okazał się bardzo użyteczny.

Na koniec ubrałem całą logikę w wygodną funkcję.

def get_light_percentage(pin):
    reading = 0
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, GPIO.LOW)
    sleep(0.1)
    GPIO.setup(pin, GPIO.IN)
    while (GPIO.input(pin) == GPIO.LOW):
        reading += 1
    reading = reading / 50
    reading = 100 - int(round(reading))
    return reading

Łączenie funkcjonalności w programie

import Adafruit_CharLCD as LCD
import RPi.GPIO as GPIO
from time import sleep

lcd_rs = 25
lcd_en = 24
lcd_d4 = 23
lcd_d5 = 17
lcd_d6 = 18
lcd_d7 = 22
lcd_backlight = 4

lcd_columns = 16
lcd_rows = 2

lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)
light_pin = 21

blue_led = 20

def get_light_percentage(pin):
    reading = 0
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, GPIO.LOW)
    sleep(0.1)
    GPIO.setup(pin, GPIO.IN)
    while (GPIO.input(pin) == GPIO.LOW):
        reading += 1
    reading = reading / 50
    reading = 100 - int(round(reading))
    return reading

def get_temp():
    with open('/sys/devices/w1_bus_master1/28-000009ba619f/w1_slave', 'r') as f:
        temp = int(f.readlines()[-1].split()[-1][2:]) / 1000
    return temp

def led(pin, condition):
    if condition:
        GPIO.output(pin, GPIO.HIGH)
    else:
        GPIO.output(pin, GPIO.LOW)

GPIO.setup(blue_led, GPIO.OUT)
GPIO.output(blue_led, GPIO.LOW)

lcd.message("Temperatura: ")
lcd.set_cursor(0, 1)
lcd.message("Slonce: ")

while True:
    temp = get_temp()
    lcd.set_cursor(13, 0)
    lcd.message(str(get_temp())+"C")
    lcd.set_cursor(11, 1)

    light_percentage = get_light_percentage(light_pin)
    lcd.message(str(light_percentage)+ "%")
    led(blue_led, light_percentage <= 80)
    sleep(0.1)

Efekt?

Plany na przyszłość

Przeszedłem podstawy podstaw elektroniki od totalnego laika do osoby która potrafi podłączyć wyświetlacz i kilka czujników. Dla mnie to duży sukces, ale nie chcę spoczywać na laurach i będę zmierzał w kierunku swojego ostatecznego celu - czyli zbudowania drona od podstaw. Jak uda mi się zebrać odpowiednie fundusze to zacznę opisywać proces tworzenia prostych robotów, może uda mi się do tego wpleść jakiś machine learning, zobaczymy :)

Do zobaczenia następnym razem. See ya

Sort:  

No spoko :) Działa :)

I na co komu studia :)

Coin Marketplace

STEEM 0.19
TRX 0.14
JST 0.030
BTC 60115.50
ETH 3192.77
USDT 1.00
SBD 2.45