zustand des Garagentors(offen oder geschlossen)

Hallo zusammen,
bin neu im Forum und absoluter Beginner.
Folgendes Projekt möchte ich realisieren -komme aber nicht wirklich weiter :~:
Ich möchte mir den Zustand des Garagentors per LCD und RF-Übertragung anzeigen lassen. Ist das Garagentor geschlossen, soll “Garagentor geschlossen” angezeigt werden ; wenn es offen ist dann halt “… offen”.
Die Bauteile habe ich schon: Arduino Mega und RF(wohl ASK)-Module.
Für sich funktioniert es scheinbar auch (Arduino - ohne RF-erkennt die Pegel und das LCD zeigt die Zustände an).
Die RF-Kombination scheint auch zu funktionieren (beim Sender verwende ich einen Taster als Impulsgeber). Wobei aber der Empfänger wohl nicht kontinuierlich das Signal anzeigt (Test mit LED). Es wird wohl nur der Impulse angezeigt.
Wenn ich den Mega mit dem RF-Receiver verbindet kommt nichts oder nur zufällig.

Würde mich freuen, wenn jemand Hilfestellung geben könnte.
BG
Megarduino

// Voreinstellung
#include <VirtualWire.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x27 // Adresse meines LCD I2C
#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);

int pinIN = 22;     // deklariert Pin 22 als pinIN
int pinOUT = 23;    // deklariert Pin 23 als pinOUT
int pinLCD = 24;    // deklariert Pin24 als Pin für LCD

// the setup routine runs once when you press reset:
void setup() 
{ 
  //Voreistellungen für das LCD
  //{
    lcd.begin (16,2); //  <<----- My LCD was 16x2  
    // Switch on the backlight
    lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
    lcd.setBacklight(HIGH);
    lcd.home (); // go home      
   //} 
  //Voreinstellung für Übertragung RF-Modul und Ein-/Ausgabe PINs 
  Serial.begin(9600); //Übertragungsgeschwindigkeit
  pinMode (pinIN,INPUT);      // setzt Pin 22 als Input
  //pinMode (pinOUT,OUTPUT);    // setzt Pin 23 als Output
  //pinMode (pinLCD, OUTPUT);    // setzt Pin 24 als LCD-Pin für Textausgabe,
  
}

void loop() 
{
  if (digitalRead(pinIN) == HIGH)   //fragt ab ob pinIN=HIGH
   {digitalWrite(pinOUT,HIGH);      //wenn ja, dann pinOUT=HIGH
    lcd.clear();                    // löscht die Anzeige
    lcd.setCursor (0,0);            // Cusor in die linke Ecke in Zeile 1
    lcd.print("Garagentor");        // schreibt Text in die 1.Zeile
    lcd.setCursor (0,1);            // Cusor in die linke Ecke in Zeile 2
    lcd.print("geschlossen");       // schreibt Text in die 2. Zeile
   delay(50);
 }
  else                              //sonst pinOUT=LOW
   {digitalWrite(pinOUT,LOW);
    lcd.clear();                    // löscht die Anzeige
    lcd.setCursor (0,0);            // Cusor in die linke Ecke in Zeile 1
    lcd.print("Garagentor");        // schreibt Text in die 1.Zeile
    lcd.setCursor (0,1);            // Cusor in die linke Ecke in Zeile 2
    lcd.print("offen");       // schreibt Text in die 2. Zeile
   delay(500);
   }
}

Garage3.ino (2.43 KB)

Hallo Megarduino,
versuche in deinem Sketch ohne Delay's auszukommen, denn wenn während einer Pause auf deinem in Pin was rein kommt, bekommt es der Dino nicht mit. Du kannst das Display nach einer festen zeit aktualisieren. Wenn das noch nicht hilft, kannst das Eingangssignal mit einem Interrupt abfragen.

Hallo Ardubu,
danke für die Info. Das mit dem Delay werd ich noch hinbekommen. Aber ob das mit dem Interrupt ist fraglich... :roll_eyes:
Ist der Code denn so ok oder sind da grundsätzliche Probleme? Ich hab heute auch noch mal versucht, ob ich weiterkomme wenn ich per Transistor den Pin 22 auf High (5V) lege um einen definierten Zustand zu bekommen. hat aber auch nicht geholfen.
Auch wenn ich den Taster 10s drücke ändert sich nichts. Die LED blinkt kurz und dann ist alles dunkel.

BG
Megarduino

Interrupt ist für die Anwendung nicht wichtig. Den delay Ersatz millis würde ich auf jedenfall anschauen und verinnerlichen, für dein Programm aber unnötig!

Ich gehe mal davon aus, du hast delay eingesetz, weil dein LCD flackert. Grund ist, dass du das Display zu häufig aktualisiert hast.
Habe state und lastState hinzugefügt. Das Display erneuert sich nur wenn sich etwas geändert hat.

Gruß Stefan

// Voreinstellung
#include <VirtualWire.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x27 // Adresse meines LCD I2C
#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);

int pinIN = 22;     // deklariert Pin 22 als pinIN
int pinOUT = 23;    // deklariert Pin 23 als pinOUT
int pinLCD = 24;    // deklariert Pin24 als Pin für LCD

boolean state;
boolean lastState;

// the setup routine runs once when you press reset:
void setup() 
{ 
  //Voreistellungen für das LCD
  lcd.begin (16,2); //  <<----- My LCD was 16x2  
  // Switch on the backlight
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home (); // go home      
  //Voreinstellung für Übertragung RF-Modul und Ein-/Ausgabe PINs 
  Serial.begin(9600); //Übertragungsgeschwindigkeit
  pinMode (pinIN,INPUT);      // setzt Pin 22 als Input
  pinMode (pinOUT,OUTPUT);    // setzt Pin 23 als Output
  pinMode (pinLCD, OUTPUT);    // setzt Pin 24 als LCD-Pin für Textausgabe,

}

void loop() 
{
  if (digitalRead(pinIN) == HIGH) {  //fragt ab ob pinIN=HIGH
    state = true;
    digitalWrite(pinOUT,HIGH);      //wenn ja, dann pinOUT=HIGH
  }
  else {                            //wenn nein, dann PinOUT=LOW
    state = false;
    digitalWrite(pinOUT,LOW);
  }

  if (state!=lastState) {
    lastState = state;
    if(state == true) {
      lcd.clear();                    // löscht die Anzeige
      lcd.setCursor (0,0);            // Cusor in die linke Ecke in Zeile 1
      lcd.print("Garagentor");        // schreibt Text in die 1.Zeile
      lcd.setCursor (0,1);            // Cusor in die linke Ecke in Zeile 2
      lcd.print("geschlossen");       // schreibt Text in die 2. Zeile
    }
    else {
      digitalWrite(pinOUT,LOW);
      lcd.clear();                    // löscht die Anzeige
      lcd.setCursor (0,0);            // Cusor in die linke Ecke in Zeile 1
      lcd.print("Garagentor");        // schreibt Text in die 1.Zeile
      lcd.setCursor (0,1);            // Cusor in die linke Ecke in Zeile 2
      lcd.print("offen");       // schreibt Text in die 2. Zeile
    }
  }
}

Nabend Stefan, Danke für die Info. Werds am Wochende mal ausprobieren und mich zu state und lastState einlesen. Die Befehle kenn ich bislang gar nicht.
Ja, delay wegen des Flackerns des LCD.

Besten Dank und ich bin mal gespannt ob`s funktioniert.

BG und einen schönen Abend noch.

State und laststate sind variablen, keine befehle. Siehst du aber schnell beim code lesen.

Klaus_ww:
State und laststate sind variablen, keine befehle. Siehst du aber schnell beim code lesen.

]:smiley:

Hallo Megarduino,

in deinem Sketch läßt du die LED für 50 ms leuchten wenn am in_Pin ein High Signal anlag.
Ich vermute mal das du nur bei einem Wechsel des Eingangssignals die LED an bzw. ausschalten willst, dazu solltest du den Sketch von sschultewolter modifizieren

// Voreinstellung
#include <VirtualWire.h>
#include <Wire.h>
//#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x27 // Adresse meines LCD I2C
#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(0x27,16,2);//*/lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

boolean pinIN = 22;     // deklariert Pin 22 als pinIN
int pinOUT = 23;    // deklariert Pin 23 als pinOUT
//int pinLCD = 24;    // deklariert Pin24 als Pin für LCD

boolean state;
boolean laststate=false;

// the setup routine runs once when you press reset:
void setup() 
{ 
  //Voreistellungen für das LCD
  lcd.begin (16,2); //  <<----- My LCD was 16x2  
  // Switch on the backlight
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home (); // go home      
  //Voreinstellung für Übertragung RF-Modul und Ein-/Ausgabe PINs 
  Serial.begin(9600); //Übertragungsgeschwindigkeit
  pinMode (pinIN,INPUT);      // setzt Pin 22 als Input
  pinMode (pinOUT,OUTPUT);    // setzt Pin 23 als Output
  pinMode (pinLCD, OUTPUT);    // setzt Pin 24 als LCD-Pin für Textausgabe,

}

void loop() 
{ state=digitalRead(pinIN);
  if (!state==laststate){
   if (state){
      
      digitalWrite(pinOUT,HIGH);      //wenn ja, dann pinOUT=HIGH
      lcd.clear();                    // löscht die Anzeige
      lcd.setCursor (0,0);            // Cusor in die linke Ecke in Zeile 1
      lcd.print("Garagentor");        // schreibt Text in die 1.Zeile
      lcd.setCursor (0,1);            // Cusor in die linke Ecke in Zeile 2
      lcd.print("geschlossen");       // schreibt Text in die 2. Zeile
    }
    else {
      digitalWrite(pinOUT,LOW);
      lcd.clear();                    // löscht die Anzeige
      lcd.setCursor (0,0);            // Cusor in die linke Ecke in Zeile 1
      lcd.print("Garagentor");        // schreibt Text in die 1.Zeile
      lcd.setCursor (0,1);            // Cusor in die linke Ecke in Zeile 2
      lcd.print("offen");       // schreibt Text in die 2. Zeile
    }
state=laststate;  
}
  
}

Ach, sind ja gar keine Endschalter von PinIN :wink: Ja muss man dann anpassen :wink:

sorry hat sich ein fehler eingeschlichen

// Voreinstellung
#include <VirtualWire.h>
#include <Wire.h>
//#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x27 // Adresse meines LCD I2C
#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(0x27,16,2);//*/lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

boolean pinIN = 22;     // deklariert Pin 22 als pinIN
int pinOUT = 23;    // deklariert Pin 23 als pinOUT
//int pinLCD = 24;    // deklariert Pin24 als Pin für LCD

boolean state;
boolean laststate=false;

// the setup routine runs once when you press reset:
void setup() 
{ 
  //Voreistellungen für das LCD
  lcd.begin (16,2); //  <<----- My LCD was 16x2  
  // Switch on the backlight
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home (); // go home      
  //Voreinstellung für Übertragung RF-Modul und Ein-/Ausgabe PINs 
  Serial.begin(9600); //Übertragungsgeschwindigkeit
  pinMode (pinIN,INPUT);      // setzt Pin 22 als Input
  pinMode (pinOUT,OUTPUT);    // setzt Pin 23 als Output
  pinMode (pinLCD, OUTPUT);    // setzt Pin 24 als LCD-Pin für Textausgabe,

}

void loop() 
{ state=digitalRead(pinIN);
  if (!state==laststate){
   if (state){
      
      digitalWrite(pinOUT,HIGH);      //wenn ja, dann pinOUT=HIGH
      lcd.clear();                    // löscht die Anzeige
      lcd.setCursor (0,0);            // Cusor in die linke Ecke in Zeile 1
      lcd.print("Garagentor");        // schreibt Text in die 1.Zeile
      lcd.setCursor (0,1);            // Cusor in die linke Ecke in Zeile 2
      lcd.print("geschlossen");       // schreibt Text in die 2. Zeile
    }
    else {
      digitalWrite(pinOUT,LOW);
      lcd.clear();                    // löscht die Anzeige
      lcd.setCursor (0,0);            // Cusor in die linke Ecke in Zeile 1
      lcd.print("Garagentor");        // schreibt Text in die 1.Zeile
      lcd.setCursor (0,1);            // Cusor in die linke Ecke in Zeile 2
      lcd.print("offen");       // schreibt Text in die 2. Zeile
    }
laststate=state;  
}
  
}

Hallo Tutoren,
ich hab mal beide Sketche ausprobiert und beide bringen leider nicht das gewünschte Ergebnis. Der letzte, korrigierte produziert eigentlich nur 11 oder 00. Ich möchte auch keine LED schalten o.ä.
Mein Wunsch ist es, eine Anzeige zu haben wann das Garagentor offen oder geschlossen ist. Und das per RF weil ich keine Kabel legen kann.
Ich vermute mal, daß es auch an der Hardware liegt da ich z.Zt. keine Codierung im zu sendenen Signal habe; nur ein Impuls wenn ich einen Taster drücke. Vermutlich wird hier schon eine Fülle von Signalen gesandt die der Empfänger nicht versteht.
Der Arduino soll nur als Treiber für das LCD dienen(Anzeige: "Garage offen" oder "Garage geschlossen").
Im Prinzip so wie die Fernschaltung von einer Funksteckdose eben halt nur ohne Dose.

Habt ihr da noch einen Tipp?

@ Ardubu: Es heißt ja: "Gib einem Mann einen Fisch und er wird für einen Tag satt. Zeigt ihm wie man fischt und er wird jeden Tag satt." Ich möchte verstehen. Deshalb: Warum arbeitest Du (man) mit Boolean und nicht mit HighLow?

BG

Megarduino

Hallo Megarduino,
Boolean ist eine Variablen Deklaration und die Variable kann den Wert HIGH oder LOW bzw. 1 oder 0 bzw. TRUE oder FALSE annehmen.
Gruß
Ardubu

Wenn man es ganz genau nimmt ist etwas komplizierter. False ist 0 und alles was von 0 verschieden ist ist True. Normalerweise wird True als 1 definiert, aber es gibt ein paar Fälle bei denen das relevant ist. Vor allem wenn man einen eingelesenen Wert mit Und verknüpft um zu überprüfen ob ein Bit gesetzt ist.

Was du da machst ist aber falsch:

boolean pinIN = 22;

stimmt, sollte nicht boolean pin IN=22 heißen sondern const byte pin IN=22 oder #define pinIN 22.
Sorry

zu deinem RF Problem: Du wirst für den Sender auch einen Microcontroler benötigen z.B. Attiny 85, dann mit Virtrual Wire über RF übertragen und mit dem Mega und Virtual Wire empfangen und auswerten.

Hallo zusammen,
@ ardubu: Ja, das sehe ich nach weiterer Recherche im Netz auch so. Hab mir mal ein paar En-/Decoder und Attinys bestellt.
Ich bin mal gespannt. Wahrscheinlich gibt es dann wieder neue Probleme, die zu lösen sind. Aber egal - ist ja Hobby :D.

Allen erst einmal vielen Dank uns Frohe Festtage und einen guten Rutsch.

BG

Megarduino