Internetové radio - Raspberry pi - problém s lcdproc

Tomáš Bláha

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #45 kdy: 25. 12. 2017, 20:17:54 »
Mimochodem, kdyby tě zlobil jenom ten ljust, tak ten řádek můžeš zaremovat, jen doplňuje mezery na konec. To s tím 'bytes' object is not callable bude asi pro python 3, tak na to zapomeň.

No vidíš, správné řešení je to, které jsme ani já ani ty do teď nikde nezahlídli :-) No tak teď zkus to, čím jsi toto diskusní vlákno začal, program mpdlcd by už neměl hlásit, že connection refused, ne?


dustin

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #46 kdy: 25. 12. 2017, 20:50:56 »
Z toho currentsong ti leze česká diakritika. Opravdu to LCD podporuje české znaky?

Pro zobrazování utf8 ascii fontem používám v pythonu 3 knihovnu unidecode - převede unicode do docela čitelného ascii.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #47 kdy: 25. 12. 2017, 20:54:49 »
Takže zpátky na začátek

mpdlcd

Kód: [Vybrat]
INFO mpdlcd.lcdrunner LCD screen is 16x2
INFO mpdlcd.lcdrunner MPD screen added to lcdproc.
INFO mpdlcd.mpdwrapper Connecting to MPD server at localhost:6600
INFO mpd Calling MPD connect('localhost', 6600, timeout=None)
INFO mpdlcd.lcdrunner Starting update loop.

Kód: [Vybrat]
sudo netstat -anp | grep 13666tcp        0      0 127.0.0.1:13666         0.0.0.0:*               LISTEN      795/LCDd           
tcp        0      0 127.0.0.1:13666         127.0.0.1:44528         ESTABLISHED 795/LCDd           
tcp        0      0 127.0.0.1:44528         127.0.0.1:13666         ESTABLISHED 803/python   

LCD stále bliká. Jsou vidět plné segmenty na prvním řádku.

No to s tím fontem mi vůbec nedošlo. Těžko to bude podporovat :(

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #48 kdy: 25. 12. 2017, 20:58:53 »
Z toho currentsong ti leze česká diakritika. Opravdu to LCD podporuje české znaky?

Pro zobrazování utf8 ascii fontem používám v pythonu 3 knihovnu unidecode - převede unicode do docela čitelného ascii.

Mimochodem, když nevím ani jak nastavit aby to zobrazovalo cokoliv, těžko si budu hrát s nějakejma knihovnama  :D

dustin

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #49 kdy: 25. 12. 2017, 21:05:55 »
Pak nechápu, proč se ptáš na tohle. Zobrazuje ti ten python ascii text správně? Pokud ano, zavolej ten currentsong, zkonverzuj výsledek přes unidecode do ascii a pošli to jako ten string. Detaily už si musíš vymyslet sám. A doporučuji se nepatlat s pythonem 2, budeš navíc řešit datový typ ascii string vs. unicode string.

Kdyby se tady náhodou objevil někdo, pro koho je python hračka, potřebuju do tohohle scriptu

Kód: [Vybrat]
import smbus
import time

# Define some device parameters
I2C_ADDR  = 0x27 # I2C device address, if any error, change this address to 0x3f
LCD_WIDTH = 16   # Maximum characters per line

# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line

LCD_BACKLIGHT  = 0x08  # On
#LCD_BACKLIGHT = 0x00  # Off

ENABLE = 0b00000100 # Enable bit

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

#Open I2C interface
#bus = smbus.SMBus(0)  # Rev 1 Pi uses 0
bus = smbus.SMBus(1) # Rev 2 Pi uses 1

def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = the data
  # mode = 1 for data
  #        0 for command

  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  # Toggle enable
  time.sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  time.sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def main():
  # Main program block

  # Initialise display
  lcd_init()

  while True:

    # Send some test
    lcd_string("Nazev stanice",LCD_LINE_1)
    lcd_string("Nazev interpreta",LCD_LINE_2)

    time.sleep(3)

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)

Zakomponovat místo zobrazování toho obyčejného textu tenhle výstup
Kód: [Vybrat]
echo "currentsong" | nc localhost 6600 | grep -e "^Title: " -e "^Name: "


marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #50 kdy: 25. 12. 2017, 21:08:48 »
Ptám se na to, protože kdyby se tady našel někdo, kdo pythonu rozumí, tak mi řekne, co tam má napsat a můžu to vlákno uzavřít. Pro zkušeného programátora je to určitě otázka pár minut. Já nejsem programátor a už tři dny nespím kvůli nějakému debilnímu lcdproc, mpdlcd atd.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #51 kdy: 25. 12. 2017, 21:21:38 »
Pak nechápu, proč se ptáš na tohle. Zobrazuje ti ten python ascii text správně? Pokud ano, zavolej ten currentsong, zkonverzuj výsledek přes unidecode do ascii a pošli to jako ten string. Detaily už si musíš vymyslet sám. A doporučuji se nepatlat s pythonem 2, budeš navíc řešit datový typ ascii string vs. unicode string.

Ano ascii text zobrazuje správně. jak mám zavolat currentsong (co mám kam napsat?)
Jak mám zkonverzovat výsledek(co mám kam napsat?)

Já chtěl pro manželku rádio, ne dva roky studovat programovací jazyk.

Jde to napsat nějak srozumitelně ?

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #52 kdy: 26. 12. 2017, 13:55:34 »
Nikdo mi nemůže poradit ?

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #53 kdy: 26. 12. 2017, 14:11:54 »
Našel jsem ještě tohle.
Kód: [Vybrat]
# -*- coding: utf-8 -*-
# Original code found at:
# https://gist.github.com/DenisFromHR/cc863375a6e19dce359d

"""
Compiled, mashed and generally mutilated 2014-2015 by Denis Pleic
Made available under GNU GENERAL PUBLIC LICENSE

# Modified Python I2C library for Raspberry Pi
# as found on http://www.recantha.co.uk/blog/?p=4849
# Joined existing 'i2c_lib.py' and 'lcddriver.py' into a single library
# added bits and pieces from various sources
# By DenisFromHR (Denis Pleic)
# 2015-02-10, ver 0.1

"""

# i2c bus (0 -- original Pi, 1 -- Rev 2 Pi)
I2CBUS = 0

# LCD Address
ADDRESS = 0x27

import smbus
from time import sleep

class i2c_device:
   def __init__(self, addr, port=I2CBUS):
      self.addr = addr
      self.bus = smbus.SMBus(port)

# Write a single command
   def write_cmd(self, cmd):
      self.bus.write_byte(self.addr, cmd)
      sleep(0.0001)

# Write a command and argument
   def write_cmd_arg(self, cmd, data):
      self.bus.write_byte_data(self.addr, cmd, data)
      sleep(0.0001)

# Write a block of data
   def write_block_data(self, cmd, data):
      self.bus.write_block_data(self.addr, cmd, data)
      sleep(0.0001)

# Read a single byte
   def read(self):
      return self.bus.read_byte(self.addr)

# Read
   def read_data(self, cmd):
      return self.bus.read_byte_data(self.addr, cmd)

# Read a block of data
   def read_block_data(self, cmd):
      return self.bus.read_block_data(self.addr, cmd)


# commands
LCD_CLEARDISPLAY = 0x01
LCD_RETURNHOME = 0x02
LCD_ENTRYMODESET = 0x04
LCD_DISPLAYCONTROL = 0x08
LCD_CURSORSHIFT = 0x10
LCD_FUNCTIONSET = 0x20
LCD_SETCGRAMADDR = 0x40
LCD_SETDDRAMADDR = 0x80

# flags for display entry mode
LCD_ENTRYRIGHT = 0x00
LCD_ENTRYLEFT = 0x02
LCD_ENTRYSHIFTINCREMENT = 0x01
LCD_ENTRYSHIFTDECREMENT = 0x00

# flags for display on/off control
LCD_DISPLAYON = 0x04
LCD_DISPLAYOFF = 0x00
LCD_CURSORON = 0x02
LCD_CURSOROFF = 0x00
LCD_BLINKON = 0x01
LCD_BLINKOFF = 0x00

# flags for display/cursor shift
LCD_DISPLAYMOVE = 0x08
LCD_CURSORMOVE = 0x00
LCD_MOVERIGHT = 0x04
LCD_MOVELEFT = 0x00

# flags for function set
LCD_8BITMODE = 0x10
LCD_4BITMODE = 0x00
LCD_2LINE = 0x08
LCD_1LINE = 0x00
LCD_5x10DOTS = 0x04
LCD_5x8DOTS = 0x00

# flags for backlight control
LCD_BACKLIGHT = 0x08
LCD_NOBACKLIGHT = 0x00

En = 0b00000100 # Enable bit
Rw = 0b00000010 # Read/Write bit
Rs = 0b00000001 # Register select bit

class lcd:
   #initializes objects and lcd
   def __init__(self):
      self.lcd_device = i2c_device(ADDRESS)

      self.lcd_write(0x03)
      self.lcd_write(0x03)
      self.lcd_write(0x03)
      self.lcd_write(0x02)

      self.lcd_write(LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE)
      self.lcd_write(LCD_DISPLAYCONTROL | LCD_DISPLAYON)
      self.lcd_write(LCD_CLEARDISPLAY)
      self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT)
      sleep(0.2)


   # clocks EN to latch command
   def lcd_strobe(self, data):
      self.lcd_device.write_cmd(data | En | LCD_BACKLIGHT)
      sleep(.0005)
      self.lcd_device.write_cmd(((data & ~En) | LCD_BACKLIGHT))
      sleep(.0001)

   def lcd_write_four_bits(self, data):
      self.lcd_device.write_cmd(data | LCD_BACKLIGHT)
      self.lcd_strobe(data)

   # write a command to lcd
   def lcd_write(self, cmd, mode=0):
      self.lcd_write_four_bits(mode | (cmd & 0xF0))
      self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0))

   # write a character to lcd (or character rom) 0x09: backlight | RS=DR<
   # works!
   def lcd_write_char(self, charvalue, mode=1):
      self.lcd_write_four_bits(mode | (charvalue & 0xF0))
      self.lcd_write_four_bits(mode | ((charvalue << 4) & 0xF0))
 
   # put string function with optional char positioning
   def lcd_display_string(self, string, line=1, pos=0):
    if line == 1:
      pos_new = pos
    elif line == 2:
      pos_new = 0x40 + pos
    elif line == 3:
      pos_new = 0x14 + pos
    elif line == 4:
      pos_new = 0x54 + pos

    self.lcd_write(0x80 + pos_new)

    for char in string:
      self.lcd_write(ord(char), Rs)

   # clear lcd and set to home
   def lcd_clear(self):
      self.lcd_write(LCD_CLEARDISPLAY)
      self.lcd_write(LCD_RETURNHOME)

   # define backlight on/off (lcd.backlight(1); off= lcd.backlight(0)
   def backlight(self, state): # for state, 1 = on, 0 = off
      if state == 1:
         self.lcd_device.write_cmd(LCD_BACKLIGHT)
      elif state == 0:
         self.lcd_device.write_cmd(LCD_NOBACKLIGHT)

   # add custom characters (0 - 7)
   def lcd_load_custom_chars(self, fontdata):
      self.lcd_write(0x40);
      for char in fontdata:
         for line in char:
            self.lcd_write_char(line)         
         

Kód: [Vybrat]
import I2C_LCD_driver
import time
mylcd = I2C_LCD_driver.lcd()


while True:
    mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
   
    mylcd.lcd_display_string("Date: %s" %time.strftime("%m/%d/%Y"), 2)
   

Jak do toho dostat ten příkaz
Kód: [Vybrat]
echo "currentsong" | nc localhost 6600 | grep -e "^Title: " -e "^Name: " ?

Jose D

  • *****
  • 856
    • Zobrazit profil
Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #54 kdy: 26. 12. 2017, 15:31:56 »
Já chtěl pro manželku rádio
kup si nějakou hamu, kupoval jsem to taky na vánoce, a dobrý.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #55 kdy: 26. 12. 2017, 15:33:51 »
Já chtěl pro manželku rádio
kup si nějakou hamu, kupoval jsem to taky na vánoce, a dobrý.
Ty seš ale debil. Tohle si nech na fejsbůček.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #56 kdy: 26. 12. 2017, 16:11:50 »
Zkusil jsem ještě tu Tomášovu metodu
Kód: [Vybrat]
import I2C_LCD_driver
import time
import subprocess
mylcd = I2C_LCD_driver.lcd()


while True:
    text = subprocess.check_output('echo "currentsong" | nc localhost 6600 | grep -e "^Title: "', shell=True)
    mylcd.lcd_display_string(text, 1)
   
    mylcd.lcd_display_string("Date: %s" %time.strftime("%m/%d/%Y"), 2)

To mi vyhodí chybu
Kód: [Vybrat]
Traceback (most recent call last):
  File "/home/pi/write.py", line 9, in <module>
    mylcd.lcd_display_string(text, 1)
  File "/home/pi/I2C_LCD_driver.py", line 159, in lcd_display_string
    self.lcd_write(ord(char), Rs)
TypeError: ord() expected string of length 1, but int found

.

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #57 kdy: 26. 12. 2017, 17:17:53 »
Já chtěl pro manželku rádio
kup si nějakou hamu, kupoval jsem to taky na vánoce, a dobrý.
Ty seš ale debil. Tohle si nech na fejsbůček.
Naopak, to byla nejlepší rada, co tady zatím zazněla.

Koupil jsem si starý auto, nejede, vůbec tomu nerozumím, ale mám kladívko a kleště. Poraďte mi, kam mám bouchnout, aby se to rozjelo. (heslo: lopata)

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #58 kdy: 26. 12. 2017, 17:26:29 »
Jsem snad na foru, normálně jsem se zeptal. Odpověď už hledám 4 dny. Jediný kdo mi poradil byl tomáš. A vy dva zmizte zpátky na fejsbůček. Nejem na vaše výlevy zvědavej.

marty

Re:Internetové radio - Raspberry pi - problém s lcdproc
« Odpověď #59 kdy: 26. 12. 2017, 17:50:07 »
Přes 3000 zhlédnutí a jen jeden člověk, co byl ochotný poradit. Dva debílkové bez kamarádů, co si myslí, že se dá naučit programovat za 4 dny. To je bilance.

Klidně to admine zavři.