Go Down

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

Andreas87

Eine Warnung ist nur das. Eine Warnung. Kein Fehler.
Ja hab ich auch mitbekommen gerade ;)

Ich werde mich da erstmal ransetzen und die von euch geschrieben mängel versuchen aufzuarbeiten  

postmaster-ino

Hi

Was Tommy56 sagen möchte:
Dort kannst Du beliebig viele I²C-Geräte anschließen.
... ok ... fast :)
Diese müssen jeweils eine separate ID haben - viele I²C-Komponenten haben A0...A3 Pins, an Denen man die Adresse einstellen kann - also mehrere davon nebeneinander setzen kann.
Angeschwätzt werden die Teilnehmer - Du errätst Es - über diese Adresse.
Alle, Die NICHT gemeint sind, halten einfach den Mund und warten auf einen neuen Start ... mit neuer Adresse.
Wenn Sie wieder nicht gemeint sind ... weiter schlafen.

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

In #28 stimmt die Formatierung nicht, das könntest Du nachträglich noch ändern.

Ja ich nutze wirkliche RGBW, ...
Dann müßtest Du das in meinem Vorschlag an RGBW anpassen.

Nein minutengenau reicht in dem fall völlig aus.
Dann versteckt die Bibliothek doch die ganzen schwierigen Berechnungen, Du könntest sie also verwenden.

... aber von der ds1302 nicht so überzeugt war hab ich mir ne ds3231 ...
DS3231 ist die bessere weil genauere Wahl.

Man kann ja schlecht das SSD1306 und die ds3231 auf ein Pin machen oder sehe ich das falsch?
Vollkommen falsch, wurde schon erklärt.

Ich möchte Dich auch zu keiner anderen Hardware überreden, nur teste ich halt mit der Hardware, die meine Bastelkiste als "nah dran" ausspuckt. Dann zeige ich das von mir getestete Programm und weise auf die Unterschiede in der Hardware hin, damit Du mein Programm an Deine Hardware anpassen und ausprobieren kannst. Deine Frage bezieht sich ja auf die Schaltzeiten und nicht auf Display und LEDs.

Andererseits, wenn Du ein SSD1306 rumliegen hast, kannst Du auch das anschließen.

Mein Vorschlag: Passe mein Programm an Deine Hardware an, teste die Logik und verändere sie nach Deinen Wünschen. Frage, wenn Dir Fragen begegnen.

Danach hätte ich dann noch eine Display-Bibliothek mit besser lesbarem Font im Angebot.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Andreas87

Ich hab mir das jetzt in ruhe anschauen können und auch angepasst.
eins zwei fragen hätte ich da aber.

Kann man Auf Sommer und Winterzeit umstellen?

warum steht void pumpe unn void feuchte nicht im loop?



Code: [Select]
    display.println(F(" ON"));


und wozu ist das F?

das ist das wo ich noch nicht ganz Hintersteige

agmue

#34
Nov 02, 2019, 10:01 am Last Edit: Nov 02, 2019, 10:11 am by agmue
Kann man Auf Sommer und Winterzeit umstellen?
Das wird in summertimeEurope() gemacht. Der Autor jurs geht davon aus, in der RTC ist Winterzeit, bislang die normale Zeit in D, gespeichert. Vor dem Vergleich rechnet er diese bei Bedarf in die Sommerzeit um. Findest Du in RTCreadLocalTime(). Dadurch muß die Zeit in der RTC nicht umgestellt werden.

warum steht void pumpe unn void feuchte nicht im loop?
Weil das Funktionen sind. Dabei handelt es sich um mehrfach wiederkehrende Programmteile, die man in einem "Unterprogramm"1) zusammenfaßt. Bei umfangreicheren Programmen können Funktionen auch zur Steigerung der Übersichtlichkeit verwendet werden.

und wozu ist das F?
In der Referenz (derzeit leider online nicht erreichbar) bei PROGMEM findest Du die Erklärung: Das F() macro spart wertvollen dynamischen Speicher.


Anm.:
1) Dieser Begriff wird in anderen Programmiersprachen verwendet, in C und C++ aber nicht. Hier nur zur Erläuterung verwendet.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Serenifly

Das F() macro spart wertvollen dynamischen Speicher.
Mit dynamischen Speicher hat das nichts zu tun

agmue

#36
Nov 02, 2019, 12:58 pm Last Edit: Nov 02, 2019, 01:00 pm by agmue
Mit dynamischen Speicher hat das nichts zu tun
Zitat aus der Referenz:

"The F() macro

When an instruction like :

Code: [Select]
Serial.print("Write something on  the Serial Monitor");
is used, the string to be printed is normally saved in RAM. If your sketch prints a lot of stuff on the Serial Monitor, you can easily fill the RAM. If you have free FLASH memory space, you can easily indicate that the string must be saved in FLASH using the syntax:

Code: [Select]
Serial.print(F("Write something on the Serial Monitor that is stored in FLASH"));
"

Was habe ich da falsch verstanden? RAM ist dynamischer Speicher, wenn ich die Ausgaben der IDE richtig deute.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Serenifly

Dynamischer Speicher ist wenn du RAM zur Laufzeit mit malloc() oder new reservierst

agmue

Ich habe gerade einen Teensy am Wickel, das schreibt die IDE:

"Der Sketch verwendet 33312 Bytes (12%) des Programmspeicherplatzes. Das Maximum sind 262144 Bytes.
Globale Variablen verwenden 32864 Bytes (50%) des dynamischen Speichers, 32672 Bytes für lokale Variablen verbleiben. Das Maximum sind 65536 Bytes."

Beim Teensy lese ich "RAM Memory 65536".

Also ist mit dynamischem Speicher das RAM von µC gemeint. Oder?

Anders gefragt: Was bringt die Verwendung des F-Makros?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Serenifly

Das ist eigentlich falsch ausgedrückt. Das hat mich schon immer gestört.

Quote
Was bringt die Verwendung des F-Makros?
Normal belegen alle String Literale RAM. Da normale Assembler-Befehle durch die Harvard Architektur des Prozessors nicht auf das Flash zugreifen können werden einfache alle Strings ins RAM kopiert. Mit dem F() Makro bleiben sie im Flash.

agmue

Das ist eigentlich falsch ausgedrückt. Das hat mich schon immer gestört.
Dann wende Dich bitte an die Entwickler der IDE!

Du meinst zur Laufzeit dynamisch reservierten Speicher. Die Entwickler meinen den zur Laufzeit veränderbaren Speicher.

Aber ich mühe mich, einem Anfänger das F-Markro nahe zu bringen. Da muß ich die Begrifflichkeiten verwenden, die er vor seiner Nase vorfindet. Wenn Dir die nicht zusagen, dann bin ich der falsche Adressat :(
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Andreas87


Ich hab nochmal eine Frage zu dem sketch wenn ich eine Dritte Zeitschalt hizufüge ist alles gut, aber ich die Dritte Zeitschalt dafür nutzen möchte um ein pin zu schalten.
Wie kann ich das am besten lösen?

sTime localTime;
swTime_t switchTimes[] = { // define ON times
  {1707, 1708},  // 17:07 ein, 17:08 aus
  {1730, 2130}   // 17:30 ein, 21:30 aus
  { 2200,510}
};
kann man die irgedwie seperat bezeichnen?

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:

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
  { 2200,510}
};
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();
  }
}





Serenifly

Quote
kann man die irgedwie seperat bezeichnen?
Natürlich. Die musst nur einzelne Objekte der Struktur anlegen. So wie du es mit jedem anderen Objekt auch machst

Andreas87

Natürlich. Die musst nur einzelne Objekte der Struktur anlegen. So wie du es mit jedem anderen Objekt auch machst
wie geht das?

agmue

Code: [Select]
  {1707, 1708},  // 17:07 ein, 17:08 aus
  {1730, 2130},   // 17:30 ein, 21:30 aus
  { 2200,510}

Du hast ein Komma vergessen, siehe zweite Zeile.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up