Acties:
  • 0 Henk 'm!

  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 23:38
De laatste weken ben ik druk bezig met het maken van bash scriptjes. Het gaat vrij moeizaam en kost veel tijd. Maar stapje voor stapje ga ik steeds meer begrijpen.

Nu heb ik een Raspberry Pi. Daarop heb ik een druk knop op aangesloten.


Dit werkt opzich goed. Maar als ik nu de drukkop inhoud. Dan krijg ik een grote partij push messages over me heen :9

Dit is de code: http://codedump.nl/code/619631

Als de druk knop niet ingedrukt is de waarde: 1, Als je hem indrukt geeft die de waarde: 0

Nu had ik op regel 14 de sleep aangepast naar 10. Dus dan moet ik het knopje al langer inhouden dan 10 seconden. Dit verhelpt het wel wat, maar is niet de oplossing. Ik heb als test ook nog een 'break' ingevoerd op regel 15, zodat dat als dat deel van de code gerund wordt. Het script stopt. Maar dat is ook niet wat ik wil.

Het script moet (denk ik) wel in een loop draaien, aangezien ik direct een reactie wil als de knop is ingedrukt.

Uiteindelijk wil ik de druk knop vervangen door een magneet schakelaar, en aan de voordeur hangen.

Deur dicht -> Doe niks.
Deur Open -> 1 x push bericht (zolang de deur open is)
Deur weer Dicht -> reset en doe niks.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:11

Creepy

Tactical Espionage Splatterer

Wat dacht je van de status die je uitleest vasthouden in een variabele, en dan controleren of de status die je uitleest verschillend is van de status die in de variabele staat en dan pas actie ondernemen?

En wil je je code gewoon even toevoegen aan de post zelf? Dan is je topic nog relevant als codedump.nl besluit je code niet meer weer te geven.

[ Voor 30% gewijzigd door Creepy op 23-05-2013 12:06 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 23:38
Creepy schreef op donderdag 23 mei 2013 @ 12:05:
Wat dacht je van de status die je uitleest vasthouden in een variabele, en dan controleren of de status die je uitleest verschillend is van de status die in de variabele staat en dan pas actie ondernemen?

En wil je je code gewoon even toevoegen aan de post zelf? Dan is je topic nog relevant als codedump.nl besluit je code niet meer weer te geven.
Aan die optie had ik gedacht om de oude status vast te houden.
Maar het toepassen lukte de hele tijd niet.

Want als ik hem boven de while 0 zet (regel1) dan zet die de waarde weer terug naar 0. En als ik hem op regel 3 zet zoals die nu staat dan blijft die alsnog in de loop zitten. Maar ik zal vast wel wat verkeerd doen / denken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
while :
do
nummer=0

status=`gpio read 4`

if [ "$status" -eq "$nummer" ]

then

echo "DIT BERICHT MOET 1 KEER VERSCHIJNEN"
sleep 0.5
`gpio write 4 1`
sleep 0.1


else

echo "Button OFF"
nummer=0
`gpio mode 4 in`
`gpio write 4 1`
status=`gpio read 4`
nummer=4
sleep 0.5


fi

done

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 23:38
Bedankt, zal voortaan even beter opletten.

Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 02-10 10:44

Kees

Serveradmin / BOFH / DoC
Lijkt mij toch niet heel erg moeilijk, ik zou het op een manier als dit doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
ON=0
OFF=1
BEGINSTATUS=$OFF

while true
do
        STATUS=`gpio read 4`

        # doe dingen die je moet doen als de knop ingedrukt word
        if [ ($STATUS -eq $ON) -a ($BEGINSTATUS -eq $OFF) ]
        then
                echo "Knop ingedrukt"
                BEGINSTATUS=$ON
                `gpio write 4 1`

                continue
        fi

        # doe dingen die je moet doen als de knop ingedrukt blijft
        if [ ($STATUS -eq $ON) -a ($BEGINSTATUS -eq $ON) ]
        then
                echo "Knop nog steeds ingedrukt"
                #sleep hier even, grote kans dat de knop wel 0.1s lang inedrukt blijft
                sleep 0.1
                continue
        fi

        # doe dingen die je moet doen als de knop losgelaten word
        if [ ($STATUS -eq $OFF) -a ($BEGINSTATUS -eq $ON) ]
        then
                echo "Knop losgelaten"
                BEGINSTATUS=$OFF
                continue
        fi

        # doe dingen die je moet doen als de knop losgelaten is en was
        echo "Knop niet ingedrukt"

        # check de status elke 0.1s.
        sleep 0.1;

done

Code meteen ook wat opgeruimt, en nietszeggende variablen als 'nummer' weggegooit

Verder zal hij, zodra je de knop hebt ingedrukt meteen verder gaan met de while loop (continue) en dus niet slapen. Pas als hij detecteert dat je de knop ingedrukt blijft houden zal hij slapen (0.1s). Als je de knop loslaat zal hij pas gaan slapen na de tweede check. Op deze manier blijft het allemaal responsive.

waarschuwing: dit heb ik allemaal in een teksteditor getyped, dus ik heb niets getest

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 23:38
@Kees:

Wow het werk! Ik heb wel de () moeten verwijderen en de variablen moeten insluiten met ""

Dus van:
code:
1
if [ ($STATUS -eq $ON) -a ($BEGINSTATUS -eq $OFF) ]

naar:
code:
1
if [ "$STATUS" -eq $ON -a "$BEGINSTATUS" -eq $OFF ]



Even op een rijtje zetten, Copy / Past is handig maar daar leer ik niks van. En ik wil leren :)
code:
1
2
3
ON=0
OFF=1
BEGINSTATUS=$OFF

Deze variabelen declareer je. Maar worden elke keer opnieuw ge set, of worden deze regels maar 1 x uitgevoerd als je het script start?

code:
1
2
while true
do


Begin van de loop

code:
1
 STATUS=`gpio read 4`

Hier declareer je de variable STATUS met de inhoud van `gpio read 4`
Dit gebeurd elke x opnieuw toch?

code:
1
if [ "$STATUS" -eq $ON -a "$BEGINSTATUS" -eq $OFF ]

Als status equal is aan ON en beginstatus is equal aan off. -> dan de volgende code uitvoeren.

code:
1
2
    continue
        fi

Continue is doorgaan. dus feitelijk gaat die door naar het volgende stukje code. 2e stuk is
code:
1
if [ "$STATUS" -eq $ON -a "$BEGINSTATUS" -eq $ON ]

als STATUS equal is aan variable ON & variable beginstatus is equal aan de variable ON. -> de volgende commando's uitvoeren.

En zo verder met stap 3.

Stel ik druk de knop 2 seconden in. -> script loopt.

Zodra ik heb indruk gebeurd het volgende
code:
1
if [ "$STATUS" -eq $ON -a "$BEGINSTATUS" -eq $OFF ]

en daar zet je de
code:
1
BEGINSTATUS=$ON


Klopt dit een beetje wat ik zeg? En wat betekend die "fi" na elk IF commando?

Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 02-10 10:44

Kees

Serveradmin / BOFH / DoC
Dacuuu schreef op donderdag 23 mei 2013 @ 14:02:

code:
1
2
3
ON=0
OFF=1
BEGINSTATUS=$OFF

Deze variabelen declareer je. Maar worden elke keer opnieuw ge set, of worden deze regels maar 1 x uitgevoerd als je het script start?
Een keer maar, scheelt weer een halve picoseconde per loop ofzo ;)
code:
1
 STATUS=`gpio read 4`

Hier declareer je de variable STATUS met de inhoud van `gpio read 4`
Dit gebeurd elke x opnieuw toch?
Ja, hij leest in de whileloop dus altijd die status uit, je hebt dus de status van dat moment
code:
1
if [ "$STATUS" -eq $ON -a "$BEGINSTATUS" -eq $OFF ]

Als status equal is aan ON en beginstatus is equal aan off. -> dan de volgende code uitvoeren.

code:
1
2
    continue
        fi

Continue is doorgaan. dus feitelijk gaat die door naar het volgende stukje code. 2e stuk is
Nee, continue is eigenlijk 'breek de huidige whileloop af en begin overnieuw'. Het eerstvolgende commando na die continue zal dus weer 'while true' zijn. Je mag het ook zien als 'goto line 5'

Let er ook op dat we hier de beginstatus veranderen, zodat we bij de volgende loop weten dat de beginstatus nu ON is
Klopt dit een beetje wat ik zeg? En wat betekend die "fi" na elk IF commando?
De fi is het afsluiten van het if commando, in bash heb je deze syntax: "if .. then .. [else] .. fi"

Als je de het script start en de knop 2s lang indrukt, dan zou hij dus ongeveer zo moeten gaan lopen in pseudocode:
while true
vraag status op
is de knop ingedrukt? -> beginstatus veranderen -> continue
while true
vraag status op
knop ingedrukt & beginstatus = off? (nee)
knop ingedrukt & beginstatus on? (ja) -> doe iets -> slaap 0.1s -> continue

etc, als je de knop ingedrukt blijft houden zal hij dus de hele tijd die 0.1s slapen en continue doen (en die echo die ik er ter debug bijgezet heb, maar dat is uiteraard niet noodzakelijk)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • webfreakz.nl
  • Registratie: November 2003
  • Laatst online: 21-08 15:56

webfreakz.nl

el-nul-zet-é-er

code:
1
2
3
4
if [[ ($STATUS -eq $ON) && ($BEGINSTATUS -eq $OFF) ]];
then
echo "blaat"
fi


code:
1
2
3
4
if [ [ $STATUS -eq $ON ] -a [ $BEGINSTATUS -eq $OFF ] ];
then
echo "blaat"
fi

Werken wel :)

[ Voor 31% gewijzigd door webfreakz.nl op 23-05-2013 16:20 ]

"You smell that, son? What sir? Napalm, I love the smell of napalm in the mornin!" || Children of Bodom fan!


Acties:
  • 0 Henk 'm!

  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 23:38
webfreakz.nl schreef op donderdag 23 mei 2013 @ 16:17:
code:
1
2
3
4
if [[ ($STATUS -eq $ON) && ($BEGINSTATUS -eq $OFF) ]];
then
echo "blaat"
fi


code:
1
2
3
4
if [ [ $STATUS -eq $ON ] -a [ $BEGINSTATUS -eq $OFF ] ];
then
echo "blaat"
fi

Werken wel :)
Wat bedoel je precies?

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:26

Hero of Time

Moderator LNX

There is only one Legend

Dat het gebruik van een andere syntax ook werkt. Beetje overbodig, maar geeft enkel aan dat er meerdere oplossingen zijn.

Daarbij, Kees gaf al aan dat hij 't snel in een kladblokje had geschreven en niet had getest.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Dacuuu
  • Registratie: Maart 2009
  • Laatst online: 23:38
Hero of Time schreef op donderdag 23 mei 2013 @ 18:01:
[...]

Dat het gebruik van een andere syntax ook werkt. Beetje overbodig, maar geeft enkel aan dat er meerdere oplossingen zijn.

Daarbij, Kees gaf al aan dat hij 't snel in een kladblokje had geschreven en niet had getest.
Het is ook geen kritiek hoor. Ik ben echt blij! als ik weer achter de pc zit maak ik even een screenshot

Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 02-10 10:44

Kees

Serveradmin / BOFH / DoC
Verder zitten er ook verschillen tussen bash/dash op dat gebied en is het elke keer gewoon proberen wat wel en niet werkt :P

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan

Pagina: 1