Forum: PC-Programmierung C-Programm für Relais-Steuerung


von Steffen (Gast)


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

von Joe F. (easylife)


Lesenswert?

Die einfachste Möglichkeit wäre, das Garagentor einfach dauerhaft offen 
stehen zu lassen.
Sobald du die Steuerung mit dem Internet verbunden hast, ist das eh der 
Fall.

von Steffen (Gast)


Lesenswert?

Da der Raspberry nie ins Internet gehen soll, dürfte das nicht passieren 
;)

von Joe F. (easylife)


Lesenswert?

Es fehlen Klammern.
1
        if (datei != NULL)
2
{
3
            fscanf (datei, "&100c", text);
4
            text[100] = '\0';
5
            fclose (datei);
6
            remove("bedingung.txt");
7
            timer = 0;
8
}

von DirkB (Gast)


Lesenswert?

Formatspecifier bei scanf fangen mit % an. Nicht mit &

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.