Jump to content
Sign in to follow this  
mr.save

Подключение LCD к Raspberry Pi

Recommended Posts

4562637.jpg.55ee87591dd4b0797a4a6991c8ea7ede.jpg

Вот список того, что нам понадобится:

  • Raspberry Pi (от нее нужно иметь Raspbian на борту с последними обновами)
  • LCD-дисплей, символьный, подробнее напишу чуть ниже
  • BreadBoard (макетная плата) - в моем случае no-name из Китая (170 точек)
  • Соеденительные провода мама-папа с шагом 2.54мм
  • Потенциометр (лучше - подстроечный резистор) на 10КОм (можно 8.5КОм)
  • Резистор 50Ом

Теперь немного подробнее какой LCD брать:
Во-первых надо определиться с количеством знаков и строк, тут разброс очень большой (от 8x2 до 40x4), самый оптимальный вариант 16x2 (2 строки по 16 символов в каждой)
Во-вторых нужно выбрать производителя, я посоветую смотреть в сторону отечественного МЭЛТ или Winstar (Китай, но качественный). Конечно можно взять и китайский no-name, но уверенности в том, что там вшиты русские буквы нет.
В-третьих выбирайте цвет подсветки и букв. Цвет подсветки бывает желтым, зеленым, голубым и синим. Буквы бывают "позитив" - черные и "негатив" - белые. Тут совет один - подсветку берите на усмотрение, но вот буквы - онли "позитив" (я дал промаху, о чем пожалел) т.к. черные буквы видно без подсветки
Вооружившись этими знаниями можно идти искать LCD в сети, цены в пределах 12 у.е.
Подключение:
Вооружившись распиновкой GPIO (в шапке) и LCD (даташит) начинаем подключать
У LCD 16 ножек, нумерация с лева на право от 1 до 16 (иногда может быть другой (см. даташит конкретной модели))

  • 1 - к земле (GND)
  • 2 - +5V
  • 3 - к средней ножке потенциометра (см ниже)
  • 4 - GPIO25
  • 5 - к земле (GND)
  • 6 - GPIO24
  • 7,8,9,10 - пропускаем
  • 11 - GPIO23
  • 12 - GPIO17
  • 13 - GPIO27
  • 14 - GPIO22
  • 15 - через резистор 50Ом к +5V
  • 16 - к земле (GND)


Теперь о потенциометре - кто не знает, то это переменный резистор, вращая ручку коего можно менять сопротивление на нем. У него три ноги - две по краям должны уйти на +5V и GND вашей малины (полярность не имеет значения), а вот средняя нога подключается к 3 пину LCD. Крутя ручку можно будет регулировать контраст

После подключения мы можем выключить нашу Raspberry Pi и покрутить ручку потенциометра - по идее вы должны будете увидеть меняющуюся контрастность знакосинтезатора

Аппаратная часть выполнена, перейдем к программной:
Целью я поставил себе ввод с клавиатуры и вывод написанного на LCD, в качестве языка - выберем Python (можно было бы изнасиловать себе мозг с wiringPi или чем-то подобным, но думаю не стоит, тем более, что Python - "родной" язык для Raspberry Pi
Приступим - откроем терминал на напишем что-то вроде

sudo nano lcd-input.py

Откроется редактор nano, в нем мы и будем писать скрипт
Сам скрипт я не писал, а только отредактировал скрипт из этой инструкции
Вот "мой" скрипт:

#!/usr/bin/python

import RPi.GPIO as GPIO
from time import sleep
class HD44780:

    def __init__(self, pin_rs=25, pin_e=24, pins_db=[23, 17, 27, 22]):

        self.pin_rs=pin_rs
        self.pin_e=pin_e
        self.pins_db=pins_db

        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(self.pin_e, GPIO.OUT)
        GPIO.setup(self.pin_rs, GPIO.OUT)
        for pin in self.pins_db:
            GPIO.setup(pin, GPIO.OUT)

        self.clear()

    def clear(self):
        """ Blank / Reset LCD """

        self.cmd(0x33) # $33 8-bit mode
        self.cmd(0x32) # $32 8-bit mode
        self.cmd(0x28) # $28 8-bit mode
        self.cmd(0x0C) # $0C 8-bit mode
        self.cmd(0x06) # $06 8-bit mode
        self.cmd(0x01) # $01 8-bit mode

    def cmd(self, bits, char_mode=False):
        """ Send command to LCD """

        sleep(0.001)
        bits=bin(bits)[2:].zfill(8)

        GPIO.output(self.pin_rs, char_mode)

        for pin in self.pins_db:
            GPIO.output(pin, False)

        for i in range(4):
            if bits[i] == "1":
                GPIO.output(self.pins_db[::-1][i], True)

        GPIO.output(self.pin_e, True)
        GPIO.output(self.pin_e, False)

        for pin in self.pins_db:
            GPIO.output(pin, False)

        for i in range(4,8):
            if bits[i] == "1":
                GPIO.output(self.pins_db[::-1][i-4], True)


        GPIO.output(self.pin_e, True)
        GPIO.output(self.pin_e, False)

    def message(self, text):
        """ Send string to LCD. Newline wraps to second line"""

        for char in text:
            if char == '\n':
                self.cmd(0xC0) # next line
            else:
                self.cmd(ord(char),True)

if __name__ == '__main__':

    lcd = HD44780()
    lcd.message(raw_input()+"\n"+raw_input())

Его необходимо скопировать в nano, сохранить и закрыть nano (Ctrl+O, Enter, Ctrl+X)
Сделаем скрипт исполняемым файлом:

sudo chmod +x lcd-input.py

И запустим его:

sudo ./lcd-input.py

Увидим пустое место и курсор - значит можно вводить (пишите первую строку не забывая об ограничении в 16 знаков, нажимаете Enter, вторую строку, снова Enter). После ввода на дисплее незамедлительно появится текст. Если что-то не получается сделайте глубокий вдох и проверьте подключение, а также покрутите ручку потенциометра - может вы просто забыли выставить контрастность.
ГОТОВО!

 

Share this post


Link to post

Вывод даты и температуры

Создаем lcd-temp.py, в нем:

#!/usr/bin/python

import RPi.GPIO as GPIO
import os
from time import sleep, strftime
from datetime import datetime
class HD44780:

Создаем скрипт get-temp.py (в нем укажите свои адреса датчиков):

#!/usr/bin/python

tempfile_in = open("/sys/bus/w1/devices/28-000005673b71/w1_slave")
txt_in = tempfile_in.read()
tempfile_in.close()
tempdata_in = txt_in.split("\n")[1].split(" ")[9]
temp_in = float(tempdata_in[2:])
temp_in = int(round(temp_in / 1000, 0))

tempfile_out = open("/sys/bus/w1/devices/28-00000567e2d8/w1_slave")
txt_out = tempfile_out.read()
tempfile_out.close()
tempdata_out = txt_out.split("\n")[1].split(" ")[9]
temp_out = float(tempdata_out[2:])
temp_out = round(temp_out / 1000, 1)

print "Out:"+str(temp_out)," In:"+str(temp_in)

Скрипты можно соеденить в один, но это проблематично, а я еще иногда отдельно использую get-temp.py, так что я не стал заморачиваться

5623178.jpg.e3c5c45b6b39652a8776035075541cdb.jpg

Оба скрипта в одну папку, первый прописываем в crontab с частотой выполнения в минуту. Для точности во времени можно прицепить RTC через GPIO, но если есть стабильный интернет, то не заморачиваемся

Сам датчик на 3-х проводах от витой пары кинул за окно (предварительно обмазав герметиком). Второй прям на макетке воткнут и замеряет температуру дома.

Ну и графики рисую и отправляю на box.com (rrd, скрипт на Perl для записи в БД и два bash-скрипта на отрисовку и заливку на облако):

5625040.png.6a12f3f514cf6efa132d0ad4b7622733.png

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...