Go Down

Topic: Word-Clock Temperaturanzeige Modifikation (Read 121 times) previous topic - next topic

bavariawars

Sep 17, 2020, 07:41 am Last Edit: Sep 21, 2020, 10:21 am by bavariawars
Hi Elektronikerfreunde,

Ursprünglicher Programmcode: https://www.instructables.com/id/Und-noch-eine-Wordclock/

Die Uhr funktioniert tadellos, jetzt wollten meine Ausbilder nur unbedingt noch eine Temperaturanzeige dazu. Also der Plan ist, dass die Uhr ca 5-7 Sekunden die normale Uhrzeit anzeigt und dann für ca 2 Sekunden kurz mal die Temperatur anzeigt. Das in Dauerschleife. Die Temperadur wird einfach mit dem DS3231 gemessen, was super funktioniert.

Einen Teil der dazu nötigen Modifikation habe ich bereits geschrieben und auch implementiert. Jetzt fehlt im Prinzip nur noch eine Art Zeitverzögerung, die für ein paar Sekunden die Uhr und Temperatur im echsel anzeigen. delay(); funktioniert nicht, das habe ich als erstes versucht. Aber egal wie ich es schreibe, das Programm spinnt dann komplett. Dann habe ich im Internet was zur millis(); Funktion gefunden
--> https://starthardware.org/timer-mit-arduino-alternative-zu-delays/

Das habe ich versucht, aber ich bekomme es nicht hin. Wie gesagt ich habe leider bis jetzt nur wenige Grundkenntnisse beim Programmieren. Das ist das erste mal, dass ich mich am eigenen Programmieren versuche. Habe vorher bis jetzt immer nur passende Sketche im Internet gesucht und minimal auf meine Bedürfnisse hin angepasst.
Meine Idee war, keine Ahnung ob die sinnvoll ist:
Die Zahl millis(); alle bestimmten Zeitintervalle mit einer Primzahl (bsp 997 für ca 10sek) abfragen, ob diese durch diese teilbar ist. Dann soll er den Teil der Loop solange ausführen bis ein anderes Zeitintervall zutrifft und zum nächsten Teil der Loop springen. Also im Wechsel, wie eine Art Blinklicht.

Naja, ohne Hilfe wird das nichts, hab gestern den ganzen Tag rumprobiert und nicht mal ansatzweise ein funktionierendes Ergebnis erhalten.

Der Sketch ist zu umfangreich, um in als Text zu kopieren. Deswegen teile ich ihn auf 3 Posts auf. Ich lade und mal den Sketch mit nicht funktionierender Anzeige der Temperatur hoch.

Vielen Dank für Ideen!^^

Peter-CAD-HST

Moin bavariawars
Die Anwendung der Funktion millis(); wird im IDE Beispiel  Blink without Delay super erklärt.
Schaue mal dort rein.
Viel Erfolg
Gruss Peter
und gesund bleiben
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

bavariawars

Hier der erste Teil des Sketches bis Setup-Teil:

Code: [Select]

/*
LEDs WS2812B
 Copy of the Biegert&Funk QlockTwo reprogramming by volvodani.
 Licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
 except in compliance with the License.  You may obtain a copy of the License at
 http://www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing, software distributed under the
 License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 either express or implied. See the License for the specific language governing permissions
 and limitations under the License.
 */

#include <Wire.h>
#include <EEPROM.h>
#include "FastLED.h"
#include <avr/wdt.h>
#include "Sodaq_DS3231.h"


#define RTC_ADDRESS 0x68       // I2C Address of RTC 0x68
#define STELLEN 8               // REED STELLEN Pin
#define MINUS 9                 // REED MINUS
#define PLUS 10                 // REED PLUS
#define SEKUNDEN 11             // REED SEKUNDEN
#define RTCIN 4                // SQW Output of RTC connected here
#define TIME 750               // Split time between short and lognpress

#define DATA_PIN     5
#define NUM_LEDS    114
#define CHIPSET     WS2812B
#define COLOR_ORDER GRB

#define NUM_LEDSz 4             // Zollnerlogo rot beleuchten
#define DATA_PINz 7             // Zollnerlogo rot beleuchten
CRGB ledsz [NUM_LEDSz];

#define BRIGHT_Hell 255              // Hellste Stufe bei Sonneneinstrahlung
#define BRIGHT_Tag  100              // Raum mit Beleuchtung
#define BRIGHT_Tag2  60              // Raum ohne Beleuchtung
#define BRIGHT_Abend 10              // Dämmerung
#define BRIGHT_Nacht  2

int temp;
const int ldrPin = A0;               //Analogspannung LDR Eingang Mikrocontroller

CRGB leds[NUM_LEDS];

int period = 0;

unsigned long ptime;
unsigned long start;
boolean druck=false;
boolean ldruck=true;
boolean M_minus=false;
boolean FM_minus=true;
boolean M_plus=false;
boolean FM_plus=true;
boolean M_sek=false;
boolean FM_sek=true;
//boolean tasterlesen=true;
boolean update,last=true;
boolean sec=false;
boolean lsec=false;
boolean save,one=false;
boolean Minus,Plus=false;
boolean once=false;
boolean done=false;
boolean M_timeout=false;
byte setmode=0;
byte timeout=0;
//byte lm=0;                                  // 0=Normal 1=Display Seconds 2=Set minutes 3=Set hours
//byte lCase=0;
byte ss,mm,lmm,hh,hhdisplay,mmset,lmmset,hhset,lhhset,mm5er,mm5erRest=0;                // Save Variables for time
byte R=0,G=0,B=0;                            // Farbe für den Start alles weis
byte Rpointer,Gpointer,Bpointer;
byte PWMArray[23]={
  2,7,10,15,20,25,30,35,40,50,60,70,80,90,100,120,140,160,180,200,220,240,255};


void setup() {

Serial.begin(9600);

pinMode(ldrPin, INPUT);
  
  wdt_enable(WDTO_2S);
  pinMode(RTCIN,INPUT);                          // SQW Output of RTC connected here
  pinMode(STELLEN,INPUT_PULLUP);                         // Taster Eingang
  pinMode(MINUS,INPUT_PULLUP);
  pinMode(PLUS,INPUT_PULLUP);
  pinMode(SEKUNDEN,INPUT_PULLUP);


  digitalWrite(RTCIN,HIGH);
  digitalWrite (STELLEN,HIGH);                    // internal Pullup
  FastLED.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2812B, DATA_PINz, COLOR_ORDER>(ledsz, NUM_LEDSz);
 // Serialbegin(115200);
  Wire.begin();                                  // Start I2C Kommunikation
  Wire.beginTransmission(RTC_ADDRESS);           // Beginn Kommunikation auf  Adresse 0x68
  Wire.write(0x0E);                               // Pointer auf Control Register 0x07  
  Wire.write(0x00);                               // Controlbyte for RTC to set the sqw Output to 1Hz  
  Wire.endTransmission();                        // Beenden der I2C Kommunitkation
  update=true;
  Rpointer=EEPROM.read(0);
  Gpointer=EEPROM.read(1);
  Bpointer=EEPROM.read(2);
  TimeRead();
  RTC_Start();
  rtc.begin();
}

bavariawars

Hier die ausgelagerten Funktionen, Messung und Anzeigen der Temperatur würde im Prinzip schon funktionieren:

Danke für das Beispiel mit Blinken without Delay, ich guck mir das gleich mal an. Hilfe könnte ich aber trotzdem gebrauchen, ich bin einfach noch zu schlecht im Programmieren. Das hier ist ne echte Herausforderung für mich, was meine bisherigen Kenntnisse bei weitem überschreiten, im Endeffekt mach ich nur noch "Trial and Error" bis was funktionierendes rauskommt :) Aber man muss dazu sagen, dass ich so auf den 2 Tagen meiner Meinun nach bereits viel gelernt habe. Manchmal ins kalte Wasser geworfen werden, ist halt genau das richtige^^


Code: [Select]

//Funktionen für Main Loop

void LEDs_DIMMEN() {
int ldrStatus = analogRead(ldrPin);               // LEDs dimmen
if (ldrStatus>550) {                              //verschiedene Helligkeitsstufen
  LEDS.setBrightness(BRIGHT_Nacht);}
else if (ldrStatus>400) {
  LEDS.setBrightness(BRIGHT_Abend);}
else if (ldrStatus>250) {
  LEDS.setBrightness(BRIGHT_Tag2);}
else if (ldrStatus>100) {
  LEDS.setBrightness(BRIGHT_Tag);}
else if (ldrStatus >= 0) { LEDS.setBrightness(BRIGHT_Hell);}
//Serial.println(ldrStatus);
}

void ZollnerLogo() {   
ledsz[0] = CRGB (255,0,0);                        //Zollnerlogo rot beleuchten
ledsz[1] = CRGB (255,0,0);                        //Zollnerlogo rot beleuchten
ledsz[2] = CRGB (255,0,0);                        //Zollnerlogo rot beleuchten
ledsz[3] = CRGB (255,0,0);                        //Zollnerlogo rot beleuchten
FastLED.show();
}

void TempAuslesen() {
  rtc.convertTemperature();             //convert current temperature into registers
    temp = rtc.getTemperature();
    Serial.print(temp); 
    Serial.println("°C");
}

void TempAnzeigen() {
if (temp==0) {
    R_ZERO(); }
if (temp==1) {
    R_ONE(); } 
if (temp==2) {
    R_TWO(); }
if (temp==3) {
    R_THREE(); }
if (temp==4) {
    R_FOUR(); }
if (temp==5) {
    R_FIVE(); }
if (temp==6) {
    R_SIX(); }
if (temp==7) {
    R_SEVEN(); }
if (temp==8) {
    R_EIGHT(); }
if (temp==9) {
    R_NINE(); }
if (temp==10) {
    R_ZERO();
    L_ONE(); }
if (temp==11) {
    R_ONE();
    L_ONE(); }
if (temp==12) {
    R_TWO();
    L_ONE(); }
if (temp==13) {
    R_THREE();
    L_ONE(); }
if (temp==14) {
    R_FOUR();
    L_ONE(); }
if (temp==15) {
    R_FIVE();
    L_ONE(); }
if (temp==16) {
    R_SIX();
    L_ONE(); }
if (temp==17) {
    R_SEVEN();
    L_ONE(); }
if (temp==18) {
    R_EIGHT();
    L_ONE(); }
if (temp==19) {
    R_NINE();
    L_ONE(); }
if (temp==20) {
    R_ZERO();
    L_TWO(); }
if (temp==21) {
    R_ONE();
    L_TWO(); }
if (temp==22) {
    R_TWO();
    L_TWO(); }
if (temp==23) {
    R_THREE();
    L_TWO(); }
if (temp==24) {
    R_FOUR();
    L_TWO(); }
if (temp==25) {
    R_FIVE();
    L_TWO(); }
if (temp==26) {
    R_SIX();
    L_TWO(); }
if (temp==27) {
    R_SEVEN();
    L_TWO(); }
if (temp==28) {
    R_EIGHT();
    L_TWO(); }
if (temp==29) {
    R_NINE();
    L_TWO(); }
if (temp==30) {
    R_ZERO();
    L_THREE(); }

else {
      R_ZERO();
    }   
}

void TimeRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 3);
  ss= bcdToDec(Wire.read());
  mm= bcdToDec(Wire.read());
  hh= bcdToDec(Wire.read());
}

void HourRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x02);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 1);
  hh= bcdToDec(Wire.read());
  //Serial.println("Stundenlesen");
}

void MinuteRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x01);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 1);
  mm= bcdToDec(Wire.read());
  //Serial.println("Minutenlesen");
}

void SecondRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 1);
  ss=bcdToDec(Wire.read() & 0x7f);
  //Serial.println("Sekundenlesen");
}

void RTC_Set(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.write(decToBcd(mm));
  Wire.write(decToBcd(hh));      // If you want 12 hour am/pm you need to set
  Wire.endTransmission();
}

void RTC_Start(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.endTransmission();
}

byte decToBcd(byte val)
{
  return ((val/10)<<4)+(val%10);
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ((val>>4)*10)+val%16;
}


void SaveByte(byte x,byte y){                       // Funktion SaveByte("Position","Daten") Daten in Byte Format
  Wire.begin();                                     // Start I2C Kommunikation
  Wire.beginTransmission(RTC_ADDRESS);              // Beginn Kommunikation auf  Adresse 0x68
  Wire.write(x+7);                                // Speicher Register Adresse+0x07   
  Wire.write(y);                                     // zu Speicherndes Byte
  Wire.endTransmission(); 
}

byte ReadByte(byte x){                             // Funktion ReadByte ("Position") Daten in Byte Format
  byte z;
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(x+7);
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 1);
  z=Wire.read();
  return z;
}

bavariawars

Hier noch die wichtigsten Teile der Loop:

Code: [Select]

void loop() {

LEDs_DIMMEN();
FastLED.clear();
ZollnerLogo();
TempAuslesen();
TempAnzeigen();
FastLED.show();

//delay(2000); --> funktioniert nicht

FastLED.clear();
ZollnerLogo();

  wdt_reset();                      // Watchdog timer falls sich der Controller mal aufhängt
 
  

  if (setmode==0){                                  // Im Modus 0 (normale Anzeige)
    if(mm!=lmm||update==true){                      // Wenn die Miunten nicht gleich der Minuten letzten durchlauf sind oder der update Merker gesetzt  
      FastLED.clear();
      TimeRead();                                   // RTC auslesen
      update=false;                                 // Hilfsmerker zurücksetzten
      mm5erRest=mm%5;                               // Mit Modulo die 5er "überhang" auswerten
      mm5er=mm-mm5erRest;                           // den 5er Teiler berechen 0,5,10,15,20....55 etc.
      if (hh>=13){                                   // Bei Stunden über 13 Uhr zurück auf 13=1 14=2 etc.
        hhdisplay=hh-12;            
      }
      if (mm5erRest==1) P_EINS();                   // Reste der Fünfer 1-4 die entsprechenden "Ecken" anmachen
      else if (mm5erRest==2) P_ZWEI();
      else if (mm5erRest==3) P_DREI();
      else if (mm5erRest==4) P_VIER();
      /*  Zeitanzeigeausgabe in Worten */
      W_ESIST();
      if (mm5er==5||mm5er==25||mm5er==35||mm5er==55){
        M_FUENF();
      }
      if (mm5er==10||mm5er==50){
        M_ZEHN();
      }
      if (mm5er==15||mm5er==45){
        M_VIERTEL();
      }
      if (mm5er==20||mm5er==40){
        M_ZWANZIG();
      }        
      if (mm5er==25||mm5er==30||mm5er==35){
        M_HALB();
      }
      if (mm5er==0){  
        W_UHR();
      }
      if (mm5er==5||mm5er==10||mm5er==15||mm5er==20||mm5er==35){
        W_NACH();
      }
      if (mm5er==25||mm5er==40||mm5er==45||mm5er==50||mm5er==55){
        W_VOR();
      }
      hhdisplay=hh;
      if (mm>=25){                                          // ab der 25 Minuten ist es immer "vor" der nächsetn Stunde
        if (hh==0||hh==12){                                 // bei 12 Uhr vor "Ein" Uhr
          hhdisplay=1;
        }
        else
          hhdisplay=hh+1;
      }
      if (hhdisplay==1&&mm5er==0) H_EIN();               // Bei Voller Stunde ohne Minute "Ein" Uhr
      else if (hhdisplay==1||hhdisplay==13) H_EINS();                   // Normale "Stunden" Auswahl
      else if (hhdisplay==2||hhdisplay==14) H_ZWEI();
      else if (hhdisplay==3||hhdisplay==15) H_DREI();
      else if (hhdisplay==4||hhdisplay==16) H_VIER();
      else if (hhdisplay==5||hhdisplay==17) H_FUENF();
      else if (hhdisplay==6||hhdisplay==18) H_SECHS();
      else if (hhdisplay==7||hhdisplay==19) H_SIEBEN();
      else if (hhdisplay==8||hhdisplay==20) H_ACHT();  
      else if (hhdisplay==9||hhdisplay==21) H_NEUN();
      else if (hhdisplay==10||hhdisplay==22) H_ZEHN();
      else if (hhdisplay==11||hhdisplay==23) H_ELF();
      else if (hhdisplay==12||hhdisplay==24||hhdisplay==0) H_ZWOELF();

    }
    lmm=mm;
    FastLED.show();
    delay(1000);
  }
  if (sec==false && lsec==true){                          // Flankenerkenung des Sekunden Impusles
    lsec=false;
  }

  if (setmode==2){                                          // Stunden stellen und anzeige des Zahlenwertes
    TimeRead();                                             // aktuelle zeit auslesen
    FastLED.clear();
    print_numbers(hhset);
    hhset=INCDEC(hhset);    
    // Serialprint("Std: ");
    // Serialprintln(hhset);
    leds[110].setRGB( R, G, B);  // OL
    leds[113].setRGB( R, G, B);  // OL
    lhhset=hhset;
    FastLED.show();
    one=true;
    save=true;  

  }
  
}
// End Main Loop



my_xy_projekt

#5
Sep 17, 2020, 10:19 am Last Edit: Sep 17, 2020, 10:21 am by my_xy_projekt
Vielen Dank für Ideen!^^
Code: [Select]

long int lastmillis = 0;

void setup()
{
  Serial.begin (115200);
  Serial.println ("Start");
}

void loop()
{
  if (millis() - lastmillis >= 7000) // nach eingestellter Zeit temperatur anzeigen
  {
    Serial.println ("Gebe Temperatur aus");
    if (millis() - lastmillis >= 10000) // Wenn Zeit abgelaufen
    {
      lastmillis = millis(); // Setze Merker auf aktuelle Zeit
    }
  }
  else
  {
    Serial.println ("Gebe Zeit aus");
  }
}


Schau Dir an, was da passiert.

bavariawars

vielen Dank, probiere ich später gleich mal aus ;-)

liest sich so wie das was ich will, aber selber nicht zusammenbekomme^^


Btw ich löte gerade die erste richtige Word-Clock zusammen

volvodani

#7
Sep 17, 2020, 11:56 am Last Edit: Sep 17, 2020, 01:33 pm by volvodani
Die Uhr hat ja sowas schon drin schaue mal in die Sekunden anzeige. Dort musst du aus dem Button trigger einen zeitlichen trigger machen und deine Temp Anzeige Funktion aufrufen.
Ich schaue nochmal nach im Programm. Ich habe gestern Versucht das Programm "upzudaten" aber ich konnte die .zip nicht hochladen.

Gruß
DerDani
"Komm wir essen Opa!" - Satzzeichen retten Leben!

Go Up