Rtc mit fotowiderstand

Hi zusammen.
Bin relativ neu was arduino angeht...
Hab mal vor etlichen Jahren bisschen was zusammen gebastelt... Das wissen dazu ist aber wieder raus.

Möchte ein led stripe anhand einer gewissen Helligkeit steuern.. Das ist ja noch simpel mit paar Zeilen abgehandelt..

Nun möchte ich aber das Licht nur zwischen 6-20 Uhr an haben...
(Hühnerstall Im winter)

Uno, fotowiderstand und rtc ds3231 sind bestellt...

Möchte mich eigentlich ungern so tief jetzt einarbeiten in die Materie das ich es komplett selber schreiben kann.
Und das Rad neu erfinden muss man ja auch nicht immer.
Aber wie ich die Uhrzeit mit Lichtsensor Abfrage kombiniere ist mir noch nen Rätsel...

kkz89:
Aber wie ich die Uhrzeit mit Lichtsensor Abfrage kombiniere ist mir noch nen Rätsel...

Sieh Dir die Beispiele der Bibliothek an, mit der Du die RTC abfragst. Dann schreibst Du in loop() die Abfolge:

  • Uhr abfragen
  • wenn innerhalb des Zeitfensters UND Lichtsensor zeigt hell: LED-Streifen aus (oder wasauchimmer)
  • wenn innerhalb des Zeitfensters UND Lichtsensor zeigt dunkel: LED-Streifen an

Auf diese Weise wird zwar ständig abgefragt und geschaltet, aber Du kannst ja noch ein delay() einfügen, damit das nicht gar so häufig passiert. Für das UND benutzt Du && - das ist eine logische UND-Verknüpfung (nur wenn beide Bedingungen wahr).

Gruß

Gregor

(deleted)

Hallo.
Hab nur keine Lösung gefunden wie die Abfrage zwischen 2 uhrzwiten ist.
Nur Leute die damit Probleme hatten

kkz89:
Hallo.
Hab nur keine Lösung gefunden wie die Abfrage zwischen 2 uhrzwiten ist.
Nur Leute die damit Probleme hatten

Das kann ich allerdings nicht verstehen.

Es gibt auch hier im Forum genug Beiträge über Schaltuhren und wie man die entsprechenden Zeiten in einer if-Abfrage verwendet.

Warum postest du uns nicht deinen bisherigen Sketch, dann können wir sehen, wie weit das bisher funktioniert.
Setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken, oder [code] davor und [/code] dahinter ohne *.

Damit wird dieser für alle besser lesbar.

Bis dato hab ich noch 0 sketch..
Arduino mit Komponenten kommt morgen an.
Gucke halt gerade schon mal nach allen Teilen...
Ich weiß copy paste ist meist nicht die elegante Lösung... Aber von Grund auf c++ lernen dafür hab ich nicht die Zeit

Ich verstehe das so, dass du den Hühnern tagsüber Licht anmachen willst, wenn es Winter ist und daher zu dunkel. (Also am Morgen und Abend den Tag auf 6 bis 20 Uhr verlängern)

Hab nur keine Lösung gefunden wie die Abfrage zwischen 2 uhrzwiten ist.
Nur Leute die damit Probleme hatten

Bis du genau deins irgendwo gefunden hast, und beurteilen kannst ob die Lösung deinen Ansprüchen genügt, hast du schneller "c++ von Grund auf" gelernt und es selbst gemacht.

Eine RTC hat intern die Uhrzeit als mehrere einzelne Zahlen. Die liest du am besten direkt ohne spezielle RTC Library (nur Wire.h) Und machst daraus am besten eine Zahl als "laufende Minute des Tages". In deinem Fall würde sogar reichen, nur die Stunde zu lesen. Die kannst du dann auf die gewünschten zwei Werte abfragen.
Wenn es danach "Tagsüber" ist, machst du Licht an, wenn Fotowiderstandwert >= dunkel.

Genug Hysterese und Verzögerungen, um die Hühner nicht zu sehr zu stören.

Auch sollte der Fotowiderstand nicht von der Beleuchtung getroffen werden. (Die echten Probleme haben nichts mit dem bisschen Programmieren zu tun.)

Aber von Grund auf c++ lernen dafür hab ich nicht die Zeit

nimm eine herkömmliche Schaltuhr und schalte damit das Netzeil deines Unos.
Problem mit 0 Zeilen Code erledigt.

kkz89:
Ich weiß copy paste ist meist nicht die elegante Lösung... Aber von Grund auf c++ lernen dafür hab ich nicht die Zeit

So bissl Wissen schadet nicht.
Aber ne Handvoll Grundlagen brauchst Du schon - sonst scheiterts schon am (hardware-)setup().
Meine Empfehlung das Du wenigstens ein Nachschlagewerk für Deine Aufgabe hast und weisst wo es steht.
https://www.arduinoforum.de/code-referenz

Das .pdf liest sich schön weg. Andreas hat sich viel Mühe gegeben, das verständlich zu formulieren.

@michael genau so mein ich das.
Okay schaue ich mir dann mal an..
Ja hoch faden werde ich es wohl und der sensor kommt nach draußen.
Hab ich schon bedacht.

@noiasca ne.. Möchte es wenn Zeit ist auch gerne noch erweitern....

Aktuell hab ich aber andere Sachen noch zu lernen und bauen... Da möchte ich mich auf das wesentliche beschränken...

@my_xy
Ja bisschen kann ich. Nicht c++ aber programmiere beruflich g Code mit Variablen usw...
Also lesen kann ich die Codes schon..
Werde ich mir mal durchlesen.

Arduino ist heute angekommen...
Werde dann mal schauen das ich am we bar Sketche baue und teste

kkz89:
Arduino ist heute angekommen...
Werde dann mal schauen das ich am we bar Sketche baue und teste

Prima, dann kannst ja schon loslegen und Üben.
Die IDE hat ja einige Beispiele dabei, an denen man ja schon einiges Testen kann.
Und wenn Fragen aufkommen, einfach melden.

Hab da mal was zusammen geschustert :o
Ob der geht keine Ahnung muss ich mal die Tage dann testen.
Aber evtl sieht ja jemand schon gleich grobe schnitzer..

Muss dann noch geändert werden, dass ich LED band nehmen kann und es Dimmt.. Aber das bekommt man dann sicher noch hin :wink:

Ansonsten... was muss ich machen, das die Abfrage über ein gewissen Zeitraum Passiert?
Beispiel es Gewittert... nun soll im Stall dann natürlich nicht Disco Feeling ausbrechen....

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>

setSyncProvider(RTC.get); // time alle 5 Minuten mit RTC syncen

int eingang= A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
int LED = 10; //Das Wort „LED“ steht jetzt für den Wert 10
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert

boolean Tag()
{
if (hour >= 6 )&& (minute <= 20) return true

}
void setup()//Hier beginnt das Setup.
{
Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet. 
pinMode (LED, OUTPUT); //Der Pin mit der LED (Pin 10) ist jetzt ein Ausgang
//Der analoge Pin muss nicht definiert werden.
}

void loop()
{


sensorWert =analogRead(eingang); //Die Spannung an dem Fotowiderstand auslesen und unter der Variable „sensorWert“ abspeichern.
Serial.print("Sensorwert = " ); //Ausgabe am Serial-Monitor: Das Wort „Sensorwert: „
Serial.println(sensorWert); //Ausgabe am Serial-Monitor. Mit dem Befehl Serial.print wird der Sensorwert des Fotowiderstandes in Form einer Zahl zwischen 0 und 1023 an den serial monitor gesendet.

if ((sensorWert > 512 ) && (Tag() == true)//Wenn der Sensorwert über 512 beträgt und Tag ist….
{
digitalWrite(LED, HIGH); //…soll die LED leuchten…
}

else 
{
digitalWrite(LED, LOW); //….soll sie nicht leuchten.
}

delay (500);//Eine kurze Pause, in der die LED an oder aus ist

}

kkz89:
Hab da mal was zusammen geschustert :o
Ob der geht keine Ahnung muss ich mal die Tage dann testen.

Die einfachste Art wäre einfach nur den Sketch zu kompilieren. Kurztaste: STRG-R
Dann würde das auffallen:

boolean Tag()
{
  if (hour >= 6 ) && (minute <= 20) return true
  }

Ja da geht einiges nicht...
Hab aber auch das Problem das aus der arduino Referenz das Beispiel nicht geht...
Laut dem soll die ds1307rtc.h verwendet werden...
Diese ist aber bei den verwendeten nicht dabei.

Weiß einer welche genau das ist?

was muss ich machen, das die Abfrage über ein gewissen Zeitraum Passiert?

Um kurzzeitige Einbrüche der Dunkelheit zu ignorieren, im einfachsten Fall sowas ähnliches

int maxVerz(int roh, byte dt) {
   // verzögert kurzzeitige Einbrüche des Rohwerts um dt Sekunden 
  static int speicher;
  static unsigned long begin;
  if ( (roh > speicher) // Wert wächst
       ||  (millis() - begin > dt*1000UL) ) // oder Wartezeit abgelaufen
  {
       speicher = roh;
       begin = millis();
  }
  return speicher;
}

Geht davon aus dass du den LDR-Spannungsteiler so angeschlossen hast, dass "je dunkler desto mehr".
Allgemein (und vor allem gleichzeitig mehrfach) verwendbar ist das nicht!

if (hour >= 6 )&& (minute <= 20) return true

Das ist sicherlich (aus mehreren Gründen) Unsinn.
Du meinst vermutlich sowas:

bool Tag() {
  byte hour = ... ; // wie auch immer du die aktuelle Stunde (0 .. 23) aus deiner Library oder der RTC direkt kriegst.
  return (hour >= 6 && hour < 20); // liefert true von 6:00 bis 19:59 
}

so.
jetzt funktioniert es fast :wink:

#include <DS3231.h>  // http://www.rinkydinkelectronics.com/library.php?id=73

int LED = 4;
int eingang= A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)

int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert


DS3231  rtc(SDA, SCL);
Time t;

const int OnHour =6;
const int OnMin = 50;
const int OffHour = 17;
const int OffMin = 0;

bool Tag() {
  byte hour = t.hour ; // 
  return (hour >= 6 && hour < 20); // liefert true von 6:00 bis 19:59
}


void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop() {
  sensorWert =analogRead(eingang);
  Serial.print("Sensorwert = " );
  Serial.println(sensorWert); 
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
 
 
  if(sensorWert > 512 && Tag == true){
    digitalWrite(LED,HIGH);
    Serial.println("LIGHT ON");
    }
   
    else {
      digitalWrite(LED,LOW);
      Serial.println("LIGHT OFF");
    }
}

Hab noch folgenden Fehler...

C:\Users\kevin\Documents\Arduino\test\TimeRTC_foto\TimeRTC_foto.ino: In function 'void loop()':
C:\Users\kevin\Documents\Arduino\test\TimeRTC_foto\TimeRTC_foto.ino:41:33: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
   if(sensorWert > 512 && Tag == true){
                                 ^~~~

wie und wo ich michaels teil wegen der verzögerung einbinde ist mir gerad nen rätsel

Du verwendest für eine Funktion und als Variable den selben Namen (Tag), das gibt den Fehler.

kkz89:
so.
jetzt funktioniert es fast :wink:

Prima, jetzt mach's noch hübsch :slight_smile:

Gruß

Gregor

Jetzt hab ich es wirklichfast
die Helligkeit der led wird jetzt heller umso dunkler es ist
allerdings ist es sehr anfällig...
led leuchtet zwar passend, allerdings flackert es schon ziemlich...

Wie kann ich das umgehen?

#include <DS3231.h>  // http://www.rinkydinkelectronics.com/library.php?id=73
#define LED 5
#define FADESPEED 7
//int LED = 5;
int eingang= A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)

int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert


DS3231  rtc(SDA, SCL);
Time t;

bool Tag() {
  byte hour = t.hour ; // 
  return (hour >= 6 && hour < 20); // liefert true von 6:00 bis 19:59
}


void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop() {
   eingang = analogRead(A0);
  int i;
  sensorWert =analogRead(eingang);
  Serial.print("Sensorwert = " );
  Serial.println(sensorWert); 
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
 
 if (t.hour >= 6 & t.hour <= 20 & sensorWert < 512) {
 
  
      analogWrite(5 , map ( eingang , 0 , 512 , 255 , 0 ) );
  //for (int helligkeit =1; helligkeit <= 255; helligkeit = helligkeit +1)
    //analogWrite(LED, helligkeit);
    //delay (30);
  }

    else {
      digitalWrite(LED, LOW);}
    }

Und iwie müsste ich noch einpflegen das es nicht mit 100%startet.
Kann ja um 6 Uhr stock finster sein..
Oder doch einfach hoch dimmen...
Das ging auch.. Nur ist er da immer wieder aus.. Hoch gedimmt.. Aus hoch gedimmt usw...