Go Down

Topic: RTC ds3231 mit SH1106 Oled und SEesor. (Read 851 times) previous topic - next topic

Tommy56

Genau das soll dieses zeitlich verkürzte Beispiel zeigen, dass die Variante
Code: [Select]
if (aktuelleMillis -( unsigned char)(letzteMillis > dauer)) {
den Überlauf richtig meistert, die andere nicht.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

michael_x

Quote
if (aktuelleMillis -( unsigned char)(letzteMillis > dauer)) {
verstehe ich nicht:

(letzteMillis > dauer) ist entweder true oder false
( unsigned char)(letzteMillis > dauer) ist entweder 1 oder 0

Die if-Bedingung wird also in aller Regel als true ausgewertet.

Auch wenn du die Klammern sinnvoller setzt, sehe ich nicht, was der cast auf ein byte bewirken soll.

Die ganze Diskussion um einen beliebten Anfänger-Fehler, der eventuell mal kurzzeitig auftritt nachdem der Arduino über 49 Tage ohne Reset im Betrieb war, kommt mir übertrieben vor.

postmaster-ino

Hi

Mir nicht.
Man kann Das natürlich auch, wie die ganzen delay() in den Beispielen, gut heißen - wenn Jemand über das 49-Tage Problem stolpert, wird Er Sich wohl darum kümmern ... wie beim delay(), gell?
Warum die Leute dumm halten?
Man KANN Das verstehen, muß man aber nicht unbedingt, um Es richtig - Überlaufsicher!, zu machen.

Ich sehe jetzt keinen Vorteil darin, die falsche Variante als 'ach egal' hinzustellen, die korrekte Variante ist kein Deut mehr Aufwand, funktioniert aber immer.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Andreas87

Okay denn Hab ich das millis() aber schonmal verstanden ;)

Und man muss die Leute nicht Dumm halten weil sonst kommen ja auch immer wieder die selben Fragen und das ist ja auch nicht sinn und zweck des Forum.

Aber wie mach ich das jetzt mit der AN und AUS zeit? der geändert LOOP teil Funktioniert ohne Probleme aber sofern ich anstatt die Sensorwerte,die Zeit eintrage läuft da nichts mehr.

Tommy56

(letzteMillis > dauer) ist entweder true oder false
( unsigned char)(letzteMillis > dauer) ist entweder 1 oder 0
Du hast Recht. Ich habe das einfach ohne groß nachzudenken aus seinem Code abgeleitet.
Ich finde es aber immer wieder gut, dass man auf solche Flüchtigkeiten hingewiesen wird.

Der Cast ist nur bei - notwendig, damit er nicht in int rechnet.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Andreas87

#20
Oct 27, 2019, 10:24 am Last Edit: Oct 27, 2019, 10:27 am by Andreas87
Code: [Select]
void loop() {


  if (millis() - startZeit1 > zeit1) {
    rtcReadTime();
    printRTCDateTime();
    setRTCTime();
    sensorWert = analogRead(Bodenfeuchte);
    startZeit1 = millis();

  }
  Einstellen = map(sensorWert,  1023, 0, 0, 1023 );
  /* if (millis() - startZeit1 > zeit1) {
     sensorWert = analogRead(Bodenfeuchte);
     startZeit1 = millis();
    }
  */

 if ( Einstellen >= 601) {
    strip.setPixelColor(1, strip.Color(250, 0, 0));
    strip.show();
    digitalWrite(Relay, HIGH);
    long runtime = millis();


    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20, 35);
    display.println("Pumpe wartet");

  } else if (Einstellen <= 600 && Einstellen >= 301) {
    strip.setPixelColor(1, strip.Color(0, 0, 250));
    strip.show();
    long runtime = millis() / 1000;

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20, 35);
    display.println("Pumpe ON");

  } else if (Einstellen <= 300) {
    strip.setPixelColor(1, strip.Color(0, 250, 0));
    strip.show();
    digitalWrite(Relay, LOW);
    long runtime = millis();

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20, 35);
    display.println("Pumpe OFF");

  }

  
  { display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(35, 10);
    display.print("Boden  ");
    display.println(Einstellen);
  }
}




Ich hab das Gestern mal anders geschrieben und
so wie der Loop teil ist funktioniert es , aber sofern ich Die Zeit einfügen will denn macht er das nicht

Ich hab noch versucht das Stück Stück mit der zeit aufzubauen aber Ich komm immer auf der selbe Ergebnis wie der Erste Sketch
Kann mir keiner weiterhelfen wie ich jetzt weiterkomme?

postmaster-ino

Code: [Select]

if (millis() - startZeit1 > zeit1) {
    rtcReadTime();
    printRTCDateTime();
    setRTCTime();
    sensorWert = analogRead(Bodenfeuchte);
    startZeit1 = millis();
}

Wenn ich nach den Methoden-Namen gehe, liest Du die Zeit der RTC aus und setzt Diese danach wieder ... warum??
Auch hätte bei mir 'zeit1' einen irgendwie eingängigeren Namen ... Durchnummerieren mag bei Kindern vll. klappen, im Sketch ist's aber keine gute Idee.
Dein
Code: [Select]
long runtime = millis(); überlebt ebenfalls die IF nicht - Gültigkeit von Variablen!
Alles, was in einer Klammer eingepackt erzeugt wird (hier long runtime) wird am Ende der Klammer wieder frei gegeben.
Du müsstest eine Warnung zu einer unbenutzten Variable erhalten ... drei Mal ... für jeden IF-Block Eine.

ALLES, was der Kompiler rot anmeckert, ist potentiell Etwas, was Dir auf die Füße fallen wird!
Bei Fehlern (Error) kannst Du Dich nicht gegen wehren - Die MUSST Du ausbessert, sonst geht Nix zum Arduino.
Die Warnungen KANN man ignorieren, wenn man weiß, was diese Warnung bedeutet - sonst bessere Schuhe anziehen, wenn's Dir auf die Füße fällt, tut's nicht so weh.

In den Einstellungen müssen (warum auch immer) die vollständigen Meldungen erst aktiviert werden - solltest Du auch tun.
Was sich die IDE-Entwickler dabei gedacht haben, diese Informationen standardmäßig geheim zu halten ... daran rätselt wohl selbst der liebe Gott ...

Dann zu Deinem Problem: Worin besteht Es überhaupt?
Deiner Fehlerbeschreibung kann ich nicht folgen - wir wissen NICHT, was Du Alles über Dein Projekt weist - somit sollte die Erklärung einfacher werden ... siehe Rubber-Duck-Debugging

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

agmue

Durchnummerieren mag bei Kindern vll. klappen,
In Mitteleoropa werden selbst Kinder mit individuellen Namen unterschieden :)

... sonst bessere Schuhe anziehen, ...
Ich verwende Sicherheitsschuhe mit Stahlkappe, man weiß ja nie :)

Hast mich zum Lachen gebracht, danke :smiley-mr-green:

Sorry TO für OT. Aber auch dem letzten Absatz muß ich leider zustimmen.

Kann mir keiner weiterhelfen wie ich jetzt weiterkomme?
Sag mir, wo Du stehst, und ich werde darüber nachdenken.

Nutzt Du tatsächlich RGBW-LEDs oder doch RGB?

Benötigst Du sekundengenaue Schaltzeiten? Wenn auch Minuten reichen würden, wäre die Bibliothek jursRTCtimeEasy für Dich genau richtig. Da gibt man die Ein- und Ausschaltzeiten an, den Rest mit DS3231 übernimmt die Bibliothek. Ich habe SSD1306 anstelle SH1106. Ein Vorschlag zur Weiterentwicklung:

Code: [Select]
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(-1);
/*
  #include <SPI.h>
  #include <Adafruit_GFX.h>
  #include <Adafruit_SH1106.h>

  #define OLED_MOSI   9
  #define OLED_CLK   10
  #define OLED_DC    11
  #define OLED_CS    12
  #define OLED_RESET 13
  Adafruit_SH1106 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
*/
#include <Wire.h>  // include Wire library for I2C devices
#include "jursRTCtimeEasy.h" // include RTC time library

#include <Adafruit_GFX.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUM_LEDS 2
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

sTime localTime; // holds current time in local time (with regard to DST/summertime)
swTime_t switchTimes[] = { // define ON times
  {1707, 1708},  // 17:07 ein, 17:08 aus
  {1730, 2130}   // 17:30 ein, 21:30 aus
};
const byte NUMSWITCHTIMES = sizeof(switchTimes) / sizeof(switchTimes[0]);
const byte relayPin = 2;
const byte bodenSensor = A1;
int sensorWert = 0;
bool relayState = false;

void feuchte()
{
  sensorWert = analogRead(bodenSensor);
  display.setCursor(0, 20);
  display.print(F("Feuchte: "));
  display.print(sensorWert);
  Serial.print(F("Feuchte: "));
  Serial.println(sensorWert);
  if (sensorWert > 300)
  {
    relayState = false;
    strip.setPixelColor(0, strip.Color(0, 20, 0));
  } else if (sensorWert < 250)
  {
    strip.setPixelColor(0, strip.Color(20, 0, 0));
  }
}

void pumpe()
{
  digitalWrite(relayPin, relayState);
  if (relayState)
  {
    strip.setPixelColor(1, strip.Color(20, 0, 0));
  } else {
    strip.setPixelColor(1, strip.Color(0, 20, 0));
  }
  strip.show();

  display.setCursor(0, 0);
  display.println("Pumpemsteuerung");
  char buf[16];
  snprintf_P(buf, sizeof(buf), PSTR("%02d:%02d:%02d"), localTime.bHour, localTime.bMinute, localTime.bSecond);
  display.setCursor(0, 10);
  display.print(buf);
  Serial.print(buf);
  if (relayState)
  {
    display.print(F(" ON"));
    Serial.println(F(" ON"));
  } else {
    display.print(F(" OFF"));
    Serial.println(F(" OFF"));
  }
}


void setup()
{
  Serial.begin(9600); // enable Serial
  pinMode(relayPin, OUTPUT);
  if (RTCinit()) Serial.println(F("RTC OK"));
  else Serial.println(F("RTC/I2C ERROR"));
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Pumpemsteuerung");
  display.display();
  display.clearDisplay();
  strip.begin();
  strip.show();
}

void loop()
{
#define UPDATEINTERVAL 1000
  static unsigned long lastUpdateTime;
  if (millis() - lastUpdateTime >= UPDATEINTERVAL)
  {
    lastUpdateTime = millis();
    RTCreadLocalTime(localTime); // read localTime so that 'time' is a local time
    relayState = isOnTime(localTime, switchTimes, NUMSWITCHTIMES);
    feuchte();
    pumpe();
    display.display();
    display.clearDisplay();
  }
}


Der Font von Adafruit sieht gruselig aus, da wüßte ich besser lesbare Alternativen.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

uxomm

... die Bibliothek jursRTCtimeEasy
OT: Oh super, danke für den Link, wird demnächst bei mir eingesetzt.
Always decouple electronic circuitry.

agmue

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

uxomm

#25
Oct 27, 2019, 08:03 pm Last Edit: Oct 27, 2019, 08:04 pm by uxomm
Wenn Du noch etwas drumrum lesen möchtest
Always decouple electronic circuitry.

Andreas87

Code: [Select]

if (millis() - startZeit1 > zeit1) {
    rtcReadTime();
    printRTCDateTime();
    setRTCTime();
    sensorWert = analogRead(Bodenfeuchte);
    startZeit1 = millis();
}

Wenn ich nach den Methoden-Namen gehe, liest Du die Zeit der RTC aus und setzt Diese danach wieder ... warum??
Auch hätte bei mir 'zeit1' einen irgendwie eingängigeren Namen ... Durchnummerieren mag bei Kindern vll. klappen, im Sketch ist's aber keine gute Idee.
Dein
Code: [Select]
long runtime = millis(); überlebt ebenfalls die IF nicht - Gültigkeit von Variablen!
Alles, was in einer Klammer eingepackt erzeugt wird (hier long runtime) wird am Ende der Klammer wieder frei gegeben.
Du müsstest eine Warnung zu einer unbenutzten Variable erhalten ... drei Mal ... für jeden IF-Block Eine.

ALLES, was der Kompiler rot anmeckert, ist potentiell Etwas, was Dir auf die Füße fallen wird!
Bei Fehlern (Error) kannst Du Dich nicht gegen wehren - Die MUSST Du ausbessert, sonst geht Nix zum Arduino.
Die Warnungen KANN man ignorieren, wenn man weiß, was diese Warnung bedeutet - sonst bessere Schuhe anziehen, wenn's Dir auf die Füße fällt, tut's nicht so weh.

In den Einstellungen müssen (warum auch immer) die vollständigen Meldungen erst aktiviert werden - solltest Du auch tun.
Was sich die IDE-Entwickler dabei gedacht haben, diese Informationen standardmäßig geheim zu halten ... daran rätselt wohl selbst der liebe Gott ...

Dann zu Deinem Problem: Worin besteht Es überhaupt?
Deiner Fehlerbeschreibung kann ich nicht folgen - wir wissen NICHT, was Du Alles über Dein Projekt weist - somit sollte die Erklärung einfacher werden ... siehe Rubber-Duck-Debugging

MfG
Also bei Mir kommt keinerlei Warnung, sonst würde der sketch auch nicht laufen.

das mit der EInstellung hab ich gemacht die Warnung war auf  "keine" eingestellt. und ja er zeigt es jetzt an.

Mein problem ist eigentlich ganz einfach, wenn das Display "Relay ON"schreiben soll und  der strip in "strip.setPixelColor(1, strip.Color(250, 250, 0));" gehen soll denn blinken die beiden Sachen einmal kurz auf und denn ist es wieder Rot  und im Display steht "Pumpe wartet" es sollte eigentlich solange anbleiben bis das Relay wieder LOW geschaltet wird.
und sollte der SensorWert, in der zeit wo das Relay HIGH geschaltet ist,von<300 auf >300 gehen schaltet das Relay nicht mehr LOW.
Könnt ihr es jetzt nachvollziehen?

Serenifly

Quote
sonst würde der sketch auch nicht laufen.
Eine Warnung ist nur das. Eine Warnung. Kein Fehler.

Andreas87

In Mitteleoropa werden selbst Kinder mit individuellen Namen unterschieden :)
Ich verwende Sicherheitsschuhe mit Stahlkappe, man weiß ja nie :)

Hast mich zum Lachen gebracht, danke :smiley-mr-green:

Sorry TO für OT. Aber auch dem letzten Absatz muß ich leider zustimmen.
Sag mir, wo Du stehst, und ich werde darüber nachdenken.

Nutzt Du tatsächlich RGBW-LEDs oder doch RGB?

Benötigst Du sekundengenaue Schaltzeiten? Wenn auch Minuten reichen würden, wäre die Bibliothek jursRTCtimeEasy für Dich genau richtig. Da gibt man die Ein- und Ausschaltzeiten an, den Rest mit DS3231 übernimmt die Bibliothek. Ich habe SSD1306 anstelle SH1106. Ein Vorschlag zur Weiterentwicklung:


Ja ich nutze wirkliche RGBW, allerdings nur weil ich gerade keine anderen dahabe, ansonsten hab ich RGB
Nein minutengenau reicht in dem fall völlig aus.
Zu dem display ich hatte schon einen fuktionierenden sketch geschrieben mit ner ds1302 und nem SSD1306
und hatte das an einem nano. und der hat ja nur ein SDA und SCL pin. das ich aber von der ds1302 nicht so überzeugt war hab ich mir ne ds3231 gekauft und dazu ein sh1106 display.
Man kann ja schlecht das SSD1306 und die ds3231 auf ein Pin machen oder sehe ich das falsch?

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up