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/16 09:39]
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==== ====Behov====
-Vi sökte efter en basstation för att Nexa enheterna som skulle vara centrala styrenheten.+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 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.  Även ha en enhet i hallen som visade tid, datum, temperatur, mm. 
Line 38: Line 44:
 ====Fördberedelser==== ====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.1421397571.txt.gz · Last modified: 2015/01/16 09:39 by ekorre