PcDuino Crowdsource Kiosk (3 / 4 stap)

Stap 3: De Interface: leren van Python

Na het voltooien van het hardware gedeelte van de bouw, ging ik op om aan te pakken van het softwaregedeelte. De GUI voor de kiosk zou moeten voldoen aan een aantal basiscriteria:

Gemakkelijk om te navigeren
Geschikt voor het opslaan van een formulier naar een bestand
Moeilijk naar uitgang
Moeilijk om te Hack (formulier injectie aanvallen, etc.)
Cross-Platform (dus ik op mijn Windows machine ontwikkelen kan)

Ik moest een taal of gereedschap waardoor deze GUI (relatief) pijnloos te monteren. Ik heb niet gedaan eventuele niet-Arduino programmering sinds... um... BASIC? Dus het is over tijd ik leerde een nieuwe taal, en ik wist gewoon degene die ik nodig had: Python.

Waarom Python? Omdat Python doen kan. Nou, oke, is niet om het even wat maar het een zeer aardige taal voor 'bonken' uit een snelle app. Er is ook een enorme collectie van bibliotheken beschikbaar om haak Python in allerlei dingen. Niet te vermelden is platformonafhankelijke zodat ik kon al de ontwikkeling op mijn Windows machine doen en die hetzelfde script op de pcDuino zonder problemen laden.

Soms is de beste manier om te leren van een nieuwe programmeertaal om gewoon springen in uw project met beide voeten. Vinden sommige bibliotheken waarvan u denkt dat u nodig hebt, opent u alle van de voorbeeldcode, en beginnen met het nemen van het uit elkaar. Als je een script start tot finish leest, met behulp van Google opzoeken naar alles wat die u niet begrijpt, hebt u een begrip van de werken van de syntaxis en methoden door het einde. Vanaf daar is het precies hetzelfde oude grind: schrijven, uitvoeren, krijg foutmelding, debug. Hoewel als u gewoon naar Python van C verplaatsen wilt is het meer zoals: schrijven, uitvoeren, 'echt, dat werkte, hè?'

Ik begon met easyGUI, een toepasselijk genaamde bibliotheek voor Python die stekkers in TkInter (een python binding aan de Tk GUI kit) en maakt het super gemakkelijk weergeven en navigeren eenvoudige formulieren grijpen. Kan je alles wat die ik deed zonder easyGUI, maar het zal niet zo makkelijk... GUI... (Waar ben ik?)

Het is ook erg makkelijk om de pcDuino GPIO vanuit Python. In wezen bent u slechts het openen van een bestand en het wijzigen van een waarde, het is echt zo eenvoudig. Kopie/plak wat code vanuit een voorbeeld, waardoor sommige definities bij de bovenkant van de manuscript zodat u kunt gebruiken, HIGH, LOW, INPUT, OUTPUT, etc zonder hoeft te onthouden welke waarde voor elk.

Ik zal doorgaan en post van mijn code hieronder in brokken (niet noodzakelijkerwijs in schriftelijke bestelling maar in werkende staat verkeren) dan proberen uit te leggen elke bit ten behoeve van wie niet vertrouwd met Python. Ik moet waarschuwen iedereen die bekend is dat ik meestal in C code dus mijn Python is niet erg... Pythonic? Het werkt wel.

Oke, dus we moeten doen een beetje van setup eerst:

importeren van easygui als bv
import tijd, os

# patch rootWindowPosition
eg.rootWindowPosition = "+ 180 + 20"

Nou moet dat niet te eng voor de Arduino-programmeurs. Slechts een paar bibliotheken wilt importeren, dezelfde manier als u zou gebruiken "opnemen". Ik heb al uitgelegd van de easyGUI-bibliotheek, maar de tijd bibliotheek geeft me enkel het vermogen om vertragingen in de code.

Het lelijke stukje er over een patch is iets heb ik van een stukje voorbeeldcode om de vensterpositie van mijn GUI te stellen. Ik had moeite met mijn windowmanager plopping het gewoon naar beneden waar het wilde, of alles op scherm of niet was. De # duidt het begin van een opmerking in Python, door de manier.

De volgende ding om te doen is om de GPIO klaar!

GPIO_MODE_PATH = os.path.normpath('/sys/devices/virtual/misc/gpio/mode/')
GPIO_PIN_PATH=OS.Path.normpath('/sys/devices/Virtual/misc/GPIO/pin/')
GPIO_FILENAME = "gpio"

pinMode =]
pinData =]

HOOG = "1"
LAAG = "0"
INPUT = "0"
UITVOER = "1"
INPUT_PU = "8"

voor ik in range(0,18):
pinMode.append (os.path.join (GPIO_MODE_PATH, ' gpio'+str(i)))
pinData.append (os.path.join (GPIO_PIN_PATH, ' gpio'+str(i)))

voor pin in pinMode:
bestand openen (pin, "r +") = ## open het bestand in r/w modus
File.write(output) ## zet de mode van de pin
File.Close() ## belangrijk - moet-bestand als u wijzigingen wilt sluiten!

voor pin in pinData:
bestand = open (pin, "r +")
File.write(Low)
File.Close()

Dat alles was ook gestolen uit een voorbeeldscript. In feite vertelt het Python waar de GPIO pin beheerbestanden worden opgeslagen in de pcDuino. Het definieert dan termen als hoog en INPUT, en vervolgens wordt een aantal "for"-lussen gebruikt om in te stellen van de GPIO pinnen naar een bekende staat.

Als je een Arduino-programmeur bent, dan u waarschijnlijk iets gek door nu opgemerkt hebt: er zijn niet alle puntkomma's! Of accolades! Is de wereld gek geworden? Nou, ja, maar niet bij gebrek aan leestekens. Python is ingegeven door de inspringing. Codeblokken worden gescheiden door het niveau van hun inspringing.

Oke, zijn we allemaal klaar met setup. Laten we iets op het scherm:

while(1):

mainTurk()

def mainTurk():
x = str (eg.buttonbox ("", titel = "Chocolade Turk", image="screen1.jpg" keuzes = ["Gimme Candy!", "Waarom?"]))

Als x == "Waarom?":
msg = "chocolade Turk is een mechanische Turk-solver van het probleem die mensen met chocolade beloont! \n \n werd gebouwd met behulp van de pcDuino als een demonstratie van de mogelijkheden van het apparaat. De software van de controle en de interface werden geprogrammeerd in Python met hulp van de EasyGUI en PIL bibliotheken. \n \n een tutorial over hoe dit project werd afgerond zal beschikbaar worden gesteld op de site van SparkFun leer. \n \n waarom niet MarComm een handje in de reclame? Er is chocolade in het voor je ;) \n \n gedacht en uitgevoerd door: Nick P. \n \n "
titel = "Over chocolade Turk"
keuzes = ["Return", "Doden programma"]
Killer = eg.buttonbox (msg, titel, choices keuzes =)

als moordenaar == "Doden programma":
sys.Exit()
anders:
Pass
anders:
chocoturk()

"Whoa, whoa, whoa... wat?" Ik weet het, als je een Arduino-programmeur bent, dit een puinhoop aanvankelijk kan uitzien. Geen zorgen, we zullen stappen erdoorheen. Eerst en vooral, beginnen ik while(1) lus zodat het kiosk-programma over en zal blijven draaien. De volgende regel is een oproep tot eg.buttonbox (als u zult herinneren dat we geïmporteerd easyGUI als "BV") die is een methode in easyGUI gemaakt van een dialoogvenster met een aantal knoppen. Dit is een verkorte coderegel, dus het is een beetje vreemd uitziende, maar een ding dat zal u helpen erachter te komen wat er gaande is dit: x zal de waarde van de knop die is ingedrukt houden. Als je je afvraagt waar x kwam uit, het niet! We zojuist het omhoog! Dat klopt, in Python je hoeft niet om een variabele te declareren, kun je gewoon gebruiken en Python zullen uitzoeken wat u wilt doen met het.

Achtereenvolgens, wat er gebeurt is dat ik ben vullen x met de tekenreeksversie van de waarde van de functieaanroep "eg.buttonbox". Dat functie een paar argumenten neemt: de titel van het venster, de naam van de afbeelding die ik wilt weergeven, en de keuzes die ik wil beschikbaar. Wanneer deze tekenreeks wordt uitgevoerd, een venster met de naam "Chocolade Turk" met een afbeelding ontvangen van screen1.jpg duikt en twee knoppen met een label "Gimme Candy!" en "Waarom?". Nadat een van de knoppen wordt geklikt, wordt de foutwaarde die keuze aan de str(), die "stringifies" en stopt het in x.

De volgende stap is het testen van x. Als x gelijk is aan "Waarom?" (Met andere woorden, als de "Why?" knop wordt ingedrukt) dan ik knal opwaarts een scherm het project uit te leggen. Gewoon om u een uitgebreid voorbeeld verwaarloosd ik te schrijven dit alles op één regel. U kunt zien dat ik eigenlijk elke variabele alvorens de aanroep van eg.buttonbox gevuld. Ik belde de terugkeer variabele "moordenaar", omdat het de enige plek in het programma om het te doden. Te klikken op de "x" in het venster doen niet zelfs, omdat ik niet alles wat schrijven voor het afhandelen van die. Dit is een goede zaak, ik niet wil dat mensen verlaten de GUI op mijn kiosk.

De verklaringen van de anders verwerken daarna gewoon wat er gebeurt dat als u op "Gimme Candy! drukt", die natuurlijk het dumpt in de volgende functie, die ziet er als volgt:

def chocoturk():
msg = "Kies een product dat je behoorlijk vertrouwd met:"
titel = "Kies een card"
keuzes = ["pcDuino", "IOIO-OTG", "SparkFun uitvinders Kit voor Arduino met Retail Case", "Makey Makey - Standaardkit", "LilyPad Arduino Simple Board", "Raspberry Pi - Model B", "9 graden van vrijheid - Razor IMU", "RedBoard - geprogrammeerd met Arduino", "XBee Explorer USB", "EasyDriver Stepper Motor Driver"]
Choic = eg.choicebox (msg, titel, keuzes)

Als choic == geen:
terugkeer

afbeelding = "% s.jpg" % choic
msg = %-choic "wilt schrijven een advertentie voor de %s?"
keuzes = ["Let's Do it!", "wachten, ga terug!"]
antwoord = eg.buttonbox(msg,image=image,choices=choices)

Als antwoord == "wachten, ga terug!":
terugkeer
anders:
val=["","","",""]
componist (choic, val)

terugkeer

Het eerste ding dat ik moet de gebruiker te doen is om te kiezen een van onze best verkochte producten, zodat ik ze allemaal in wat easyGUI een choicebox noemt lijn. Ik krijg een kans om een beetje slim nadat de gebruiker een product selecteert. Ik heb een foto van elk product met de naam van het product als de bestandsnaam opgeslagen. Dus toen ik ging naar de afbeelding voor het volgende venster ophalen, popped ik gewoon ".jpg" op het einde van het antwoord van de choicebox in het beeld-argument voor buttonbox.

De gebruiker gaf ook een kans om hun gedachten veranderen als ze wilden door terug te keren uit de functie. Als ze dat bevestigen ze willen blijven dan ik drop in de volgende functie componist.

def componist (product, retainVal):
msg = "de AdWords kopiëren schrijven voor de \n \n %s opmaak: \n \n-Headline \n beperkt tot 25 tekens. Links naar de productpagina. \n \n-beschrijving \n krijg je 2 lijnen van 35 tekens elke webserver zodanig beschrijven een SparkFun product met een gerichte shopper met behulp van Google zoeken \n \n-trefwoorden: \n wat 5 zoektermen of zinnen wanneer u typt in Google, moet terugkeren uw advertentie? (comma-separated) \n \n "% product
titel = "AdWords Composer"
fieldNames = ["Kop", "Description Line 1", "Description Line 2", "Keywords"]
fieldValues = [retainVal [0], retainVal [1] [2] retainVal, retainVal [3]]
fieldValues = eg.multenterbox (msg, titel, veldnamen, fieldValues)

Als fieldValues == geen:
terugkeer

Als len(fieldValues[0]) > 25:
EG.MsgBox ("You got te veel personages in je kop. Pare het naar beneden.")
componist (product, fieldValues)
Als len(fieldValues[1]) > 35:
EG.MsgBox ("You got te veel tekens in uw beschrijving (lijn 1). Pare het naar beneden.")
componist (product, fieldValues)
Als len(fieldValues[2]) > 35:
EG.MsgBox ("You got te veel tekens in uw beschrijving (lijn 2). Pare het naar beneden.")
componist (product, fieldValues)

composereview (fieldValues, product)

terugkeer

De functie van de componist is vrij rechttoe-rechtaan. Ik moet alleen de gebruiker sommige tekst in te voeren, dit is de taak die ze bent voor wordt beloond. Als u niet had dacht het uit nu dat, het gespeld uit in het argument msg: We probeerden om mensen van buiten onze marketingafdeling te schrijven advertentietekst. Aangezien deze waren theoretisch zal verschijnen als AdWords-advertenties, moesten zij voldoen aan een bepaalde indeling. Ik heb toegevoegd sommige als verklaringen die de tekenlengte van elk veld te controleren voordat het belonen van de gebruiker. Als er teveel tekens in een veld, zou ik de gebruiker weet welke en hen terug te keren naar het formulier. Tot slot, als ze erin die het formulier invult ik gaf hen een kans om te bekijken wat ze had geschreven naast een afbeelding van het product:

def composereview(adcopy, prod):
afbeelding = "% s.jpg" % prod
msg = "hier is wat je schreef over de % s: \n \n %s \n %s \n %s \n \n met de sleutelwoorden: \n \n %s" % (prod, adcopy [0], adcopy [1], adcopy [2], adcopy[3])
keuzes = ["Gimme chocolade NAO!", "Let me try again..."]
antwoord = eg.buttonbox(msg,image=image,choices=choices)

Als antwoord == "Let me try again...":
componist (prod, adcopy)
anders:
f = open ('AdWordsDump.txt', 'a')
f.write(Prod)
f.write('\n')
f.write(adcopy[0])
f.write('\n')
f.write(adcopy[1])
f.write('\n')
f.write(adcopy[2])
f.write('\n')
f.write(adcopy[3])
f.write('\n')
f.write('\n')
f.Close()
givethemthechocolate()

De "componeren beoordeling" is een eenvoudig formulier dat ik te vullen met de antwoorden van de componist en een afbeelding van het product dezelfde naam truc gebruikt als in het product selectie venster doorgegeven. Als de gebruiker beslist dat ze graag wat ze hebt geschreven, opslaan ik in een grote txt-bestand waar bewaar ik alle info verzameld uit de kiosk. Oh ja, en ik dump ze in de laatste functie:

def givethemthechocolate():

bestand = open (pinData [6], "r +")
File.write(High)
time.Sleep(1)
bestand = open (pinData [6], "r +")
File.write(Low)
File.Close()
afbeelding = "thanks.jpg"
msg = ""
keuzes = ["Finish"]
EG.buttonbox(msg,image=image,choices=choices)

mainTurk()

In deze functie stuur ik de dispenser snoep een hoge pols, die zoete, zoete candy overhandigen. Ik dank u afbeelding weergeven aan de gebruiker en terug te keren naar het startscherm.

Gerelateerde Artikelen

Het op afstand opstarten van pcDuino van een NFS-server

Het op afstand opstarten van pcDuino van een NFS-server

Gevallen willen wij pcDuino te starten vanaf een netwerk gehost bestandsysteem. In deze tutorial zullen we uitleggen hoe dit waar te maken.Stap 1: NFS serverWij zullen eerst een NFS server instellen. Het volgende commando zal worden gebruikt op een X
SDR op pcDuino

SDR op pcDuino

Software-defined radio (SDR) is een radio communicatiesysteem waar onderdelen die gewoonlijk in hardware (bijvoorbeeld mixers, filters, versterkers, modulatoren/demodulators, detectoren, etc.) zijn geïmplementeerd in plaats daarvan worden uitgevoerd
Kickin ' Kiosk, Mp3 Jukebox

Kickin ' Kiosk, Mp3 Jukebox

deze Kickin ' Kiosk blijft de sprekers Kickin ' op ieders favoriete beat. De pulserende lichten, goede trillingen, gebruiksgemak, en vertrouwde uitstraling maakt het een hit op elke bijeenkomst. Eenvoudig nummers selecteren uit een verzameling van MP
SIM900 GPRS/GSM Shield gebruiken op pcDuino

SIM900 GPRS/GSM Shield gebruiken op pcDuino

SIM900 GSM/GPRS schild voegt de mogelijkheid van GPRS/GSM aan pcDuino. Het gebruikt AT commando's om te communiceren met pcDuino via de toepassing UART-poort. Met de hulp van SIM900 GPRS/GSM schild, kan enkele basisfuncties van een mobiele telefoon,
Noodle: een crowdsourced robot

Noodle: een crowdsourced robot

Noodle is een klein apparaat met de i/o van een machine, maar de gedachten en gevoelens van een mens. U kunt het controleren van uw fysieke ruimte en reageren op veranderingen in de omgeving met woorden, beelden, geluiden en besluiten programmeren.Bi
Setting Up Ubuntu als een Kiosk Web Appliance

Setting Up Ubuntu als een Kiosk Web Appliance

op het werk hebben we vaak behoefte aan een machine waarmee studenten toegang tot internet zonder volledige toegang tot een computer.  Om deze taak te voltooien we eerder zijn toevlucht genomen tot AutoHotKey scripts maken voor het op een Windows XP-
Gebruik picoBoard voor kras op pcDuino

Gebruik picoBoard voor kras op pcDuino

de PicoBoard kunt u maakt als volgt interacties met diverse sensoren. Met de programmeertaal Scratch, kunt u gemakkelijk maken eenvoudige interactieve programma's gebaseerd op de input van sensoren. De PicoBoard bevat een lichtsensor, correcte sensor
Gebruik van LoL Shield op pcDuino

Gebruik van LoL Shield op pcDuino

The LoL Shield is een charlieplexed LED matrix voor de Arduino/pcDuino. De LEDs zijn individueel adresseerbare, zodat u het gebruiken kunt om iets in een raster van 9 × 14 weer te geven. Het schuiven van tekst, spelen, beelden, of iets anders dat u w
Met behulp van Breakout Board voor ADMP401 MEMS-microfoon op pcDuino

Met behulp van Breakout Board voor ADMP401 MEMS-microfoon op pcDuino

Module Inleiding:Breakout Board voor ADMP401 MEMS-microfoon is een supersensitive omnidirectionele microfoons. De PCB is zeer klein, signaaluitgang is eenvoudig, met slechts 3 signaaluitgang, één VCC (positieve kracht), een GND (negatieve kracht), ee
Een ander huisautomatisering project met pcDuino

Een ander huisautomatisering project met pcDuino

Het oorspronkelijke project is gepost op: http://pcduino.com/forum/index.php?topic=4299.0pcDuino met een Python terug einde. Ik gebruik SQLite voor de gegevensopslag, CherryPy voor de webserver, pySerial en een XBee bibliotheek om te praten met de Zi
Aan de slag met pcDuino

Aan de slag met pcDuino

Na het plezier met de pcDuino, realiseerde ik dat mij konden wekken een stelletje tutorials te gebruiken. Dus dat is gewoon wat ik ga doen, dus laat mij uit te leggen wat is een pcduino en hoe u kunt instellen voor de eerste keer start.Wat is een pcD
Snake spel draaien op pcDuino

Snake spel draaien op pcDuino

In deze tutorial gaan we te laten zien hoe een spel genaamd "Slang" op pcDuino, en gecontroleerd door de Linker JoyStick Module uitgevoerd.Over de Game slangSlang is een klassiek casual video-spel dat veel mensen hou en vertrouwd zijn met.De spe
Speel Pong met Scratch voor pcDuino

Speel Pong met Scratch voor pcDuino

pcDuino team ontwikkelde een aangepaste versie van Scratch voor pcDuino. Het is vrij eenvoudig om het te installeren. We moeten gewoon typt: $sudo apt-get install pcduino-scratch In deze tutorial gaan we zien hoe maak je een pong spel op pcDuino met
HY502B RFID module voor pcDuino

HY502B RFID module voor pcDuino

HY502B is een 14.3 Mhz in de buurt van veld RFID-module.Voor meer details verwijzen u wij u naar http://linksprite.com/wiki/index.php5?title=RFID_Reader/Write_Module_B _(SPI_interface)HY502B gebruik SPI om de communicatie met de host. pcDuino leveren