Pages: [1]   Go Down
Author Topic: Klapp-Monitor von C-Controle auf Arduino  (Read 487 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 6
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo, ich bin Philipp und habe mir vor langer zeit mal einen Monitor für´s Auto gebaut der rausfährt und dann hochklappt/hochdreht.
Das ganze hatte ich damals für eine Conrad C-Controle geschrieben und versuche das jetzt auf die Arduino zu übersetzen.
Jedoch habe ich mit den Befehlen noch meine Probleme.

C-Controle-Code:
Code:
'Beschreibung Program:
'Startvorraussetzungen1: Monitor ist eingefahren
'Startvorraussetzungen2: Monitor ist ausgefahren
'Aufgaben: Monitor soll mittels Starttaste ein und ausklappen können.
'Gegeben sind: Je 2Endlagenschalter und ein Motor fürhr Fahr und Drehbewegung
'der Motor vom Drehwerk wird über RC-Regler angesteuert und braucht Servosignal
'Beim Drücken der Starttaste soll sich die Mechanik zu den entgegen gesetzten
'Position eigenständig bewegen
'Startfunktion 2: Rausfahren ueber Remote=ON, Runterfahren über Remote=OFF
'Achtung Eingaenge alle Verdrehen (Geschalten=0 oder OFF)

'Eingänge
define SE11   as Port[11]'Endschalter Fahrwerk außen
define SE12   as Port[12]'Endschalter Fahrwerk innen
define SE21   as Port[13]'Endschalter Drehwerk oben
define SE22   as Port[14]'Endschalter Drehwerk unten
define S1     as Port[15]'Starttaster/Hand Fahr vor
define S2     as Port[16]'Remote Spannung PC
define S3     as Port[9]'Schalter Handbetrieb
define S4     as Port[10]'Hand fahr rueck
'Pullupschaltung für Eingänge und Einschalten Servofunktion
CONFIG.INIT
CONFIG.PUT 00010001b
CONFIG.OFF
'Ausgänge
define K1     as Port[5] 'Relaise1 Fahrwerk vorwaerts/raus
define K2     as Port[8] 'Relaise4 Fahrwerk ruechwaerts/rein
define K3     as Port[6] 'Relaise3 Linksrechtslauf umschaltung
define Lampe1 as Port[3] 'Relaise5 Zustandsanzeige 1
define Lampe2 as Port[4] 'Relaise6 Zustandsanzeige 2
'Servo
define Regler as DA[1]   'Drehwerk Servoausgang
'Merker
define Merker as Byte[15]
define M1 ref Merker at Bit[1] 'Merker für Fahrwerk_Vor
define M2 ref Merker at Bit[2] 'Merker für Fahrwerk_Rueck
define M3 ref Merker at Bit[3] 'Merker für Drehwerk_Vor
define M4 ref Merker at Bit[4] 'Merker für Drehwerk_Rueck
define M5 ref Merker at Bit[5] 'Merker für Remote_letzter Zustand
define M6 ref Merker at Bit[6] 'Merker für Start 1
define M7 ref Merker at Bit[7] 'Merker für Start 2
define M8 ref Merker at Bit[8] 'Merker für Start 3
'=================
'Hauptprogramm
K1=off
K2=off
K3=off
Lampe1=off
Lampe2=off
Regler=0'damit der nich ständing rumheult/Pipt
M1=off
M2=off
M3=off
M4=off
M5=off
M6=on'Start der Startzyklen
M7=off
M8=off
goto Hauptprogramm
'-----------------
function StartbedingungSchalter()'M6
IF (S1=off) AND (S3=on) AND (SE21=on) THEN M1=on'raus
IF (S1=off) AND (S3=on) AND (SE21=off) THEN M4=on     'rein
M6=off
M7=on
Lampe2=on
Pause 5
Lampe2=off
Pause 10
end Function
'-----------------
function FahrwerkVor()'M1
K1=on
Wait (SE11=on)
K1=off
M3=on
M1=off
end function
'-----------------
function FahrwerkRueck()'M2
K2=on
wait (SE22=on) OR (SE12=off)
K2=off
M2=off
end function
'-----------------
function DrehwerkVor()'M3
Regler=50
wait (SE11=on) OR (SE21=off)
Regler=0
M3=off
end function
'-----------------
function DrehwerkRueck()'M4
K3=on
Regler=50
Wait (SE22=off)
Regler=0
K3=off
M2=on
M4=off
end function
'-----------------
function Handfahrt()
M1=off
M2=off
M3=off
M4=off
M6=off'Bit M5 muss weggelassen werden!
M7=off
M8=off
K1=off
K2=off
K3=off
Lampe1=off
Lampe2=off
IF (S3=off) AND (S1=off) THEN'Hand Fahr vor
   K1=on
   wait (S3=on) OR (S1=on)
   K1=off
end IF
IF (S3=off) AND (S4=off) THEN'Hand Fahr rueck
   K2=on
   wait (S3=on) OR (S4=on) OR (SE12=off)
   K2=off
end IF
end function
'-----------------
function  Remotestart_raus()'M7
IF (S1 AND S3 AND S4) =off THEN
   IF (M5=off) AND (S2=off) THEN
      M1=on
      M5=on
   end IF
end IF
M8=on
M7=off
Lampe2=on'eins
Pause 5
Lampe2=off
Pause 5
Lampe2=on'zwei
Pause 5
Lampe2=off
Pause 10
end function
'-----------------
function Remotestart_rein()'M8
IF (S1 AND S3 AND S4) =off THEN
   IF (M5=on) AND (S2=on) THEN
      M4=on
      M5=off
   end IF
end IF
M6=on
M8=off
Lampe2=on'eins
Pause 5
Lampe2=off
Pause 5
Lampe2=on'zwei
Pause 5
Lampe2=off
Pause 5
Lampe2=on'drei
Pause 5
Lampe2=off
Pause 10
end function
'=================
#Hauptprogramm
IF Merker=00000100 THEN StartbedingungSchalter()
IF Merker=00001100 THEN StartbedingungSchalter()
'IF (M1 AND M2 AND M3 AND M4 AND S3 AND M7 AND M8) =off THEN StartbedingungSchalter()
IF Merker=00000010 THEN Remotestart_raus()
IF Merker=00001010 THEN Remotestart_raus()
'IF (M1 AND M2 AND M3 AND M4 AND S3 AND M6 AND M8) =off THEN Remotestart_raus()
IF Merker=00000001 THEN Remotestart_rein()
IF Merker=00001001 THEN Remotestart_rein()
'IF (M1 AND M2 AND M3 AND M4 AND S3 AND M6 AND M7) =off THEN Remotestart_rein()
IF (S3=on) THEN Handfahrt()
IF (M1=on) THEN FahrwerkVor()
IF (M2=on) THEN FahrwerkRueck()
IF (M3=on) THEN DrehwerkVor()
IF (M4=on) THEN DrehwerkRueck()
'-----------------
IF S2=off THEN'Remote Merker Zustand
   M5=on      '>PC/Audioanlage an
ELSE
   M5=off     '>PC/Audioanlage aus
end IF
'-----------------
Lampe1=on'Anzeige Takten/Lebensbit
pause 10
lampe1=off
pause 10
goto Hauptprogramm
'Remoteschaltung Funktioniert einfach nicht wie gewünscht
'Aendern in Funktionen

Arduino Aufbau (E/A-Pins stimmen noch nicht)
Code:
#include <Servo.h>
//Eingänge
const int SE11 = 1; //Endschalter Fahrwerk außen
const int SE12 = 2; //Endschalter Fahrwerk innen
const int SE21 = 3; //Endschalter Drehwerk oben
const int SE22 = 4; //Endschalter Drehwerk unten
const int S1 = 5; //Starttaster/Hand Fahr vor
const int S2 = 6; //Remote Spannung PC
const int S3 = 7; //Schalter Handbetrieb
const int S4 = 8; //Hand fahr rueck

//Ausgänge
int K1 = 9; //Relaise1 Fahrwerk vorwaerts/raus
int K2 = 10; //Relaise4 Fahrwerk ruechwaerts/rein
int K3 = 11; //Relaise3 Linksrechtslauf umschaltung
int Lampe1 = 12; //Relaise5 Zustandsanzeige 1
int Lampe2 = 13; //Relaise6 Zustandsanzeige 2
//Servo
int Regler = 14; //Drehwerk Servoausgang
//Merker
int M1 = 0; //Merker für Fahrwerk_Vor
int M2 = 0; //Merker für Fahrwerk_Rueck
int M3 = 0; //Merker für Drehwerk_Vor
int M4 = 0; //Merker für Drehwerk_Rueck
int M5 = 0; //Merker für Remote_letzter Zustand
int M6 = 0; //Merker für Start 1
int M7 = 0; //Merker für Start 2
int M8 = 0; //Merker für Start 3
int M9 = 0; //Merker für Zyklus1 VKE0=1.Zyklus
//==========================

void setup() {
  pinMode(SE11, INPUT);
  pinMode(SE12, INPUT);
  pinMode(SE21, INPUT);
  pinMode(SE22, INPUT);
  pinMode(S1, INPUT);
  pinMode(S2, INPUT);
  pinMode(S3, INPUT);
  pinMode(S4, INPUT);
  pinMode(K1, OUTPUT);
  pinMode(K2, OUTPUT);
  pinMode(K3, OUTPUT);//MUSS RAUS!!!Drehwerk links/rechts
  pinMode(Lampe1, OUTPUT);
  pinMode(Lampe2, OUTPUT);
  Regler.attach(14);
}
void loop() {
if (M9 == LOW) {
  digitalWrite(K1, LOW);
  digitalWrite(K2, LOW);
  digitalWrite(K3, LOW);
  digitalWrite(Lampe1, LOW);
  digitalWrite(Lampe2, LOW);
  Regler.write(1);//damit der nich ständing rumheult/Pipt
  digitalWrite(M1, LOW);
  digitalWrite(M2, LOW);
  digitalWrite(M3, LOW);
  digitalWrite(M4, LOW);
  digitalWrite(M5, LOW);
  digitalWrite(M6, HIGH);
  digitalWrite(M7, LOW);
  digitalWrite(M8, LOW);
  digitalWrite(M9, HIGH);
}

Fragen
1.) Im Conrad hatte ich noch "function" eingebaut, im Arduino gibt´s wohl nur die "if" Sache?
2.) ist der Befehl z.B."int M1 = 0;" eine art Merker? (sorry, bin Siemens S7 verwöhnt)
3.) in der Conrad hatte ich mit z.B. "wait (SE11=on)" das Programm solange angehalten, bis der Eingang kam, wo gibt es so eine warte Funktion bei der Arduino?
4.) wenn Frage 2 Funktioniert, wie weit kann man if-Funktionen ineinander verketten, sodass diese noch zuverlässig funktionieren? (für Schrittkette)
5.) Kann man bei if-Bedingungen auch gleich mal 2 oder mehrere bedingungen abfragen oder immer nur eine und dann die nächste if-Bedingung?
Logged

Offline Offline
Edison Member
*
Karma: 35
Posts: 2415
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

1) Im Arduino gibt es auch Funktionen/Methoden
Code:
bool startbedigung() {
if(x && y) return 1;
else return 0;
}
2) Was M1 ist, müsstest du doch wissen.
Wobei "int M1 = 0;" hier falsch ist, da du ja nur 2 Zustände hast.
bool m1 = false;
3) delay(), ist aber keine saubere Möglichkeit, denn solange das Programm angehalten ist, können auch keine Endschalter oder sonstiges abgerufen werden. Besser ist hier die Blink_without_millis Methode.
4)
Code:
switch (step) {

case 0:
if(taster == true) step++;
break;

case 1:
if(temp >= 36) step++;
break;

default:
step = 0;
}
5)
if(taster1 && taster2) motor1 = true; // Taster1 und 2 müssen betätigt sein
if(taster1 || taster2) motor1 = true; // Taster1 oder 2 muss betätigt sein

Die fehlen aber scheinbar grundlegende Programmierkenntnisse in Bezug auf den Arduino. Somit würde ich vorerst dazu raten, diverse Projekte auf den Breadboard zu realisieren. S7 verwöhnt? So wie du das schreibst, hast du die S7 lediglich in der Ausbildung kennengelernt.
Logged

Keinen technischen Support über PN!
Hat dir meine Antwort gefallen, nicht sparsam mit dem Karma sein smiley-wink

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 3001
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino Befehle gibts nicht, du programmierst C++  ( oder auch nur  C )
und kannst zur Bequemlichkeit eine ganze Reihe Funktionen verwenden.

1) Klar gibts in C / C++ auch Funktionen.

2) int M1=0; heisst auf Basic " Dim M1 As Integer: M1 = 0 " und ist eine Variablendefinition mit Initialisierung.
Hat erstmal nichts mit Ein/Ausgängen zu tun.  
Merker sind eher boolean Variable ( können nur 2 Zustande: true = HIGH oder false = LOW ),
die du nach Geschmack in C auch als on / off definieren kannst.
z.B.
Code:
#define on HIGH
#define off LOW

3) wenn du unbedingt willst, kannst du das auch beim Arduino machen

Code:
while ( digitalRead(SE22Pin) == LOW ) { }  // warten bis SE22 auf HIGH geht

... legt aber solange den ganzen Rest lahm ... ( wie bei deinem C Control auch )

4) "beliebig"  smiley-wink  ( Du fällst woanders zuerst auf die Nase )

5) Im Zweifelsfall mit Klammern "beliebig" tief. Aber warum?
Mach es höchstens so kompliziert, wie du es selbst verstehst.

Fehler finden ist komplizierter als Programmieren.
Daraus folgt, dass du deine eigenen Fehler nur finden kannst, wenn du deine Programme sehr einfach hältst.
( KISS = Keep It Stupid Simple )
Logged

Offline Offline
Newbie
*
Karma: 6
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für die Hilfe und Mühe!

Ihr habt recht, das mit der S7 ist nur Lehrgang und Äußerst simple Förderanlagen-Projekte. Sonnst bin ich Elektriker und ich finde kein reinkommen in Sprachen wie C/C++
Wenn man nicht die Möglichkeiten kennt weis man auch nicht was man Lernen muss  smiley-roll Versuche mich grade mit ner Arduino Uno ein wenig die Beispiele auf Funktionen auszuzerren, wo ich z.B. bei int M1 =0 was anderes interpretiert habe...
Das Programm selber soll dann in eine Arduino Nano 3.0 oder Arduino Pro Mini rein.

Ja das Conrad-Programm ist mehr als schlecht, aber wenn etwas grade so funktioniert, hatte man auch keinen Bock alles noch mal über den Haufen zu werfen.
Ok, werde ohne "delay()" arbeiten.

Also nochmal Sorry, hatte vergessen zu erwähnen, dass ich immer noch Anfänger bin (dachte das kommt spätestens bei den Programm heraus^^)
« Last Edit: July 08, 2014, 11:18:43 am by Einheit468 » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 3001
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Also nochmal Sorry, hatte vergessen zu erwähnen, dass ich immer noch Anfänger bin
(dachte das kommt spätestens bei den Programm heraus^^)
smiley-wink Richtig gedacht smiley-wink
Aber Antworten kriegst du trotzdem.

Ausprobieren wie man Funktionen schreibt und verwendet ist eine gute Idee, auch wenn das in Anfänger-Beispielen (um diese einfach zu halten) selten gemacht wird.
Funktionen in mehrere Dateien und/oder eigene Bibliotheken auslagern ist erst ein späterer Schritt.

Wie man generell am besten C für Arduino lernt, ist nicht so eindeutig zu beantworten...
   mein Vorschlag: Suchen, Lesen, Machen, Fragen ( immer wieder und in wechselnden Gewichtsanteilen )


Quote
Viel Spass dabei
Logged

Offline Offline
God Member
*****
Karma: 14
Posts: 557
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sonnst bin ich Elektriker und ich finde kein reinkommen in Sprachen wie C/C++

Hallo,

probier's mal hiermit: http://www.elektronik-bastelkeller.de/C_Ardu_Inhalt.php

Gruß,
Ralf
Logged

Es gibt 10 Arten von Menschen, die einen verstehen Binär, die anderen nicht...

Offline Offline
Newbie
*
Karma: 6
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich muss sagen, das der letzte Link im Beitrag mich schon mal bedeutend weiter gebracht hat (bin aber noch nicht durch mit den Lernteil... smiley-cry ).

Muss leder mal was Fragen, da ich nicht weiter komme... smiley-sad

ich komme hierbei nicht weiter, damit ich auch mal sehe, was die Arduino so macht habe ich noch ein LCD-Display gehohlt, wo ich mir mal sie Zustände der Eingänge anzeigen lassen will, da ich mich schon wunderte, das in meinen Programm nicht´s passiert.

Anzeige Zeigt nicht den Wert, sondern die Variable die ich deklariert habe an...
Code:
#include <Wire.h>//für 16x2LCD
#include <LCD.h>//für 16x2LCD
#include <LiquidCrystal_I2C.h>//für 16x2LCD

const int SE11 = 2;

#define I2C_ADDR    0x27  // Define I2C Address where the PCF8574 is
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

LiquidCrystal_I2C   lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

void setup() {
  pinMode(SE11, INPUT);
  
  lcd.begin (16,2);// Define LCD as 16 column x 2 rows
}
void loop() {
  lcd.setCursor (0, 0 );//setze Zeiger
  lcd.print("  ");//lösche 2 Zeichen
  lcd.setCursor (0, 0 );//setze Zeiger
  lcd.print(SE11);//soll Wert von SE11 anzeigen...
}
Mir fehlt der Suchbegriff nach dem ich im Internet Suchen kann,
damit ich ein Hinweis bekomme, daher leider dieser Beitrag.
« Last Edit: August 08, 2014, 02:46:55 pm by Einheit468 » Logged

Offline Offline
Faraday Member
**
Karma: 116
Posts: 3904
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SE11 hat natürlich immer den Wert 2

Um einen Pin einzulesen gibt es das:
http://arduino.cc/en/Reference/DigitalRead

Wobei die auch die Schleife durch millis() oder delay() um ein paar 100ms verzögern solltest. Siehe hier:
http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Logged

Offline Offline
Newbie
*
Karma: 6
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank, so ein ähnliches Beispiel hatte ich zwar schon betrachtet, aber habe es überllesen.

Code:
#include <Wire.h>//für 16x2LCD
#include <LCD.h>//für 16x2LCD
#include <LiquidCrystal_I2C.h>//für 16x2LCD

int in_SE11 = 2;
int SE11 = 0;

#define I2C_ADDR    0x27  // Define I2C Address where the PCF8574 is
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

LiquidCrystal_I2C   lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

Jetzt Zeigt der mir 1 und 0 an, wenn ich Schalte  :smiley-sweat:
void setup() {
  pinMode(in_SE11, INPUT);
  lcd.begin (16,2);// Define LCD as 16 column x 2 rows
}
void loop() {
  SE11 = digitalRead(in_SE11);
  lcd.setCursor (0, 0 );//setze Zeiger
  lcd.print("  ");//lösche 2 Zeichen
  lcd.setCursor (0, 0 );//setze Zeiger
  lcd.print (SE11);//soll Wert von SE11 anzeigen...
  delay (1000);
}
Logged

Offline Offline
Faraday Member
**
Karma: 116
Posts: 3904
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Einfacher:
Code:
lcd.print(digitalRead(SE11));

Ganz ohne Zwischenvariable smiley
Logged

Offline Offline
Newbie
*
Karma: 6
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mein Remote-Steuerung wie damals bei der C-Controle funktioniert immer noch nicht...
Code:
if ((digitalRead(S2) == HIGH)&&(M4 == 0)&&(M5 != 3)){//Remote von 1->0
    M5 = 1;//Starte Vorgang AUTO Ausfahren
    M4 = 1;
  }
  if ((digitalRead(S2) == LOW)&&(M4 == 1)&&(M5 != 3)){//Remote von 0->1
    M5 = 2;//Starte Vorgang AUTO Einfahren
    M4 = 0;
  }

Bisheriges Programm: Auto-Rein/Raus funktioniert schon mit Tastendruck (wie früher bei´m C-Controle)
Ich muss noch viiiiiiel Optimieren und besser schreiben, aber erst mal will ich das es funktioniert.
Code:
/*
Beschreibung Program:
Startvorraussetzungen1: Monitor ist eingefahren0
Startvorraussetzungen2: Monitor ist ausgefahren
Aufgaben: Monitor soll mittels Starttaste ein und ausklappen können.
Gegeben sind: Je 2Endlagenschalter und ein Motor fürhr Fahr und Drehbewegung
der Motor vom Drehwerk wird über RC-Regler angesteuert und braucht Servosignal
Beim Drücken der Starttaste soll sich die Mechanik zu den entgegen gesetzten
Position eigenständig bewegen
Startfunktion 2: Rausfahren ueber Remote=1, Runterfahren über Remote=0
Achtung Eingaenge alle Verdrehen (Geschalten=0 oder 0)
*/
#include <Servo.h>
#include <Wire.h>//für 16x2LCD
#include <LCD.h>//für 16x2LCD
#include <LiquidCrystal_I2C.h>//für 16x2LCD
#include "DHT.h"

//Temperatur/Feuchtigkeitssensor
#define DHTPIN 3
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22
DHT dht(DHTPIN, DHTTYPE);

//#define on LOW//Ausgang invertierung
//#define off HIGH

//16x2LCD
#define I2C_ADDR    0x27  // Define I2C Address where the PCF8574 is
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

//Eingänge
int SE11 = 14; //Endschalter Fahrwerk außen
int SE12 = 15; //Endschalter Fahrwerk innen
int SE21 = 16; //Endschalter Drehwerk oben
int SE22 = 17; //Endschalter Drehwerk unten
int S1 = 2; //AUTO=Start/HAND=umschaltung FW/DW
int S2 = 7; //Remote Spannung PC
int S3 = 8; //Schalter Handbetrieb
int S4 = 9; //HAND vor
int S5 = 13; //HAND rück
//Ausgänge
int K1 = 10; //Relaise1 Fahrwerk vorwaerts/raus
int K2 = 11; //Relaise4 Fahrwerk ruechwaerts/rein
int K3 = 12; //Relaise3 Linksrechtslauf umschaltung
//Servo
Servo Regler; //Drehwerk Servoausgang
//Merker
int M3 = 0; //Merker Monitor fertig ausgefahren
int M4 = 0; //Merker für Remote_letzter Zustand
int M5 = 0; //Merker
//1=Vorgang AUTO Ausfahren
//2=Vorgang AUTO Einfahren
//3=HAND

//Initialise the LCD
int i = 1;//Lebensbit
LiquidCrystal_I2C   lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

//===================================
//-----------------------------------
void setup() {
  /*pinMode(SE11, INPUT);
  pinMode(SE12, INPUT);
  pinMode(SE21, INPUT);
  pinMode(SE22, INPUT);
  pinMode(S1, INPUT);
  pinMode(S2, INPUT);
  pinMode(S3, INPUT);
  pinMode(S4, INPUT);*/
  pinMode(K1, OUTPUT);
  pinMode(K2, OUTPUT);
  pinMode(K3, OUTPUT);//MUSS RAUS!!!Drehwerk links/rechts
  Regler.attach(6);
  digitalWrite(K1, HIGH);
  digitalWrite(K2, HIGH);
  digitalWrite(K3, HIGH);
  Regler.write(7);//damit der nich ständing rumheult/Pipt(1)
  
  dht.begin();//Temperatur/Feuchtigkeitssensor
  
  lcd.begin (16,2);// Define LCD as 16 column x 2 rows
  
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);// Switch on the backlight
  lcd.setBacklight(HIGH);// Switch on the backlight
  
  lcd.setCursor ( 0, 0 );//setzt Zeiger auf 1.Spalte 1.Zeile
  lcd.print("Hallo Einheit468");
  delay (2000);
  lcd.setCursor ( 0, 0 );
  lcd.print("                 ");
}
void loop() {
//Lebens-"int"(Lebensbit)
  lcd.setCursor ( 15, 1 );
  lcd.print ("  ");//2Zeichen Inhalt Löschen
  lcd.setCursor ( 15, 1 );
  lcd.print(i);//2Zeichen Zustand
  i = i + 1;
  if (i >= 99){
      i = 1;
  }
//-----------------------------------
  switch (M5)
  {
    case 0://Startbedingungen
      digitalWrite (K1, HIGH);
      digitalWrite (K2, HIGH);
      digitalWrite (K3, HIGH);
      lcd.setCursor ( 0, 1 );
      lcd.print("    ");//Zeichen Inhalt Löschen
      lcd.setCursor ( 0, 1 );
      lcd.print("Auto");//Zeichen Zustand
      Regler.write(7);
      lcd.setCursor ( 15, 1 );//letzte Zeichen ausßer Bild
      if ((digitalRead(SE21) == LOW)&&(digitalRead(S1) == HIGH)&&(digitalRead(S3) == LOW)){
        M5 = 1;//Vorgang AUTO Ausfahren starten
        lcd.setCursor ( 0, 1 );
        lcd.print("    ");//8Zeichen Inhalt Löschen
        lcd.setCursor ( 0, 1 );
        lcd.print("Raus");//Zeichen Zustand
        break;
      }
      if ((digitalRead(SE21) == HIGH)&& (digitalRead(S1) == HIGH)&&(digitalRead(S3) == LOW)){
        M5 = 2;//Vorgang AUTO Einfahren starten
        lcd.setCursor ( 0, 1 );
        lcd.print("    ");//Zeichen Inhalt Löschen
        lcd.setCursor ( 0, 1 );//Zeichen Zustand
        lcd.print("Rein");
        break;
      }
      if (digitalRead(S3) == HIGH){
        M5 = 3;//HAND
        lcd.setCursor ( 0, 1 );
        lcd.print("    ");//Zeichen Inhalt Löschen
        lcd.setCursor ( 0, 1 );
        lcd.print("HAND");//Zeichen Zustand
        break;
      }
      break;
//-----------------------------------
    case 1://Vorgang AUTO Ausfahren
      if ((digitalRead(SE11) == LOW)&&(digitalRead(SE22) == HIGH)){
        digitalWrite (K1, LOW);
      }
      if (digitalRead(SE11) == HIGH){
        digitalWrite (K1, HIGH);
        if (digitalRead(SE21) ==LOW){
          Regler.write(100);//50
        }
      }
      if (digitalRead(SE21) == HIGH){
        Regler.write(7);
        M5 = 0;
      }
      break;
//-----------------------------------
    case 2://Vorgang AUTO Einfahren
      if ((digitalRead(SE11) == HIGH)&&(digitalRead(SE22) == LOW)){
        digitalWrite (K3, LOW);
        Regler.write(100);//50Plus Richtungsumkehr!!!!!!!!!!!!!!
      }
      if (digitalRead(SE22) == HIGH){
        Regler.write(7);
        digitalWrite (K3, HIGH);
        if (digitalRead(SE12) ==LOW){
          digitalWrite (K2, LOW);
        }
      }
      if (digitalRead(SE12) == HIGH){
        digitalWrite (K2, HIGH);
        M5 = 0;
      }
      break;
//-----------------------------------
    case 3://HAND
      if (digitalRead(S1) ==LOW){
        if ((digitalRead(S4) == HIGH)&&(digitalRead(S5) ==LOW)){//HAND Fahrwerk vor
          digitalWrite (K2, HIGH);
          digitalWrite (K1, LOW);
        }
        if ((digitalRead(S4) == LOW)&&(digitalRead(S5) == HIGH)&&(digitalRead(SE12) == LOW)){//HAND Fahrwerk rück
          digitalWrite (K1, HIGH);
          digitalWrite (K2, LOW);
        }
      }
      else{
        if ((digitalRead(S4) == HIGH)&&(digitalRead(S5) == LOW)&&(digitalRead(SE21) == LOW)){
          Regler.write(100);//50
        }
        if ((digitalRead(S4) == LOW)&&(digitalRead(S5) == HIGH)&&(digitalRead(SE22) == LOW)){
          digitalWrite (K3, LOW);
          Regler.write(100);//50
        }
      if (digitalRead(SE12) == HIGH){
        digitalWrite (K2, HIGH);
      }
      if (digitalRead(SE21) == HIGH){
        Regler.write(7);
      }
      if (digitalRead(SE22) == HIGH){
        Regler.write(7);
        digitalWrite (K3, HIGH);
      }
      if(digitalRead(S3) == LOW){//Rücksetzen HAND
        M5 = 0;
      }
      break;
  }
//--------------------------
  if ((digitalRead(S2) == HIGH)&&(M4 == 0)&&(M5 != 3)){//Remote von 1->0
    M5 = 1;//Starte Vorgang AUTO Ausfahren
    M4 = 1;
  }
  if ((digitalRead(S2) == LOW)&&(M4 == 1)&&(M5 != 3)){//Remote von 0->1
    M5 = 2;//Starte Vorgang AUTO Einfahren
    M4 = 0;
  }
}
if (i == 98){
  float h = dht.readHumidity();     //Luftfeuchte auslesen
  float t = dht.readTemperature();  //Temperatur auslesen
  lcd.setCursor ( 4, 1 );
  lcd.print(" ");
  if (isnan(t) || isnan(h))
  {
    lcd.setCursor ( 4, 1 );
    lcd.print("error");//DHT22 konnte nicht ausgelesen werden
  }
  else
  {
    lcd.setCursor ( 4, 1 );
    lcd.print(h);
    lcd.setCursor ( 8, 1 );
    lcd.print("% ");
    lcd.setCursor ( 9, 1 );
    lcd.print(t);
    lcd.setCursor ( 14, 1 );
    lcd.print("C");
  }
}

lcd.setCursor ( 15, 0 );
lcd.print(digitalRead(SE11));
lcd.setCursor ( 14, 0 );
lcd.print(digitalRead(SE12));
lcd.setCursor ( 13, 0 );
lcd.print(digitalRead(SE21));
lcd.setCursor ( 12, 0 );
lcd.print(digitalRead(SE22));

lcd.setCursor ( 10, 0 );
lcd.print(digitalRead(S1));
lcd.setCursor ( 9, 0 );
lcd.print(digitalRead(S2));
lcd.setCursor ( 8, 0 );
lcd.print(digitalRead(S3));
lcd.setCursor ( 7, 0 );
lcd.print(digitalRead(S4));
lcd.setCursor ( 6, 0 );
lcd.print(digitalRead(S5));
lcd.setCursor ( 4, 0 );
lcd.print(M5);
lcd.setCursor ( 0, 0 );
lcd.print(M4);
if (M5 != 3){
  lcd.setCursor ( 1, 0 );
  lcd.print("R");
}
else{
  lcd.setCursor ( 1, 0 );
  lcd.print("F");
}
//--------------------------
}
« Last Edit: August 09, 2014, 11:13:48 am by Einheit468 » Logged

Offline Offline
Newbie
*
Karma: 6
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry, aber ich habe echt ein knoten im Kopf und komme nicht weiter, meinen Kopf verstehe ich einfach nicht warum der den Merker "M4" durch den "S2" nicht auf 1 setzt, bitte gebt mir einen Hinweis, mehr Augen sehen mehr.

Eingänge kommen alle sauber rein und der rest des Programmes funktioniert auch wie erwartet, warum der Teil nicht...
Logged

Offline Offline
God Member
*****
Karma: 13
Posts: 830
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
if ((digitalRead(S2) == HIGH)&&(M4 == 0)&&(M5 != 3)){//Remote von 1->0
    M5 = 1;//Starte Vorgang AUTO Ausfahren
    M4 = 1;
  }

== Gleich… 2 == 3 //Evaluiert zu falsch
!= Ungleich… 2 != 3 //Evaluiert zu wahr

also, bevor "if" ausgeführt wird:
S2 muß HIGH sein, M4 muß 0 sein, M5 darf nicht 3 sein
so sehe ich das.
Gruß und Spaß
Andreas
Logged

die zweite Maus bekommt den Speck...

Offline Offline
Newbie
*
Karma: 6
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hatte mir leider nicht geholfen, aber ich habe den Bug gefunden eine poplige geschwungene Klammer } die Falsch gesetzt war und wo damit die 2 if-Bausteine noch im switch-case Baustein drinne hang.

Funktionierendes Programm (wer braucht und ohne delay´s im loop() )
Code:
/*
Beschreibung Program:
Startvorraussetzungen1: Monitor ist eingefahren0
Startvorraussetzungen2: Monitor ist ausgefahren
Aufgaben: Monitor soll mittels Starttaste ein und ausklappen können.
Gegeben sind: Je 2Endlagenschalter und ein Motor fürhr Fahr und Drehbewegung
der Motor vom Drehwerk wird über RC-Regler angesteuert und braucht Servosignal
Beim Drücken der Starttaste soll sich die Mechanik zu den entgegen gesetzten
Position eigenständig bewegen
Startfunktion 2: Rausfahren ueber Remote=1, Runterfahren über Remote=0
Achtung Eingaenge alle Verdrehen (Geschalten=0 oder 0)
*/
#include <Servo.h>
#include <Wire.h>//für 16x2LCD
#include <LCD.h>//für 16x2LCD
#include <LiquidCrystal_I2C.h>//für 16x2LCD
#include "DHT.h"

//Temperatur/Feuchtigkeitssensor
#define DHTPIN 3
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22
DHT dht(DHTPIN, DHTTYPE);

//#define on LOW//Ausgang invertierung
//#define off HIGH

//16x2LCD
#define I2C_ADDR    0x27  // Define I2C Address where the PCF8574 is
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

//Eingänge
int SE11 = 14; //Endschalter Fahrwerk außen
int SE12 = 15; //Endschalter Fahrwerk innen
int SE21 = 16; //Endschalter Drehwerk oben
int SE22 = 17; //Endschalter Drehwerk unten
int S1 = 2; //AUTO=Start/HAND=umschaltung FW/DW
int S2 = 7; //Remote Spannung PC
int S3 = 8; //Schalter Handbetrieb
int S4 = 9; //HAND vor
int S5 = 13; //HAND rück
//Ausgänge
int K1 = 10; //Relaise1 Fahrwerk vorwaerts/raus
int K2 = 11; //Relaise4 Fahrwerk ruechwaerts/rein
int K3 = 12; //Relaise3 Linksrechtslauf umschaltung
//Servo
Servo Regler; //Drehwerk Servoausgang
//Merker
int M3 = 0; //Merker Monitor fertig ausgefahren
int M4 = 0; //Merker für Remote_letzter Zustand
int M5 = 0; //Merker
//1=Vorgang AUTO Ausfahren
//2=Vorgang AUTO Einfahren
//3=HAND

//Initialise the LCD
int i = 1;//Lebensbit
LiquidCrystal_I2C   lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

//===================================
//-----------------------------------
void setup() {
  /*pinMode(SE11, INPUT);
  pinMode(SE12, INPUT);
  pinMode(SE21, INPUT);
  pinMode(SE22, INPUT);
  pinMode(S1, INPUT);
  pinMode(S2, INPUT);
  pinMode(S3, INPUT);
  pinMode(S4, INPUT);*/
  pinMode(K1, OUTPUT);
  pinMode(K2, OUTPUT);
  pinMode(K3, OUTPUT);//MUSS RAUS!!!Drehwerk links/rechts
  Regler.attach(6);
  digitalWrite(K1, HIGH);
  digitalWrite(K2, HIGH);
  digitalWrite(K3, HIGH);
  Regler.write(7);//damit der nich ständing rumheult/Pipt(1)
 
  dht.begin();//Temperatur/Feuchtigkeitssensor
 
  lcd.begin (16,2);// Define LCD as 16 column x 2 rows
 
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);// Switch on the backlight
  lcd.setBacklight(HIGH);// Switch on the backlight
 
  lcd.setCursor ( 0, 0 );//setzt Zeiger auf 1.Spalte 1.Zeile
  lcd.print("Hallo Einheit468");
  delay (2000);
  lcd.setCursor ( 0, 0 );
  lcd.print("                 ");
}
void loop() {
//Lebens-"int"(Lebensbit)
  lcd.setCursor ( 15, 1 );
  lcd.print(i);//2Zeichen Zustand
  i = i + 1;
  if (i >= 999){
      i = 1;
  }
//-----------------------------------
  switch (M5)
  {
    case 0://Startbedingungen
      digitalWrite (K1, HIGH);
      digitalWrite (K2, HIGH);
      digitalWrite (K3, HIGH);
      lcd.setCursor ( 0, 1 );
      lcd.print("Auto");//Zeichen Zustand
      Regler.write(7);
      lcd.setCursor ( 15, 1 );//letzte Zeichen ausßer Bild
      if ((digitalRead(SE21) == LOW)&&(digitalRead(S1) == HIGH)&&(digitalRead(S3) == LOW)){
        M5 = 1;//Vorgang AUTO Ausfahren starten
        lcd.setCursor ( 0, 1 );
        lcd.print("Raus");//Zeichen Zustand
        break;
      }
      if ((digitalRead(SE21) == HIGH)&& (digitalRead(S1) == HIGH)&&(digitalRead(S3) == LOW)){
        M5 = 2;//Vorgang AUTO Einfahren starten
        lcd.setCursor ( 0, 1 );//Zeichen Zustand
        lcd.print("Rein");
        break;
      }
      if (digitalRead(S3) == HIGH){
        M5 = 3;//HAND
        lcd.setCursor ( 0, 1 );
        lcd.print("HAND");//Zeichen Zustand
        break;
      }
      break;
//-----------------------------------
    case 1://Vorgang AUTO Ausfahren
      if ((digitalRead(SE11) == LOW)&&(digitalRead(SE22) == HIGH)){
        digitalWrite (K1, LOW);
      }
      if (digitalRead(SE11) == HIGH){
        digitalWrite (K1, HIGH);
        if (digitalRead(SE21) ==LOW){
          Regler.write(100);//50
        }
      }
      if (digitalRead(SE21) == HIGH){
        Regler.write(7);
        M5 = 0;
      }
      break;
//-----------------------------------
    case 2://Vorgang AUTO Einfahren
      if ((digitalRead(SE11) == HIGH)&&(digitalRead(SE22) == LOW)){
        digitalWrite (K3, LOW);
        Regler.write(100);//50Plus Richtungsumkehr!!!!!!!!!!!!!!
      }
      if (digitalRead(SE22) == HIGH){
        Regler.write(7);
        digitalWrite (K3, HIGH);
        if (digitalRead(SE12) ==LOW){
          digitalWrite (K2, LOW);
        }
      }
      if (digitalRead(SE12) == HIGH){
        digitalWrite (K2, HIGH);
        M5 = 0;
      }
      break;
//-----------------------------------
    case 3://HAND
      if (digitalRead(S1) ==LOW){
        if ((digitalRead(S4) == HIGH)&&(digitalRead(S5) ==LOW)){//HAND Fahrwerk vor
          digitalWrite (K2, HIGH);
          digitalWrite (K1, LOW);
        }
        if ((digitalRead(S4) == LOW)&&(digitalRead(S5) == HIGH)&&(digitalRead(SE12) == LOW)){//HAND Fahrwerk rück
          digitalWrite (K1, HIGH);
          digitalWrite (K2, LOW);
        }
      }
      else{
        if ((digitalRead(S4) == HIGH)&&(digitalRead(S5) == LOW)&&(digitalRead(SE21) == LOW)){
          Regler.write(100);//50
        }
        if ((digitalRead(S4) == LOW)&&(digitalRead(S5) == HIGH)&&(digitalRead(SE22) == LOW)){
          digitalWrite (K3, LOW);
          Regler.write(100);//50
        }
      if (digitalRead(SE12) == HIGH){
        digitalWrite (K2, HIGH);
      }
      if (digitalRead(SE21) == HIGH){
        Regler.write(7);
      }
      if (digitalRead(SE22) == HIGH){
        Regler.write(7);
        digitalWrite (K3, HIGH);
      }
      if(digitalRead(S3) == LOW){//Rücksetzen HAND
        M5 = 0;
      }
      break;
  }
//--------------------------
 
}
if (digitalRead(S2)==1 && M4==0 && M5!=3){//Remote von 1->0
  M5 = 1;//Starte Vorgang AUTO Ausfahren
  M4 = 1;
  lcd.setCursor ( 0, 1 );
  lcd.print("RauS");//Zeichen Zustand
}
if (digitalRead(S2)==0 && M4==1 && M5!=3){//Remote von 0->1
  M5 = 2;//Starte Vorgang AUTO Einfahren
  M4 = 0;
  lcd.setCursor ( 0, 1 );
  lcd.print("ReiN");//Zeichen Zustand
}
if (i == 2){//aufruf aller ___ Zyklen)
  float h = dht.readHumidity();     //Luftfeuchte auslesen
  float t = dht.readTemperature();  //Temperatur auslesen
  lcd.setCursor ( 4, 1 );
  lcd.print(" ");
  if (isnan(t) || isnan(h))
  {
    lcd.setCursor ( 4, 1 );
    lcd.print("error");//DHT22 konnte nicht ausgelesen werden
  }
  else
  {
    lcd.setCursor ( 0, 0 );
    lcd.print(h);
    lcd.setCursor ( 4, 0 );
    lcd.print("% ");
    lcd.setCursor ( 6, 0 );
    lcd.print(t);
    lcd.setCursor ( 10, 0 );
    lcd.print("C");
  }
}
//--------------------------
}
so ich lerne mal weiter den Link und schaue mal an, ob ich das wirr-war nicht in paar schicke Funktionen Packen kann.
« Last Edit: August 12, 2014, 03:55:20 pm by Einheit468 » Logged

Pages: [1]   Go Up
Jump to: