This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
raspberry_lcd_nexa [2015/01/16 09:26] ekorre |
raspberry_lcd_nexa [2015/01/16 12:04] (current) ekorre [Fördberedelser] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====Raspberry Pi LCD Display med meny för Nexa==== | ====Raspberry Pi LCD Display med meny för Nexa==== | ||
| //Av: Johan.S & Micke.K// | //Av: Johan.S & Micke.K// | ||
| + | |||
| + | //"Vi frånsäger oss allt ansvar och skador detta script kan ge. | ||
| + | Har ingen support,och har ingen Garanti. men hjälper gärna till i mån av tid. | ||
| + | Detta script är fortfarande under utveckling och versionen idag är: **V.15.1.15** \\ | ||
| + | Du får gärna dela med dig av scriptet om du hänvisar hit, modifiera det (dela gärna med dig av förbättringar). Men inte sälja det eller någon del av det. // | ||
| + | |||
| + | |||
| + | ====Behov==== | ||
| + | Vi sökte efter en basstation för Nexa enheterna och något som skulle vara den centrala styrenheten. | ||
| + | Även om primära funktionen med Rasberry Pi'n och Tellstick duo'n är att den ska styras via mobilen så eftersöktes en basstation som kan släcka / tända allt utan behov av wifi som mobilen är i behov av för kommunicera med Raspberryn. | ||
| + | Även ha en enhet i hallen som visade tid, datum, temperatur, mm. | ||
| ====Funktion==== | ====Funktion==== | ||
| Line 6: | Line 17: | ||
| Vi har använt oss av [[https:// | Vi har använt oss av [[https:// | ||
| - | För att menyn ska funka och hitta nexa enheterna | + | Scriptet söker igenom tillagda enheter och sorterar bort temperaturgivare mm. |
| + | För att få in temperatur givarna | ||
| + | |||
| __Knappar i grund menyn__ | __Knappar i grund menyn__ | ||
| Line 21: | Line 34: | ||
| |Vänster| Startar| | |Vänster| Startar| | ||
| |Vänster2|Går ur nexa menyn| | |Vänster2|Går ur nexa menyn| | ||
| + | |||
| + | **Bonus funktioner** | ||
| + | När vi endå hade en enhet på väggen valde vi lägga till några funktioner: | ||
| + | * Tid / Datum | ||
| + | * Ip adress | ||
| + | * Temperatur | ||
| + | * Starta Kamra | ||
| + | |||
| + | ====Fördberedelser==== | ||
| + | |||
| + | **Hårdvara** | ||
| + | * Rasberry pi (b/b+) | ||
| + | * Tellstick Duo (([[http:// | ||
| + | * Ada Fruit 16X2 Lcd Kit (([[https:// | ||
| + | * Tillval: Raspberry Pi Camra (([[https:// | ||
| + | * Tillval: Wifiadapter, | ||
| + | |||
| + | **Installera och konfigurera** | ||
| + | - Raspberry Pi installerad med Raspbian. | ||
| + | - Ha helst en fast ip adress och systemet konfigurerat som du vill ha det. | ||
| + | - Telldus-core (([[http:// | ||
| + | - Konfigurera Telldus-core och lägg till alla enheter (([[http:// | ||
| + | - Notera ner ID på Temperatur sensorerna. | ||
| + | - Installera LCD kitet (([[https:// | ||
| + | - Tillval: Installera Raspberry Pi Kamran (([[https:// | ||
| + | |||
| + | ====Filerna==== | ||
| + | |||
| + | Det är 5(4)st filer som behövs, den 5e är enbart för Kamran. | ||
| + | Har du inte tänkt använda den kan du skippa den filen. | ||
| + | Första 3st är från Adafruit och är för Lcd kitet. Har du kört deras tuturial har du säkert redan dom annar ladda ner dom här: | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | **Huvudscripet** | ||
| + | |||
| + | Sök efter xx och byt ut värderna där. | ||
| + | Om jag inte missat nåt så är det 2 ställen: | ||
| + | * Tempgivarna | ||
| + | * Sökvägen till camera scriptet | ||
| + | |||
| + | <file python lcdnexameny.py> | ||
| + | # | ||
| + | |||
| + | import subprocess | ||
| + | import smbus | ||
| + | import socket | ||
| + | import os | ||
| + | |||
| + | from time import sleep, strftime | ||
| + | from Adafruit_I2C import Adafruit_I2C | ||
| + | from Adafruit_MCP230xx import Adafruit_MCP230XX | ||
| + | from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate | ||
| + | from datetime import datetime | ||
| + | from subprocess import * | ||
| + | |||
| + | |||
| + | def run_cmd(cmd): | ||
| + | p = Popen(cmd, shell=True, stdout=PIPE) | ||
| + | output = p.communicate()[0] | ||
| + | return output | ||
| + | |||
| + | |||
| + | #Definera temperatur sensorerm | ||
| + | otempid = " | ||
| + | itempid = " | ||
| + | |||
| + | # use busnum = 0 for raspi version 1 (256MB) and busnum = 1 for version 2 | ||
| + | lcd = Adafruit_CharLCDPlate(busnum = 1) | ||
| + | # clear display | ||
| + | lcd.clear() | ||
| + | |||
| + | rakna = 0 #Variabel for halla reda pa tiden for backlight mm | ||
| + | huvudtid1 = 30 # =3 sekunder. Tiden hududmeny ska lysa och hur lange submenyerna ska visas. | ||
| + | huvudtid2 = 60 # tiden till huvudmeny slacks | ||
| + | hitta_ipadress_e = "ip addr show eth0 | grep inet | awk ' | ||
| + | ipadress_e = run_cmd(hitta_ipadress_e) #kollar ip | ||
| + | hitta_ipadress_w = "ip addr show wlan0 | grep inet | awk ' | ||
| + | ipadress_w = run_cmd(hitta_ipadress_w) #kollar ip | ||
| + | select_enabled = 0 # aktivera select valet for nexa menyn | ||
| + | select_lista = [] | ||
| + | select_list_val = 0 | ||
| + | |||
| + | |||
| + | #funktion for att lasa in data till selectmenyn: | ||
| + | def run_command(command): | ||
| + | p = subprocess.Popen(command, | ||
| + | return iter(p.stdout.readline, | ||
| + | |||
| + | #kommando for att hamta listan fran tdtool | ||
| + | command = ' | ||
| + | |||
| + | #kor en for-loop for att skapa en lista | ||
| + | for line in run_command(command.split()): | ||
| + | |||
| + | first = line.find(' | ||
| + | second = line.rfind(' | ||
| + | #hoppa over allt som innehaller temperature | ||
| + | if(line.find(" | ||
| + | continue | ||
| + | #hoppa over allt som innehaller MODEL | ||
| + | if(line.find(" | ||
| + | continue | ||
| + | |||
| + | if (first > 0): | ||
| + | select_lista.append(line[first: | ||
| + | ##AVSLUT | ||
| + | |||
| + | |||
| + | ##HITTA ETT OBJEKT I LISTAN | ||
| + | print select_lista | ||
| + | print len(select_lista) | ||
| + | #SKRIV UT ETT NAMN UR LISTAN | ||
| + | |||
| + | |||
| + | while 1: | ||
| + | sleep(0.1) | ||
| + | |||
| + | |||
| + | #tar den till top sidan och lange top sidan i vilolaget | ||
| + | rakna = rakna + 1 | ||
| + | if (rakna > huvudtid1 and rakna < huvudtid2): | ||
| + | lcd.clear() | ||
| + | lcd.message(datetime.now().strftime(' | ||
| + | if (rakna >= huvudtid2): | ||
| + | # | ||
| + | lcd.clear() | ||
| + | lcd.backlight(lcd.OFF) | ||
| + | lcd.message(datetime.now().strftime(' | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | # vanster knapp | ||
| + | if (lcd.buttonPressed(lcd.LEFT)): | ||
| + | lcd.clear() | ||
| + | lcd.message(" | ||
| + | command2 = " | ||
| + | #testa run_cmd istallet | ||
| + | run_cmd(command2) | ||
| + | # | ||
| + | lcd.backlight(lcd.ON) | ||
| + | rakna = 0 | ||
| + | sleep(5) | ||
| + | # uppat knapp | ||
| + | if (lcd.buttonPressed(lcd.UP)): | ||
| + | lcd.clear() | ||
| + | lcd.message(datetime.now().strftime(' | ||
| + | lcd.backlight(lcd.ON) | ||
| + | rakna = 0 | ||
| + | # nerat knapp | ||
| + | if (lcd.buttonPressed(lcd.DOWN)): | ||
| + | lcd.clear() | ||
| + | lcd.message(" | ||
| + | indoor = "" | ||
| + | outdoor = "" | ||
| + | |||
| + | for line in run_command(command.split()): | ||
| + | first = line.find(' | ||
| + | second = line.rfind(' | ||
| + | #hoppa over allt som innehaller temperature | ||
| + | if(line.find(" | ||
| + | temp_variabel = line[first: | ||
| + | first = temp_variabel.find(' | ||
| + | second = temp_variabel.rfind(' | ||
| + | temp_variabel = temp_variabel[first: | ||
| + | |||
| + | if(temp_variabel.find(itempid) > -1 ): | ||
| + | first = temp_variabel.find(' | ||
| + | indoor = temp_variabel[first: | ||
| + | elif(temp_variabel.find(otempid) > -1 ): | ||
| + | first = temp_variabel.find(' | ||
| + | outdoor = temp_variabel[first: | ||
| + | |||
| + | # | ||
| + | #hoppa over allt som innehaller MODEL | ||
| + | #if (first > 0): | ||
| + | # | ||
| + | ##AVSLUT | ||
| + | |||
| + | lcd.clear() | ||
| + | lcd.message(" | ||
| + | |||
| + | lcd.backlight(lcd.ON) | ||
| + | rakna = 0 | ||
| + | # hoger knapp | ||
| + | if (lcd.buttonPressed(lcd.RIGHT)): | ||
| + | lcd.clear() | ||
| + | lcd.message(' | ||
| + | lcd.backlight(lcd.ON) | ||
| + | rakna = 0 | ||
| + | |||
| + | if (lcd.buttonPressed(lcd.SELECT)): | ||
| + | lcd.backlight(lcd.ON) | ||
| + | select_enabled = 1 | ||
| + | select_list_val = 0 | ||
| + | sleep (0.5) | ||
| + | lcd.clear() | ||
| + | lcd.message(" | ||
| + | while select_enabled: | ||
| + | if (lcd.buttonPressed(lcd.SELECT)): | ||
| + | select_enabled = 0 | ||
| + | lcd.clear() | ||
| + | lcd.message(" | ||
| + | sleep(1) | ||
| + | sleep(0.15) | ||
| + | if (lcd.buttonPressed(lcd.UP)): | ||
| + | #print select_list_val #for debug | ||
| + | #print len(select_lista) #for debug | ||
| + | lcd.clear() | ||
| + | select_list_val = select_list_val - 1 #oka menyval med ett | ||
| + | #om listan e slut borja om fran borjan. | ||
| + | #print select_list_val | ||
| + | if(select_list_val < 0 ): | ||
| + | select_list_val = len(select_lista) - 1 | ||
| + | #print " | ||
| + | lcd.message(" | ||
| + | sleep(0.05) | ||
| + | if (lcd.buttonPressed(lcd.DOWN)): | ||
| + | print select_list_val | ||
| + | #print select_list_val #for debug | ||
| + | #print len(select_lista) #for debug | ||
| + | lcd.clear() | ||
| + | select_list_val = select_list_val + 1 #oka menyval med ett | ||
| + | #om listan e slut borja om fran borjan. | ||
| + | if(len(select_lista) < (select_list_val)+1): | ||
| + | select_list_val = 0 | ||
| + | #print " | ||
| + | lcd.message(" | ||
| + | sleep(0.05) | ||
| + | |||
| + | if (lcd.buttonPressed(lcd.RIGHT)): | ||
| + | run_cmd(" | ||
| + | if (lcd.buttonPressed(lcd.LEFT)): | ||
| + | run_cmd(" | ||
| + | |||
| + | rakna = 0 | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | **Kamera scriptet** | ||
| + | Det den gör är ta en bild med " | ||
| + | |||
| + | <file python selfi.sh> | ||
| + | #!/bin/bash | ||
| + | |||
| + | PICTURE=$(date +" | ||
| + | SOURCE=/tmp | ||
| + | DESTINATION=/ | ||
| + | |||
| + | GETCOUNT=$(ps aux | grep raspistill | grep -v grep | wc -l) | ||
| + | |||
| + | if [ " | ||
| + | then | ||
| + | echo inga raspistill processer kors.. fortsatter... | ||
| + | raspistill -vf -hf -w 640 -h 480 -q 75 -o $SOURCE/ | ||
| + | mount -t cifs -o " | ||
| + | cp $SOURCE/ | ||
| + | rm $SOURCE/ | ||
| + | sync;sync | ||
| + | umount /mnt | ||
| + | echo allt verkar i sin ordning... | ||
| + | else | ||
| + | echo RASPISTILL ALREADY RUNNING! | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | |||
| + | ====Problem==== | ||
| + | Det största problemen vi stött på är att Kamerafunktionen hänger hela Raspberryn.\\ | ||
| + | Men den senaste versionen v15.1.15 så har det inte uppstått än.\\ | ||
| + | |||
| + | ====Utveckling==== | ||
| + | Inga större ändringar är planerade i dagsläget.\\ | ||
| + | Det enda är att vi ska få den att köras som en service, just nu körs den manuellt med screen.\\ | ||
| + | Göra någon form av larm finns i tankarna också, men blir nog separat projekt. | ||