3korre.se

by ekorrar for ekorrar!

User Tools

Site Tools


raspberry_lcd_nexa

Raspberry Pi LCD Display med meny för Nexa

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

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 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

Viloläge:Displayen visar datum & tid med bakgrundsbelysning av.
Knapp upp:Displayen visar datum & tid med bakgrundsbelysning på.
Knapp höger:Displayen visar Ip adress etho och wifi om det finns.
Knapp ner:Dispalayen visar Data från 2st temperatur sensorer (ute&inne).
Knapp vänster:Tar en bild med Rasberri Pi Camera
Knapp vänster2:Tar en in i Nexa meny för styra nexa enheterna.

Knappar i nexa menyn

Upp & nerBläddrar bland enheterna
Höger Stänger av
Vänster Startar
Vänster2Gå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 1)
  • Ada Fruit 16×2 Lcd Kit 2)
  • Tillval: Raspberry Pi Camra 3)
  • Tillval: Wifiadapter, kan vara skönt att komma åt den lät från datorn.

Installera och konfigurera

  1. Raspberry Pi installerad med Raspbian.
  2. Ha helst en fast ip adress och systemet konfigurerat som du vill ha det.
  3. Telldus-core 4) installationsguide
  4. Konfigurera Telldus-core och lägg till alla enheter 5) 6).
  5. Notera ner ID på Temperatur sensorerna.
  6. Installera LCD kitet 7)
  7. Tillval: Installera Raspberry Pi Kamran 8)

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:

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
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

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.

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

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.txt · Last modified: 2015/01/16 12:04 by ekorre