C-Programm für Relais-Steuerung

Gast #3951655
Lesenswert?
• ▲
▼
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren