Hallo zusammen,
ich arbeite zurzeit an einem Programm für den Raspberry Pi, der
einerseits über einen Taster gesteuert werden soll, andererseits aber
auch über einen Webserver.
Sobald der Taster gedrückt ist oder der Button auf dem Webserver
gedrückt wird, sollen zwei Relais mit unterschiedlichen Steuerzeiten
auslösen. Wird der Taster / Button erneut gedrückt, soll das Skript von
vorne starten.
Die Tasterüberwachung habe ich "problemlos" hinbekommen
(funktionierend):
1 | #include <stdio.h>
|
2 | #include <stdlib.h>
|
3 | #include <wiringPi.h>
|
4 |
|
5 | #define RELAIS1 0
|
6 | #define RELAIS2 4
|
7 |
|
8 | #define TASTER 7
|
9 |
|
10 | int timer = -1;
|
11 |
|
12 |
|
13 | void garagentor()
|
14 | {
|
15 |
|
16 | if (timer > 0){
|
17 | digitalWrite (RELAIS1, 1);
|
18 | }
|
19 | if (timer > 250){
|
20 | digitalWrite (RELAIS2, 1);
|
21 | }
|
22 | if (timer > 1000){
|
23 | digitalWrite (RELAIS2, 0);
|
24 | }
|
25 | if (timer > 20000){
|
26 | digitalWrite (RELAIS1, 0);
|
27 | timer = -1;
|
28 | }
|
29 |
|
30 | }
|
31 |
|
32 | int main (void)
|
33 | {
|
34 | if(wiringPiSetup()==-1)
|
35 | exit (1);
|
36 |
|
37 | pinMode(TASTER, INPUT);
|
38 | pinMode (RELAIS1, OUTPUT);
|
39 | pinMode (RELAIS2, OUTPUT);
|
40 | digitalWrite (RELAIS1, 0);
|
41 | digitalWrite (RELAIS2, 0);
|
42 |
|
43 | for(;;)
|
44 | {
|
45 | if(digitalRead(TASTER) == HIGH)
|
46 | printf("Taster nicht gedrueckt\n");
|
47 | else{
|
48 | printf("Taster gedrueckt\n");
|
49 | timer = 0;
|
50 | }
|
51 | garagentor();
|
52 | delay(250);
|
53 | if (timer != -1)
|
54 | timer += 250;
|
55 | }
|
56 | return 0;
|
57 | }
|
Ich habe nicht mit Interrupts oder ähnlichem gearbeitet, da ich ehrlich
gesagt total der Programmiereinsteiger bin und es daher auf diese Art
und Weise lösen wollte.
Für den Webserver habe ich bisher ein extra Skript geschrieben, das sich
immer wieder ausgeführt wurde. Mir ist bewusst, dass diese Lösung nicht
gut gehen kann, da das Programm ja nicht unterbrochen wird bzw. mit dem
oben laufenden Skript in Konflikt gerät.
Mein Lösungsansatz war, durch den Webserver ein Programm auszuführen,
das eine Datei erstellt:
1 | #include <stdio.h>
|
2 |
|
3 | int main(void)
|
4 | {
|
5 | FILE *datei;
|
6 | datei = fopen("bedingung.txt","w");
|
7 | if (datei == NULL)
|
8 | {
|
9 | printf("Fehler beim Oeffnen!");
|
10 | return 1;
|
11 | }
|
12 | fprintf(datei,"1\n");
|
13 | fclose(datei);
|
14 | return 0;
|
15 | }
|
Anschliessend wollte ich das Skript zur Tasterüberwachung und
Relais-Ansteuerung so erweitern, damit es überprüft, ob die Datei
vorhanden ist und dementsprechend den Timer auch zurück setzt. Dazu habe
ich Testweise ein Programm geschrieben, das einfach einen Zähler
startet/nicht startet. Auch das funktionierte. Daher hatte ich das
Programm dann mit der Tasteransteuerung verheiratet:
1 | #include <stdio.h>
|
2 | #include <wiringPi.h>
|
3 | #include <stdlib.h>
|
4 |
|
5 | #define RELAIS1 0
|
6 | #define RELAIS2 4
|
7 | #define TASTER 7
|
8 |
|
9 | int timer = -1;
|
10 |
|
11 | void garagentor()
|
12 | {
|
13 | if (timer > 0){
|
14 | digitalWrite (RELAIS1, 1);
|
15 | }
|
16 | if (timer > 250){
|
17 | digitalWrite (RELAIS2, 1);
|
18 | }
|
19 | if (timer > 1000){
|
20 | digitalWrite (RELAIS2, 0);
|
21 | }
|
22 | if (timer > 20000){
|
23 | digitalWrite (RELAIS1, 0);
|
24 | timer = -1;
|
25 | }
|
26 | }
|
27 |
|
28 | int main (void)
|
29 | {
|
30 | FILE *datei;
|
31 | char text[100+1];
|
32 |
|
33 | if(wiringPiSetup()==-1)
|
34 | exit (1);
|
35 |
|
36 | pinMode(TASTER, INPUT);
|
37 | pinMode (RELAIS1, OUTPUT);
|
38 | pinMode (RELAIS2, OUTPUT);
|
39 | digitalWrite (RELAIS1, 0);
|
40 | digitalWrite (RELAIS2, 0);
|
41 |
|
42 | for(;;)
|
43 | {
|
44 | if(digitalRead(TASTER) == HIGH)
|
45 | {
|
46 | printf("Taster nicht gedrueckt\n");
|
47 | }
|
48 | else
|
49 | {
|
50 | printf("Taster gedrueckt\n");
|
51 | timer = 0;
|
52 | }
|
53 |
|
54 |
|
55 | datei = fopen("bedingung.txt", "r");
|
56 | if (datei != NULL)
|
57 | fscanf (datei, "&100c", text);
|
58 | text[100] = '\0';
|
59 | fclose (datei);
|
60 | remove("bedingung.txt");
|
61 | timer = 0;
|
62 |
|
63 | if (timer != -1)
|
64 | timer += 250;
|
65 |
|
66 | garagentor();
|
67 | delay(250);
|
68 | }
|
69 | return 0;
|
70 | }
|
Sobald ich diese "verheiratung" vorgenommen habe, flippt mein Raspberry
völligst aus und erkennt nicht einmal mehr Pinmode, digitalWrite etc.
Da ich mir die Programme nur zusammenbasteln kann und mit Programmierung
zumeist nichts am Hut habe, stehe ich nun total auf dem Schlauch.
Gibt es eine einfachere, bessere Methode?
Ich würde mich sehr über Antworten freuen!
Steffen