Green World
En side om Miljø, Elektronikk, Programmering og litt til
Elektronisk infrastruktur Raspberry PI Informasjonsteknologi
Elektronisk infrastruktur Raspberry PI Informatikk 1
Steng X

4x7-Segment LED som viser temperaturen i Celsius

Montasje

Responsive image

Oppgave

Ved hjelp av en 1-Wire temperatursensor, skal vi i denne oppgaven få temperaturen ved sensoren til å vises på displayet. 1-Wire er det som kalles data buss, og det er behov for kun en ledning for å overføre data. Det er jo ikke helt rikti, fordi vi trenger også en jordleder for å få potensialforskjell, men da brukes den samme som til spenningsforsyningen. Så det trengs altså +, - og data, som blir totalt tre ledere. Denne standarden er utviklet av Dallas Semiconductor Corp. og brukes i mye komersielle produktur, så du vil kunne finne, flere sensorer osv. som støtter denne buss-standarden.

For å få fullt utbytte av denne oppgaven burde du kjenne til hva:

  • En lysdiode er.
  • Hvordan vi beregner størrelser på motstander i forhold til strøm.
  • Ha satt opp Raspberry PI og vet hva Python er.
  • Kjenne Python ganske godt
  • Sett på 4x7 Segment teller oppgaven foran denne

Utstyrsliste

  • Raspberry PI model 3 med Raspbian installert
  • Strømforsyning med minimum 2,1A og microUSB
  • Breakout board eller ledninger over til et prosjekt brett
  • Motstander på 65ohm eller mer, 7stk
  • 4x7-segment LED ELF-415SURWA/S530-A3
  • Temperatursensor DS18B20 fra Dallas, 1stk.
  • 4,7kohm motstand, 1stk.

Datasheet

Responsive image

Beskrivelse

Datasheet eller teknisk beskrivelse som du ser over er et viktig dokument som forteller oss hvordan enheten er laget og virker. Det er viktig å lære seg og forstå en del av de tekniske aspektene av produkter fordi vi rett og slett ikke kommer oss videre uten.

Hvis du ser etter kan du se at alle beina på enheten har nummer. De nummerne/beina henger sammen med hvilken diode som skal lyse på enheten. Når vi kobler opp enheten og skal lage et koblingsskjema, er det denne informasjonen vi bruker.

Koblingsskjema

Responsive image

Hva ser vi?

Det vi ser her er en såkalt "matrise", det betyr at alle dioder på alle tall er koblet sammen. Hvis vi setter "-" på felles katoden "D1" (ben en) og "+" på "A" (ben 14) så lyser alle tallene på samme sted opp. I dette tilfelle ville A lyse opp, og det er den øverste dioden. Prøv selv!

I tillegg har vi her med en temperatursensor og en motstand. Du kan se på koblingsskjema hvordan den skal kobles sammen med Raspberry PI (RP). Ben en på temperatursensoren skal til GND på RP, ben to skal til GPIO4 på RP og ben tre skal til 3V3. Mellom ben to og tre skal det være en motstand på 4,7kohm.

Virkemåte

I koden som vi skal skrive, skal vi lese av temperatursensoren, for deretter og tillpasse avlest verdi til et format som kan leses til displayet og vise frem riktig temperatur, uten tideler. For eksempel skal 19,4 grader Celsius vises som 19 grader.

I tillegg bruker vi displayet som er beskrevet bedre i første oppgave, til å vise frem avlest temperatur

Kode for oppgave

import RPi.GPIO as GPIO #Importerer en pakke med en klasse som kan styre IO portene på RPi og kaller den GPIO
import time as t #Importerer time for å bruke klokken til å vente ett sekund og kaller den t
GPIO.setmode(GPIO.BCM) #Setter GPIO til Broadcom chipen på RPi kortet
GPIO.setwarnings(False) #Hopper over hvis det kommer noen varsler
from w1thersensor import W1TermSensor
sensor = W1ThermSensor()

a,b,c,d = 0,0,0,0
led1 = 5
led2 = 6
led3 = 19
led4 = 26
ledalle = (5,6,19,26)
leds =[led1,led2,led3,led4]

orego = (16,12,21,20) # Setter opp en variabel orego
tall0 = (16,12,13,22,27,20)
tall1 = (12,13)
tall2 = (16,12,21,27,22)
tall3 = (16,12,21,13,22)
tall4 = (20,21,12,13)
tall5 = (16,20,21,13,22)
tall6 = (16,13,22,27,20,21)
tall7 = (16,12,13)
tall8 = (16,12,13,22,27,20,21)
tall9 = (16,12,13,20,21)
alle = (5,6,19,26,16,12,13,22,27,20,21)
led14 = (5,6,19,26) #dette er de fire katodene
tall = [tall0,tall1,tall2,tall3,tall4,tall5,tall6,tall7,tall8,tall9]

GPIO.setup(alle,GPIO.OUT)
GPIO.output(led14,GPIO.HIGH)
GPIO.output(tall8,GPIO.LOW)

def counter(nr1,nr2,nr3,nr4): #her defineres hva som skal vises på
  tell = 0
  while (tell < 50): #bruker ett sekund på løkken#setkatode()
    GPIO.output(ledalle, GPIO.HIGH) #skrur av alle katodene
    GPIO.output(tall8,GPIO.LOW) #skrur av alle anodene
    GPIO.output(led1, GPIO.LOW) #setter på katoden på led1
    GPIO.output(tall[nr1], GPIO.HIGH) #setter på det tallet som sendes
    t.sleep(0.005)
    GPIO.output(ledalle, GPIO.HIGH)
    GPIO.output(tall8,GPIO.LOW)
    GPIO.output(led2, GPIO.LOW)
    GPIO.output(tall[nr2], GPIO.HIGH)
    t.sleep(0.005)
    GPIO.output(ledalle, GPIO.HIGH)
    GPIO.output(tall8,GPIO.LOW)
    GPIO.output(led3, GPIO.LOW)
    GPIO.output(tall[nr3], GPIO.HIGH)
    t.sleep(0.005)
    GPIO.output(ledalle, GPIO.HIGH)
    GPIO.output(tall8,GPIO.LOW)
    GPIO.output(led4, GPIO.LOW)
    GPIO.output(tall[nr4], GPIO.HIGH)
    t.sleep(0.005)
    tell = tell + 1
    GPIO.output(ledalle, GPIO.HIGH)
  return;

while True: #En løkke som går i evig tid
  a,b,c,d = 0,0,0,0
  temp = sensor.get_temperature()
  #str(temp) gjør om fra float til string og list() gjør om til tabell
  x = list(str(temp))
  #henter ut første og andre verdi i tabellen som vil være feks 23 fra 23.4567 og gjør om til integer eller heltall
  b = int(x[0])
  c = int(x[1])
  counter(a,b,c,d)

Oppgaver

I oppgavene under skal du endre på koden over for å løse oppgavene

  1. Prøv å gjør om på koden slik at det står 26C i stede.
  2. Ta med første desimaltall i temperaturen slik at det blir 23.5 i stede for 23.
  3. Programmet er ikke laget for å vise minusgrader (-), klarer du det? (tips! set temp = temp - 30 for å teste)