3korre.se

by ekorrar for ekorrar!

User Tools

Site Tools


raspberry_lcd_nexa

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
raspberry_lcd_nexa [2015/01/15 21:46]
ekorre [Funktion]
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.& Micke.K//+//Av: Johan.& 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====
-Detta är ett skript som främsta egenskap ge ett meny system för styra nexa eneheter med 4st knappar.+Detta är ett skript som främsta egenskap är ett meny system för styra nexa eneheter med 4st knappar.
 Vi har använt oss av [[https://www.modmypi.com/raspberry-pi-blue-and-white-16x2-LCD-kit?filter_name=lcd%20display|Adafruit lcd kit]] med 5st knappar. Vi har även lagt in lite fler funktioner. Vi har använt oss av [[https://www.modmypi.com/raspberry-pi-blue-and-white-16x2-LCD-kit?filter_name=lcd%20display|Adafruit lcd kit]] med 5st knappar. Vi har även lagt in lite fler funktioner.
 +
 +Scriptet söker igenom tillagda enheter och sorterar bort temperaturgivare mm.
 +För att få in temperatur givarna måste man lägga till id på dom (mer om det nedan).
 + 
  
 __Knappar i grund menyn__ __Knappar i grund menyn__
Line 12: Line 27:
 |Knapp ner:|Dispalayen visar Data från 2st temperatur sensorer (ute&inne).| |Knapp ner:|Dispalayen visar Data från 2st temperatur sensorer (ute&inne).|
 |Knapp vänster:|Tar en bild med [[https://www.modmypi.com/raspberry-pi-camera-board?filter_name=kamera|Rasberri Pi Camera]]| |Knapp vänster:|Tar en bild med [[https://www.modmypi.com/raspberry-pi-camera-board?filter_name=kamera|Rasberri Pi Camera]]|
-|Knapp vänster2:|Tar en in i Nexa meny för styra nexa enheterna.+|Knapp vänster2:|Tar en in i Nexa meny för styra nexa enheterna.| 
 + 
 +__Knappar i nexa menyn__ 
 +|Upp & ner|Bläddrar bland enheterna| 
 +|Höger| Stänger av| 
 +|Vänster| Startar| 
 +|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://www.telldus.se/products/tellstick_duo]])) 
 +  * Ada Fruit 16X2 Lcd Kit (([[https://www.modmypi.com/raspberry-pi-blue-and-white-16x2-LCD-kit?filter_name=lcd%20display]])) 
 +  * Tillval: Raspberry Pi Camra (([[https://www.modmypi.com/raspberry-pi-camera-board?filter_name=kamera]])) 
 +  * Tillval: Wifiadapter, kan vara skönt att komma åt den lät från datorn. 
 + 
 +**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://developer.telldus.se/doxygen/]])) [[http://elinux.org/R-Pi_Tellstick_core|installationsguide]] 
 +  - Konfigurera Telldus-core och lägg till alla enheter (([[http://developer.telldus.com/wiki/TellStick_conf]])) (([[http://developer.telldus.se/doxygen/]])). 
 +  - Notera ner ID på Temperatur sensorerna.  
 +  - Installera LCD kitet (([[https://learn.adafruit.com/adafruit-16x2-character-lcd-plus-keypad-for-raspberry-pi]])) 
 +  - Tillval: Installera Raspberry Pi Kamran (([[https://www.modmypi.com/blog/installing-the-raspberry-pi-camera-board]])) 
 + 
 +====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://3korre.se/download/Adafruit_CharLCDPlate.pyc|Adafruit_CharLCDPlate.pyc]] 
 +  * [[http://3korre.se/download/Adafruit_I2C.pyc|Adafruit_I2C.pyc]] 
 +  * [[http://3korre.se/download/Adafruit_MCP230xx.pyc|Adafruit_MCP230xx.pyc]] 
 + 
 +**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> 
 +#!/usr/bin/python 
 + 
 +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 = "xx" 
 +itempid = "xx" 
 + 
 +# 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 '{print $2}' | cut -d/ -f1" #kollar ipadressen 
 +ipadress_e = run_cmd(hitta_ipadress_e) #kollar ip 
 +hitta_ipadress_w = "ip addr show wlan0 | grep inet | awk '{print $2}' | cut -d/ -f1" #kollar ipadressen 
 +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,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) 
 + return iter(p.stdout.readline, b''
 + 
 +#kommando for att hamta listan fran tdtool 
 +command = 'tdtool --list' 
 + 
 +#kor en for-loop for att skapa en lista 
 +for line in run_command(command.split()): 
 + 
 + first = line.find('\t') + 1 #hitta forsta \t <- tab 
 + second = line.rfind('\t') #hitta andra \t <- tab 
 + #hoppa over allt som innehaller temperature 
 + if(line.find("temperature",first,second) > -1 ): 
 + continue 
 + #hoppa over allt som innehaller MODEL  
 + if(line.find("MODEL",first,second) > -1 ): 
 + continue 
 + 
 + if (first > 0): 
 + select_lista.append(line[first:second]) #spara endast namnet i en lista 
 +##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('%b %d  %H:%M:%S\n')) 
 + if (rakna >= huvudtid2): 
 + #lcd.backlight(lcd.OFF) 
 + lcd.clear() 
 + lcd.backlight(lcd.OFF) 
 + lcd.message(datetime.now().strftime('%b %d  %H:%M:%S\n'))  
 + 
 + 
 + 
 + 
 + # vanster knapp 
 + if (lcd.buttonPressed(lcd.LEFT)): 
 + lcd.clear() 
 + lcd.message("SELFIE INC!"
 + command2 = "xx/sökväg/xxselfie.sh" 
 + #testa run_cmd istallet 
 + run_cmd(command2) 
 + #run_command(command2.split()) 
 + lcd.backlight(lcd.ON) 
 + rakna = 0 
 + sleep(5) 
 + # uppat knapp 
 + if (lcd.buttonPressed(lcd.UP)):   
 + lcd.clear() 
 + lcd.message(datetime.now().strftime('%b %d  %H:%M:%S\n')) 
 + lcd.backlight(lcd.ON) 
 + rakna = 0 
 + # nerat knapp 
 + if (lcd.buttonPressed(lcd.DOWN)): 
 + lcd.clear() 
 + lcd.message("UPPDATERAR"
 + indoor = "" #temperatur inne 
 + outdoor = "" #temperatur ute 
 + 
 + for line in run_command(command.split()): 
 + first = line.find('\t') + 1 #hitta forsta \t <- tab 
 + second = line.rfind('\t') #hitta andra \t <- tab 
 + #hoppa over allt som innehaller temperature 
 + if(line.find("temperaturehumidity",first,second) > -1 ): 
 + temp_variabel = line[first:second] 
 + first = temp_variabel.find('\t') + 1 #hitta forsta \t <- tab 
 + second = temp_variabel.rfind('\t') #hitta andra \t <- tab 
 + temp_variabel = temp_variabel[first:(second-2)] 
 + 
 + if(temp_variabel.find(itempid) > -1 ): 
 + first = temp_variabel.find('\t') + 1 
 + indoor = temp_variabel[first:(len(temp_variabel))] 
 + elif(temp_variabel.find(otempid) > -1 ): 
 + first = temp_variabel.find('\t') + 1 
 + outdoor = temp_variabel[first:(len(temp_variabel))] 
 +  
 + #continue 
 + #hoppa over allt som innehaller MODEL  
 + #if (first > 0): 
 + # select_lista.append(line[first:second]) #spara endast namnet i en lista 
 + ##AVSLUT 
 + 
 + lcd.clear()  
 + lcd.message("Indoor : " + indoor + "\noutdoor: " + outdoor) 
 + 
 + lcd.backlight(lcd.ON) 
 + rakna = 0 
 + # hoger knapp 
 + if (lcd.buttonPressed(lcd.RIGHT)): 
 + lcd.clear() 
 + lcd.message('E' + ipadress_e + '\nW' + ipadress_w) 
 + 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("Enhet: %s\n V=on H=off" %(select_lista[select_list_val])) 
 + while select_enabled: 
 + if (lcd.buttonPressed(lcd.SELECT)): 
 + select_enabled = 0 
 + lcd.clear() 
 + lcd.message("Lamnar nu Nexa\nmenyn"
 + 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 "komhit" 
 + lcd.message("Enhet: %s\n V=on H=Off" %(select_lista[select_list_val])) #valj menyitem 
 + 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 "komhit" 
 + lcd.message("Enhet: %s\n V=on H=Off" %(select_lista[select_list_val])) #valj menyitem 
 + sleep(0.05) 
 +  
 + if (lcd.buttonPressed(lcd.RIGHT)): 
 + run_cmd("tdtool --off " + (select_lista[select_list_val]) ) 
 + if (lcd.buttonPressed(lcd.LEFT)): 
 + run_cmd("tdtool --on " + (select_lista[select_list_val]) ) 
 + 
 + rakna = 0 
 +  
 + 
 +</file> 
 + 
 +**Kamera scriptet** 
 +Det den gör är ta en bild med "raspistill" (alla variablar kan läsa i scriptet) och lägger bilden på en nätverks utdelning. Vill man så kan man ändra det till usbdisk, mapp etc. Sök efter xx och byt ut. 
 + 
 +<file python selfi.sh> 
 +#!/bin/bash 
 + 
 +PICTURE=$(date +"%Y-%m-%d_%H%M").jpg 
 +SOURCE=/tmp 
 +DESTINATION=/mnt 
 + 
 +GETCOUNT=$(ps aux | grep raspistill | grep -v grep | wc -l) 
 + 
 +if [ "$GETCOUNT" -eq 0 ] 
 +then 
 + echo inga raspistill processer kors.. fortsatter... 
 + raspistill -vf -hf -w 640 -h 480 -q 75 -o $SOURCE/$PICTURE 
 + mount -t cifs -o "username=xx,password=xx" //xxdisk/xxshare $DESTINATION 
 + cp $SOURCE/$PICTURE $DESTINATION/$PICTURE 
 + rm $SOURCE/$PICTURE 
 + sync;sync 
 + umount /mnt 
 + echo allt verkar i sin ordning... 
 +else 
 + echo RASPISTILL ALREADY RUNNING! 
 +fi 
 +</file> 
 + 
 + 
 +====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.
raspberry_lcd_nexa.1421354784.txt.gz · Last modified: 2015/01/15 21:46 by ekorre