MicroPython - dotaz (RPiPICO)

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

MicroPython - dotaz (RPiPICO)

Příspěvek od pavel1tu » 28 dub 2021, 20:04

Zdar, zase jsem se nechal k něčemu ukecat

Prosím, může mi někdo "jako pro blbce" vysvětlit, jak funguje tato část kodu

Kód: Vybrat vše

    for character in StringInput:
        convertStringInput += DATA[character] + " "
    return convertStringInput
ono to nahradí znak z textu MORSE kodem,
ale nemohu nikde najít nějaké podrobné vysvětlení (manuál) abych to pochopil,
podobně fujguje JSON v Pythonu, ale tady se ta knihovna nevolá, jsem zmaten

cely kod

Kód: Vybrat vše

# LEKCE 17 - Prevod textu do MORSE
# DEF, FOR, IF, prace s retezci

import utime
from machine import Pin

led=machine.Pin(25, machine.Pin.OUT)
Speed=0.2

def morse_carka():
    led.value(1)
    utime.sleep(3*Speed)
    led.value(0)
    utime.sleep(Speed)

def morse_mezera():
    utime.sleep(3*Speed)

def morse_tecka():
    led.value(1)
    utime.sleep(Speed)
    led.value(0)
    utime.sleep(Speed)

DATA = {' ': '_', 
"'": '.----.', 
'(': '-.--.-', 
')': '-.--.-', 
',': '--..--', 
'-': '-....-', 
'.': '.-.-.-', 
'/': '-..-.', 
'0': '-----', 
'1': '.----', 
'2': '..---', 
'3': '...--', 
'4': '....-', 
'5': '.....', 
'6': '-....', 
'7': '--...', 
'8': '---..', 
'9': '----.', 
':': '---...', 
';': '-.-.-.', 
'?': '..--..', 
'A': '.-', 
'B': '-...', 
'C': '-.-.', 
'D': '-..', 
'E': '.', 
'F': '..-.', 
'G': '--.', 
'H': '....', 
'I': '..', 
'J': '.---', 
'K': '-.-', 
'L': '.-..', 
'M': '--', 
'N': '-.', 
'O': '---', 
'P': '.--.', 
'Q': '--.-', 
'R': '.-.', 
'S': '...', 
'T': '-', 
'U': '..-', 
'V': '...-', 
'W': '.--', 
'X': '-..-', 
'Y': '-.--', 
'Z': '--..', 
'_': '..--.-'}

def convertToMorse(StringInput):
    StringInput = StringInput.upper()
    convertStringInput = ""
    for character in StringInput:
        convertStringInput += DATA[character] + " "
    return convertStringInput

while True:

    StringInput = input("Zadej slovo/vetu: ")
    convertStringInput = convertToMorse(StringInput)
    print(convertStringInput)
    for i in convertStringInput:
        if i == ".":
            morse_tecka()
        elif i == "-":
            morse_carka()
        else:
            morse_mezera()

UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: MicroPython - dotaz (RPiPICO)

Příspěvek od gilhad » 29 dub 2021, 02:37

Jde o celkem jednoduchý program, sestávající z
  • 2 importů (knihovna utime a Pin z knihovny machine)
  • pár příkazů (přiřazení objektu do proměnné led a čísla do Speed
  • několika definic funkcí (morse_caska, morse_mezera a tak) - odsazení je důležité, definuje blok (v C se používají {})

Kód: Vybrat vše

def JmenoFunkce(parametr1,parametr2,....)
	příkaz
	příkaz
	...
  • dalšího příkazu přiřazení dictionary (slovník) do proměnné DATA
  • další definice funkce - convertToMorse
  • dalších příkazů
    • cyklus while, který běží, dokud je splně na podmínka True (teda furt) - v něm je vnořen zbytek, jako
      • načtení řetězce do proměnné
      • zavolání funkce a přiřazení výsledku do proměnné (řetězce)
      • kontrolní výpis
      • for cyklus přez prvky toho řetězce
        • v něm podmínky na hodnotu aktuálního prvku (i), který je teda taky řetězec, tak se porovnává s řetězci
          • - a podle toho se volají funkce na morzeovku
-----

dictionary obsahuje jako svoje prvky dvojice ve tvaru klíč:hodnota, oddělené čárkama, že je to distionary se pozná podle složených závorek {}, ve kterých je zapsán seznam těch dvojic

Některé z těch dvojic jsou například

Kód: Vybrat vše

'A': '.-', 
'H': '....', 
-----

takže když zadáš "Ahoj světe", tak se ten řetězec uloží do StringInput, funkce convertToMorse si to přepíše na velká písmena

Kód: Vybrat vše

  StringInput = StringInput.upper()
a vyjde jí (pravděpodobně, pokud to nespadne na chybu, nebo to není lokalizováno ) "AHOJ SVěTE"
udělá si pomocnou proměnnou prázdný řetězec

Kód: Vybrat vše

   convertStringInput = ""
pak projde ten řetězec StringInput po jednotlivých prvcích (což u řetězce jsou jednoznakové řetězce) příkazem

Kód: Vybrat vše

   for character in StringInput: 
který postupně do proměnné jménem character strká jednotlivá písmena (jako řetězce)
do pomocné proměnné (povšimni si, že v odsazeném bloku) přidá (+=) hodnotu ze slovníku DATA ( která má jako klíč řetězec v proměnné character ) a ještě navíc mezeru mezi znaky + " "

Kód: Vybrat vše

         convertStringInput += DATA[character] + " "
čili pro character "A" je DATA[character] rovno '.-' a v pomocné proměnné je tedy ".- "
čili pro character "H" je DATA[character] rovno '....' a v pomocné proměnné je tedy ".- .... "
a tak dál, dokud to nedojde k character "ě", který se jeko klíč ve slovníku nevyskytuje a tak to spadne s chybovou hláškou

OK, takže znovu to spustíme a dáme tam jen znaky, které to (po převedení na velká) ve slovníku najde, takže nakonec (protože už to není v bloku, je to odsazené míň) to vrátí hodnotu té pomocné proměnné

Kód: Vybrat vše

    return convertStringInput
Takže zpět do hlavního programu, tam tento řetězec projdeme po znacích

Kód: Vybrat vše

    for i in convertStringInput:
a když je to tečka, zavoláme funkci pro tečku, jinak když je to čárka, zavoláme funkci pro čárku, jinak (což je jak mezera, tak podtržítko) zavoláme funkci pro mezeru

Kód: Vybrat vše

        if i == ".":
            morse_tecka()
        elif i == "-":
            morse_carka()
        else:
            morse_mezera()

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MicroPython - dotaz (RPiPICO)

Příspěvek od pavel1tu » 29 dub 2021, 12:32

No, program jsem psal já,
tedy zjednodušil jsem původní.

Kód: Vybrat vše

   for character in StringInput:
        convertStringInput += DATA[character] + " "
    return convertStringInput
První řádek bere znak po znaku ze zadaného stringu "StringInput"

Druhý řádek, ano, nahrazuje znak po znaku,
do "convertStringInput" postupně přidává znak po znaku (vybrané v prvním řádku) pomocí += a přidá mezeru,
ale pořád nechápu jak je určeno, že z DATA vezme ten MORSE kod, a ne ten první znak/pásmeno,
potřebuji to najít někde popsané v manuálu, abych to mohl popsat do lekce.

Co co dělá vím, mám i odkazy na definici všech příkazů, jen tohle mi uniká.
ANO, funguje to, ale to DATA[character] jsem nikde nenašel.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: MicroPython - dotaz (RPiPICO)

Příspěvek od gilhad » 29 dub 2021, 17:22

Proc to DATA delaji je popsano tady: (tl;dr; jsou typu dictionary, tak je to jejich prirozene chovani)

https://docs.python.org/3/tutorial/data ... ctionaries


Here is a small example using a dictionary:

Kód: Vybrat vše

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'jack': 4098, 'sape': 4139, 'guido': 4127}
>>> tel['jack']
4098

DATA je jmeno promenne, ktera je typu dictionary

DATA['A'] najde ve dvojicich ulozenych v promenne DATA takovou dvojici, ktera ma prvni clen (klic) 'A' a vrati jeji druhy clen (hodnotu),

obdobne jako u pole ARR[ i] najde v poli i-ty prvek a vrati jeho hodnotu (nikoli hodnotu i).

Pole to delaji primym vypoctem pozice, dictionaries to delaji v podstate projitim a porovnavanim klice (jasne interne to asi optimalizuji prez hashe a vyhledavaji sofistikovaneji, ale princip je stejny)

v podstate to funguje nejak takto (fikce):

Kód: Vybrat vše

class dict:
	def najdi(self,index):
		for (klic, hodnota) in self.dvojice:
			if klic==index:
				return hodnota


DATA[index] je zkraceny zapis DATA.najdi(index)


Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MicroPython - dotaz (RPiPICO)

Příspěvek od pavel1tu » 29 dub 2021, 17:50

Joooo, to jsem hledal... moc dík - "Dictionaries" - nemohl jsem to najít, netušil jsem jak se to jmenuje
omlouvám se, hraji si s tím teprve třetí/čtvrtý den. A asi jsem se v dotazu i blbě vyjádřil.

Kamarád povede příměstský týbor, je velký zájem o Python (prý jazyk budoucnosti),
tak vytváříme pro děti "kuchařku" ve formě pracovních listů,
podle které se naučí pod dohledem základy na tom táboře,
pak mohou pokračovat. Nebojte, já tam nebudu :lol:

Jako opravdu moderní a cool se vybralo RPi PICO (a hlavně stojí 100Kč), hodně se o něm píše, je k němu prima učebnice (ale nám na tábor nevyhovuje). Nepájivé pole, tlačítka, moduly s LED (už s odporem), poťák, displej.

Složitější programy rozepisuji přesně jako ty v té odpovědi pro mne, kde si vyzkouší jednotlivé příkazy v shellu MicroPythonu, drobné funkční části jako kousky kodu a pak si zkusí poslepovat celý program sami.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: MicroPython - dotaz (RPiPICO)

Příspěvek od gilhad » 29 dub 2021, 18:09

Paráda :D
Já moc netušil, jak daleko jsi a co přesně tě trápí, tak jsem se v tom prvním rozepsal trochu víc a ty dictionaries tam trochu zapadly v kupce sena :lol:

Python je hodně príma, ale má hodně pokročilých vlastností (což se občas blbě rozpoznává od magie :? )

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MicroPython - dotaz (RPiPICO)

Příspěvek od pavel1tu » 29 dub 2021, 18:18

No, já jel podle stránek MicroPython na RPi stránkách a tam to není.
Ale moc mne to nenadchlo, zatím - nejsem dobrý programátor.

Já těžce bojuji i s tím co potřebuji dotáhnout do konce na Arduinu,
asi to sem hodím jako nedodělaný projekt + PCB zdarma pro toho kdo s tím pomůže a uvidím.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: MicroPython - dotaz (RPiPICO)

Příspěvek od gilhad » 29 dub 2021, 20:05

Nojono, ony tyhle návody pro začátečníky (a různá "Arduina a podonbnou verbež") musí podchytit zájemce rychle, aby mu to "něco dělalo nějak", dřív než návod odloží, že je moc dlouhé a odborné a nudné...

Takže se tam píše naprosté minimum a ještě ořezané až na kost, či dál. Jakmile se to místo polštáře začne jevit spíš jako polstrovaná cela (svěrací kazajka included), tak je lepší na to jít z druhé strany, kde si člověk vezme ten "opravdový jazyk v plné palbě" tedy Python tady, g++ u Arduina a tak, začne se učit ten jazyk používat naplno a těžkou cestou a průběžně zjišťovat, o co ten jazyk ořezali, aby to bylo na tu mikro-platformu (tedy které pokročilé knihovny obětovali, co jde jen omezeně a tak) - většinou toho zase nechybí tolik důležitého, jen je většina zajímavějších vlastností a konceptů prostě zamlčená, aby začátečník nebyl zmaten.

Třeba v normálním Arduino IDE klidně používám classy, dědičnost, knihovny, hlavičkové soubory, jmenné prostory, ukazatele, makra, přetypování, ... a ono mi to IDE všechno překládá jako by se nechumelilo, i když o tom ofiko dokumentace cudně a urputně mlčí :lol:

Čili vesele používej dokumentaci a kurzy pro opravdový Python a nejspíš ti to bude fungovat (aspoň převážně, třeba s thready můžou být problémy/neimplementace).

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 20 hostů