Teknik 1 · område 1 · pass 3
Knapp och ljussensor
Förra veckan skickade Pico:n ut. Nu ska den lyssna. Två sorters
ingångar: knappen, som är av eller på, och ljussensorn, som ger ett tal. Med
if kan programmet fatta beslut utifrån det den hör.
1. Knappen: av eller på
Koppla: knappens ena ben till GP14, andra benet till GND. Inget motstånd. LED:n sitter kvar på GP15 sedan förra veckan.
Pico GP14 ──── knapp ──── Pico GND
Fyra ben? De sitter ihop parvis. Sätt knappen över mittspåret
så att paren hamnar på var sin sida.
Ny fil knapp.py:
from machine import Pin
from time import sleep
knapp = Pin(14, Pin.IN, Pin.PULL_UP)
led = Pin(15, Pin.OUT)
while True:
if knapp.value() == 0:
led.on()
else:
led.off()
sleep(0.05)
| Raden | Vad den gör |
|---|---|
Pin.IN | Nu lyssnar vi på pinnen i stället för att styra den |
Pin.PULL_UP | Pinnen vilar på 1. Knappen drar ner den till 0 när du trycker. Regeln: nedtryckt = 0 |
knapp.value() | Frågar pinnen: vad är du just nu? Svaret är 0 eller 1 |
if knapp.value() == 0: | Om det stämmer: gör raderna som är indragna under |
else: | Annars: gör de här raderna i stället |
== | Två likamed jämför. Ett likamed sätter. Blanda inte |
Kör. LED:n lyser bara medan knappen hålls nere.
2. Ett tryck tänder, nästa släcker
Programmet måste minnas om lampan är tänd. Det är en variabel. Vid varje tryck vänds den.
from machine import Pin
from time import sleep
knapp = Pin(14, Pin.IN, Pin.PULL_UP)
led = Pin(15, Pin.OUT)
tand = False
while True:
if knapp.value() == 0:
tand = not tand
sleep(0.3)
if tand:
led.on()
else:
led.off()
sleep(0.05)
En knapp studsar: under några tusendels sekunder efter trycket hoppar signalen mellan 0 och 1 flera gånger. Utan pausen räknas ett tryck som tio, och lampan hamnar var som helst. Pausen väntar ut studsen.
not tand betyder "motsatsen till tand". Var tand False blir
det True, och tvärtom.
3. Ljussensorn: ett tal
Sensormodulen har tre stift. S till GP26, + till 3V3, − till GND. GP26 är en av tre pinnar på Pico:n som kan läsa analogt: 26, 27 och 28.
modul S ──── Pico GP26
modul + ──── Pico 3V3
modul − ──── Pico GND
Ny fil ljus.py:
from machine import ADC
from time import sleep
ljus = ADC(26)
while True:
print(ljus.read_u16())
sleep(0.2)
Kör. Talen rullar i terminalen. Håll handen över sensorn och se talet ändras. Det är skillnaden: knappen svarar 0 eller 1. Sensorn svarar med ett tal mellan 0 och 65535.
Anteckna två tal: värdet i vanligt ljus, och värdet med handen tätt över. Åt vilket håll går det när det blir mörkt – upp eller ner? Det beror på modulen, och du behöver veta det i nästa avsnitt.
| Ord | Betyder |
|---|---|
| digital | Av eller på. 0 eller 1. Inget däremellan. Knappen |
| analog | Ett värde som kan vara vad som helst mellan lägsta och högsta. Ljuset |
| ADC | Analog-to-digital converter. Kretsen i Pico:n som gör om en spänning till ett tal. read_u16() ger 0–65535 |
4. Tröskeln – och nattlampan
Ett tal är inget beslut. För att göra något av det behövs en gräns: en tröskel. Under tröskeln – gör en sak. Över – gör en annan. Var tröskeln ligger bestämmer du.
from machine import ADC, Pin
from time import sleep
ljus = ADC(26)
led = Pin(15, Pin.OUT)
troskel = 30000
while True:
varde = ljus.read_u16()
print(varde)
if varde < troskel:
led.on()
else:
led.off()
sleep(0.1)
Tröskeln hittar du med de två talen du antecknade: lägg den mittemellan. Låt
print stå kvar i loopen – det är så du ser vad programmet ser.
Tänds den i ljus och släcks i mörker ger din modul högre tal i mörker.
Byt < mot >. Inget annat behöver ändras.
När något inte fungerar resten av blocket: lägg en print() i loopen
och titta. Nio gånger av tio står svaret i terminalen.
Klart när — det här ska alla ha
Kryssen sparas i din webbläsare.
Nästa sida: buzzern. Klar med allt? Stationerna.
5. Felsökning
7 rader
| Symptom | Trolig orsak | Åtgärd |
|---|---|---|
| LED:n flimrar utan att någon rör knappen | Pin.PULL_UP saknas – pinnen svävar | Lägg till Pin.PULL_UP som tredje argument |
| Knappen är "alltid tryckt" | Fyrbensknappen sitter så att två ben som redan sitter ihop hamnar i samma rad | Vrid knappen 90 grader |
| Toggle-lampan hoppar hit och dit vid ett tryck | Studs – sleep(0.3) efter trycket saknas | Lägg till pausen direkt efter tand = not tand |
| Sensorn ger alltid samma tal | S sitter inte i GP26, eller + saknas | Kontrollera alla tre trådar. GP26, inte GP25 |
| Nattlampan gör tvärtom | Modulen ger högre tal i mörker | Byt < mot > |
Röd text: SyntaxError på if-raden | = i stället för ==, eller kolonet saknas | Två likamed jämför. Kolon sist på raden |
Röd text: IndentationError | Raden under if är inte indragen ett steg till | Fyra mellanslag mer än if-raden |