• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Błąd kompilacji
#11
Dzięki panowie! Mimochodem już nauczyłem się kilku fajnych rzeczy... Pozdrawiam
 
Odpowiedź
#12
...przedwczesna euforia - nie wiem w którym miejscu zakomentować, bo jak próbuję w tym gdzie są podane godziny to jest błąd kompilacji!!!
 
Odpowiedź
#13
We wrzuconym kodzie miałeś zakomentowane ustawianie czasu:
Kod:
Tu ustawiasz czas z palca
// manual adjust
  // January 21, 2014 at 3am you would call:
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); Ta linijka wysyła czas do RTC

A tu jest wrzucany czas komputera podczas kompilacji (raczej więc parę sekund do tyłu)
// automatic adjust
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); Ta linijka wysyła czas do RTC
}//end "setup()"
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#14
To obiecuję, że ostatnie pytanie odnośnie tego zegara... jak w poniższym projekcie pozbyć się zera na początku godziny...?
Kod:
// base sketch from https://brainy-bits.com/tutorials/4-bits-7-segment-led-display-with-arduino/
// changed TM1637 library by niq_ro for degree, r & h letter
// DS3231 clock on TM1637 LED display by niq_ro from http://www.tehnic.go.ro
// & http://arduinotehniq.com/

#include "TM1637.h"

//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
//0~9,A,b,C,d,E,F,"-"," ",degree,r,h

#define CLK 9//Pins for TM1637     
#define DIO 8
TM1637 tm1637(CLK,DIO);

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
int hh, mm;

void setup()
{
  tm1637.init();
  tm1637.set(5);
  //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;

  rtc.begin();
// manual adjust
  // January 21, 2014 at 3am you would call:
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
// automatic adjust
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}//end "setup()"

void loop(){
DateTime now = rtc.now();
hh = now.hour(), DEC;
mm = now.minute(), DEC;
tm1637.point(POINT_OFF);
    tm1637.display(0,hh/10);     // hour
    tm1637.display(1,hh%10);
    tm1637.display(2,mm/10);    // minutes
    tm1637.display(3,mm%10);    //
delay(500);
tm1637.point(POINT_ON);
    tm1637.display(0,hh/10);     // hour
    tm1637.display(1,hh%10);
    tm1637.display(2,mm/10);    // minutes
    tm1637.display(3,mm%10);    //
delay(500);
}// end loop()
 
Odpowiedź
#15
Nie da sie, skoro nie przyjmuje znaku spacji nic z tym nie zrobisz...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#16
Masz podany zestaw 21 znaków:
Kod:
#include "TM1637.h"

//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
//0~9,A,b,C,d,E,F,"-"," ",degree,r,h

Może to coś znaczy, próbowałeś np. podać     tm1637.display(0,17);? Oczywiście skonstruowane jako instrukcje, czyli jeżeli liczba godzin mniejsza od 10 to ... przeciwnie to wyświetl dziesiątki.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#17
A może podpowiecie jak tutaj ustawić czas i datę, bo datę ustawia na 01.01.2000, a czas o 23.13 pokazuje 6,26...????

A i pokazuje błąd w linii: Serial.print(rtc.getTemperature); ale jak ją zakomentuję, to pokazuje temperaturę i program sie kompiluje... tylko ten czas i data są złe...
Kod:
#include <Wire.h>      //TWI library
#include "Sodaq_DS3231.h" //DS3231 lib by Sodaq
#include <LiquidCrystal.h>//LCD library
/***************************************/
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
/***************************************/
char timebuf[20];       // Time
char datebuf[20];       // Date
/**************************************/
void setup ()
{
    Serial.begin(57600); //init serial com
    Wire.begin();        //init TWI interface
    rtc.begin();     //init RTC module
    lcd.begin(16, 2);    //init LCD
}

void loop ()
{
    DateTime now = rtc.now();  //get the current date-time
    rtc.convertTemperature();  //read temperature from the RTC
/*****************************************/    
    Serial.print(timebuf);
    Serial.println();
    Serial.print(datebuf);
    Serial.println();
    //Serial.print(rtc.getTemperature);
/****************************************/    
  lcd.setCursor(0,1);
  lcd.clear();
 
  lcd.setCursor(0,0);
  lcd.print(timebuf); //Display time
 
  lcd.setCursor(3,1);
  lcd.print(datebuf); //Display date
 
  lcd.setCursor(10,0);
  lcd.print(rtc.getTemperature()); //Display temp readings in Celsius
  lcd.print("C");
 
sprintf(datebuf, "%02d|%02d|%02d",now.date(), now.month(), (now.year()));   // format date
sprintf(timebuf, "%02d:%02d:%02d", now.hour(), now.minute(), now.second()); // format time
delay(1000);   
}
 
Odpowiedź
#18
W tym przykładzie raczej nie masz ustawiania czasu. Ustaw sobie zegar wg poprzednich wpisów, wgraj szkic bez ustawiania czasu, sprawdź czy zegar działa po odłączeniu zasilania (sprawna aku/bateria RTC), wgraj przykład z ostatniego posta i sobie go używaj, jeśli działa lepiej.
Nie napiszę Ci jak korzystać z każdej dostępnej biblioteki do RTC, każda ma swoje funkcje do każdej czynności odczytu czasu lub jego ustawiania (lub nie ma, nie ma obowiązku mieć). Do tego jest opis biblioteki, jej przykłady lub po prostu użycie oczu i odczyt z plików biblioteki. Uniwersalne są metody podania tego aktualnego czasu do programu - menu, UART, podczas kompilacji z palca lub z czasu systemu PC.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#19
A widzieliście może rozbudowane kody zegarów by Tobias Kuch 2019:
http://sites.prenninger.com/arduino-sketch/echtzeituhr
Jednak we wszystkich kodach podczas kompilacji mam błąd w linii 366:

tm1637.dispNumber(Minutes24 + Hours24 * 100);

Może coś podpowiecie bo ja siedzę nad tym ze 4 dni i nie mogę nic wymyślić!!!

Zrzut błędów kompilacji a pod spodem kod.

Arduino:1.8.13 (Windows 10), Płytka:"Arduino Uno R3"
Kompilowanie szkicu...



"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-ID:\\TM16\\libraries\\TM1637_Driver\\src" "-ID:\\TM16\\libraries\\DHT_sensor_library" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\Wire\\src" "-ID:\\TM16\\libraries\\Adafruit_Unified_Sensor" "C:\\Users\\Adam\\AppData\\Local\\Temp\\arduino_build_150003\\sketch\\TM16.ino.cpp" -o "C:\\Users\\Adam\\AppData\\Local\\Temp\\arduino_build_150003\\sketch\\TM16.ino.cpp.o"

D:\TM16\TM16\TM16.ino: In function 'bool Run_BH1750Sensor(bool)':

D:\TM16\TM16\TM16.ino:260:41: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

    Wire.requestFrom(BH1750I2CAddress, 2);
                                       ^
In file included from D:\TM16\TM16\TM16.ino:7:0:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src/Wire.h:68:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int)

    uint8_t requestFrom(int, int);
            ^~~~~~~~~~~

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src/Wire.h:65:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t)

    uint8_t requestFrom(uint8_t, uint8_t);
            ^~~~~~~~~~~

D:\TM16\TM16\TM16.ino: In function 'void DisplayClockOnLedTM1637()':

TM16:366:10: error: 'class TM1637' has no member named 'dispNumber'

  tm1637.dispNumber(Minutes24 + Hours24 * 100);
          ^~~~~~~~~~

D:\TM16\TM16\TM16.ino: In function 'byte SerInputHandler()':

D:\TM16\TM16\TM16.ino:574:21: warning: statement is a reference, not call, to function 'ClearCBuffer' [-Waddress]

        ClearCBuffer;
                    ^

D:\TM16\TM16\TM16.ino:574:21: warning: statement has no effect [-Wunused-value]

D:\TM16\TM16\TM16.ino:578:21: warning: statement is a reference, not call, to function 'ClearCBuffer' [-Waddress]

        ClearCBuffer;
                    ^

D:\TM16\TM16\TM16.ino:578:21: warning: statement has no effect [-Wunused-value]

D:\TM16\TM16\TM16.ino:599:19: warning: statement is a reference, not call, to function 'ClearCBuffer' [-Waddress]

      ClearCBuffer;
                  ^                  
D:\TM16\TM16\TM16.ino:599:19: warning: statement has no effect [-Wunused-value]


D:\TM16\TM16\TM16.ino:611:19: warning: statement is a reference, not call, to function 'ClearCBuffer' [-Waddress]

      ClearCBuffer;
                  ^                  
D:\TM16\TM16\TM16.ino:611:19: warning: statement has no effect [-Wunused-value]

D:\TM16\TM16\TM16.ino:619:19: warning: statement is a reference, not call, to function 'ClearCBuffer' [-Waddress]

      ClearCBuffer;
                  ^
D:\TM16\TM16\TM16.ino:619:19: warning: statement has no effect [-Wunused-value]

D:\TM16\TM16\TM16.ino: In function 'void SerialcommandProcessor()':

D:\TM16\TM16\TM16.ino:635:7: warning: unused variable 'a' [-Wunused-variable]

  int a;
      ^
D:\TM16\TM16\TM16.ino: In function 'void loop()':

D:\TM16\TM16\TM16.ino:785:8: warning: unused variable 'PressedC' [-Wunused-variable]

  bool PressedC;
        ^~~~~~~~

D:\TM16\TM16\TM16.ino: In function 'boolean CheckforserialEvent()':

D:\TM16\TM16\TM16.ino:517:1: warning: control reaches end of non-void function [-Wreturn-type]

}
^
Użycie biblioteki TM1637_Driver w wersji 2.1.0 z folderu: D:\TM16\libraries\TM1637_Driver

Użycie biblioteki DHT_sensor_library w wersji 1.4.1 z folderu: D:\TM16\libraries\DHT_sensor_library

Użycie biblioteki Wire w wersji 1.0 z folderu: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire

Użycie biblioteki Adafruit_Unified_Sensor w wersji 1.1.4 z folderu: D:\TM16\libraries\Adafruit_Unified_Sensor

exit status 1

'class TM1637' has no member named 'dispNumber'

Kod:
// Code by Tobias Kuch 2019, Licesed unter GPL 3.0

#include <TM1637.h>
#include "DHT.h"    // REQUIRES the following Arduino libraries:
//- DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
//- Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
#include <Wire.h>
// Instantiation and pins configurations
// Pin 4 - > CLK
// Pin 5 - > DIO
TM1637 tm1637(4, 5);
#define BUTTON_MINUTEUP_PIN   2    // Digital IO pin connected to the button.  This will be
// driven with a pull-up resistor so the switch should
// pull the pin to ground momentarily.  On a high -> low
// transition the button press logic will execute.
// Used for Setting the Clock Time

#define BUTTON_HOURUP_PIN   3    // Digital IO pin connected to the button.  This will be
// driven with a pull-up resistor so the switch should
// pull the pin to ground momentarily.  On a high -> low
// transition the button press logic will execute.
// Used for Setting the Clock Time
//DHT Konfiguration
#define DHTPIN 6                             // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22                        // DHT 22  (AM2302), AM2321
#define DS3231_I2C_ADDRESS 0x68
#define MaxInputBufferSize 5 // maximal 255 Zeichen anpassen an vlcdr

DHT dht(DHTPIN, DHTTYPE); // DHT Sensor Instanz initalisieren


struct BHLightSensorData
{
  int Lux = 0 ;          // Lichtstärke in Lux
  int Old_Lux = 0 ;      // Lichtstärke in Lux
  bool DataValid  = false;
  bool SensorEnabled  = false;
};


//Serial Input Handling
char TBuffer;
char Cbuffer[MaxInputBufferSize + 1];     //USB Code Input Buffer
String Sbuffer = "";                      //USB String Input Buffer
int value;                                //USB Nummeric Input Buffer
byte Ccount { 0 };                          //Number received Chars
byte Inptype = 0;
boolean StrInput = false;
boolean NumberInput = false;
boolean DataInput = false;
boolean EnterInput = false;
byte MenueSelection = 0;
byte MnuState = 0;            // Maximale Menuetiefe 255 icl Sub

// interrupt Control
bool SecInterruptOccured = true;
bool A60telSecInterruptOccured = true;
byte A60telSeconds24 = 0;

// Clock Variables
byte Seconds24;
byte Minutes24 ;
byte Hours24;
byte Displayalternation = 22;
bool DisableSecondDisplay = false;
bool MinSetQuickTime = false;
bool HourSetQuickTime = false;
bool ButtonDPress = false;
bool ButtonEPress = false;


BHLightSensorData BHMeasure;
byte BH1750I2CAddress = 0;                      // Detected BH1750 I2C Address

//Interrupt Routines
ISR(TIMER1_COMPA_vect)
{
  A60telSeconds24++;
  if ((A60telSeconds24 > 59) and !(MinSetQuickTime))
  {
    A60telSeconds24 = 0;
    //Calculate Time 24 Stunden Format
    SecInterruptOccured = true;
    Seconds24++;
    if (Seconds24 > 59)
    {
      Seconds24 = 0;
      Minutes24++;
    }
    if (Minutes24 > 59)
    {
      Minutes24 = 0;
      Hours24++;
    }
    if (Hours24 > 23)
    {
      Hours24 = 0;
    }
  }
  if  (MinSetQuickTime)
  {
    A60telSeconds24 = 0;
    //Calculate Time 24 h Format
    SecInterruptOccured = true;
    Seconds24++;
    if (Seconds24 > 59)
    {
      Seconds24 = 0;
      Minutes24++;
    }
    if (Minutes24 > 59)
    {
      Minutes24 = 0;
      Hours24++;
    }
    if (Hours24 > 23)
    {
      Hours24 = 0;
    }
  }
  TCNT1 = 0;      // Register mit 0 initialisieren
  if  (HourSetQuickTime)
  {
    OCR1A =  200;
  } else
  {
    OCR1A =  33353;      // Output Compare Register vorbelegen
  }
  A60telSecInterruptOccured = true;
}

//Interrupts ende
void CheckConfigButtons ()    // InterruptRoutine
{
  bool PressedZ;
  PressedZ = digitalRead(BUTTON_MINUTEUP_PIN);
  if ((PressedZ == LOW) and (ButtonDPress == false))
  {
    ButtonDPress = true;
    delay(100);
    Minutes24++;
    Seconds24 = 0;  // Reset Seconds to zero to avoid Randomly time
    DisableSecondDisplay = true ;   // Disable Seconds While Clock Set
    MinSetQuickTime = true; //Enable Quick Tmime Passby
  }
  if ((PressedZ == HIGH) and (ButtonDPress == true))
  {
    ButtonDPress = false;
    delay(100);
    DisableSecondDisplay = false ;   // Enable Seconds While Clock Set
    MinSetQuickTime = false;
    Seconds24 = 0;  // Reset Seconds to zero to avoid Randomly time
    A60telSeconds24 = 0;
    setDS3231time( Seconds24, Minutes24, Hours24, 1, 24, 6, 77);
  }
  PressedZ = digitalRead(BUTTON_HOURUP_PIN);
  if ((PressedZ == LOW) and (ButtonEPress == false))
  {
    ButtonEPress = true;
    delay(100);
    DisableSecondDisplay = true ;   // Disable Seconds While Clock Set
    MinSetQuickTime = true; //Enable Quick Tmime Passby
    HourSetQuickTime = true;
  }
  if ((PressedZ == HIGH) and (ButtonEPress == true))
  {
    noInterrupts();   // deactivate Interrupts
    ButtonEPress = false;
    delay(100);
    Minutes24++;
    DisableSecondDisplay = false ;   // Enable Seconds While Clock Set
    MinSetQuickTime = false; //Enable Quick Tmime Passby
    HourSetQuickTime = false;
    Seconds24 = 0;  // Reset Seconds to zero to avoid Randomly time
    A60telSeconds24 = 0;
    interrupts();   // enable all Interrupts
    setDS3231time( Seconds24, Minutes24, Hours24, 1, 24, 6, 77);
  }
}

void setup()
{
  tm1637.init();
  Serial.begin(115200);
  Serial.flush();
  pinMode(BUTTON_MINUTEUP_PIN, INPUT_PULLUP);
  pinMode(BUTTON_HOURUP_PIN, INPUT_PULLUP);
  digitalWrite(LED_BUILTIN, LOW);
  noInterrupts();
  TCCR1A = 0x00;
  TCCR1B =  0x02;
  TCNT1 = 0;      // Register mit 0 initialisieren
  OCR1A =  33353;      // Output Compare Register vorbelegen
  TIMSK1 |= (1 << OCIE1A);  // Timer Compare Interrupt aktivieren
  interrupts();
  Seconds24 = 1;
  Minutes24 = 1;
  Hours24 = 0;
  dht.begin();
  Wire.begin();
  readDS3231time(&Seconds24, &Minutes24, &Hours24);
  BHMeasure.SensorEnabled = Run_BH1750Sensor(true); // Init
  if (BHMeasure.SensorEnabled)
  {
    Run_BH1750Sensor(false);
    delay(200);
    Run_BH1750Sensor(false);
  } else
  {
    tm1637.setBrightness (8);
  }
}

bool Run_BH1750Sensor (bool Init)   // Runtime Funktion für den BH170 Lichtsensor
{
  byte ec;
  if (Init)
  {
    bool BH1750Detected = false;
    Wire.beginTransmission(35);
    ec = Wire.endTransmission(true);
    if (ec == 0)
    {
      BH1750Detected = true;
      BH1750I2CAddress = 35; // BH1750 I2C Adresse ist DEC 35
    } else
    {
      Wire.beginTransmission(92);
      ec = Wire.endTransmission(true);
      if (ec == 0)
      {
        BH1750Detected = true;
        BH1750I2CAddress = 92; // BH1750 I2C Adresse ist DEC 92
      }
    }
    if (BH1750Detected)
    {
      // Intialize Sensor
      Wire.beginTransmission(BH1750I2CAddress);
      Wire.write(0x01);    // Turn it on before we can reset it
      Wire.endTransmission();
      Wire.beginTransmission(BH1750I2CAddress);
      Wire.write(0x07);    // Reset
      Wire.endTransmission();
      Wire.beginTransmission(BH1750I2CAddress);
      Wire.write(0x10);    // Continuously H-Resolution Mode ( 1 lux Resolution) Weitere Modis möglich, gemäß Datenblatt
      //Wire.write(0x11);  // Continuously H-Resolution Mode 2 ( 0.5 lux Resolution)
      //Wire.write(0x20);  // One Time H-Resolution Mode  ( 1 lux Resolution)
      //Wire.write(0x21);  // One Time H-Resolution Mode2 ( 0.5 lux Resolution)
      Wire.endTransmission();
    } else
    {
      return BH1750Detected;
    }
  }
  Wire.beginTransmission(BH1750I2CAddress);
  ec = Wire.endTransmission(true);
  if (ec == 0)
  {
    Wire.requestFrom(BH1750I2CAddress, 2);
    BHMeasure.Lux = Wire.read();
    BHMeasure.Lux <<= 8;                  // Verschieben der unteren 8 Bits in die höhreren 8 Bits der 16 Bit breiten Zahl
    BHMeasure.Lux |= Wire.read();
    BHMeasure.Lux = BHMeasure.Lux / 1.2;
    BHMeasure.DataValid = true;
    if (BHMeasure.Lux != BHMeasure.Old_Lux)
    {
      BHMeasure.Old_Lux = BHMeasure.Lux;
      //  Serial.print ("Lichtstärke in Lux :");
      //  Serial.println (BHMeasure.Lux);
      //  Serial.println (TM1637Brightness);
      int TM1637Brightness =  map(BHMeasure.Lux, 300, 0, 8, 0);
      if ((BHMeasure.Lux > 10) && (BHMeasure.Lux < 20)) {
        TM1637Brightness = 2;
      }
      if (TM1637Brightness > 8) {
        TM1637Brightness = 8;
      }
      if (TM1637Brightness == 0) {
        TM1637Brightness = 1;
      }
      tm1637.setBrightness(TM1637Brightness); // Highest Brightness
    }
  } else
  {
    BHMeasure.DataValid = false;
    BHMeasure.SensorEnabled = false;
  }
  return true;
}

void DisplayHumityOnTM1637()
{
  byte Humidity = dht.readHumidity();
  byte n = (Humidity / 10) % 10; //zehner
  byte m = Humidity % 10; // einer
  if (Humidity < 100)
  {
    tm1637.display(0, 104); // Clear Digit
    tm1637.display(1, n); // Digit 1
    tm1637.display(2, m); // Digit 2
  } else
  {
    tm1637.display(0, 104); // Clear Digit
    tm1637.display(1, 103); // - Sign
    tm1637.display(2, 103); // - Sign
  }
  tm1637.display(3, 56);
}

void DisplayTempOnLedTM1637()
{
  int Temperature = dht.readTemperature(false);   // Read temperature as Celsius (isFahrenheit = true)
  byte n = (Temperature / 10) % 10; //zehner
  byte m = Temperature % 10; // einer
  if (Temperature < 0)
  {
    tm1637.display(0, 103); // - Sign
    tm1637.display(1, n); // Digit 1
    tm1637.display(2, m); // Digit 2
  } else if (Temperature < 99)
  {
    tm1637.display(0, 104); // Clear Digit
    tm1637.display(1, n); // Digit 1
    tm1637.display(2, m); // Digit 2
  } else
  {
    tm1637.display(0, 103); // - Sign
    tm1637.display(1, 103); // - Sign
    tm1637.display(2, 103); // - Sign
  }
  tm1637.display(3, 99); // C Character
}

void DisplayTempinFOnLedTM1637()
{
  int Temperature = dht.readTemperature(true);   // Read temperature as Celsius (Fahrenheit = true)

  byte l = (Temperature / 100) % 10; //hunderter
  byte n = (Temperature / 10) % 10; //zehner
  byte m = Temperature % 10; // einer
  if (Temperature < 0)
  {
    tm1637.display(0, 103); // - Sign
    tm1637.display(1, n); // Digit 1
    tm1637.display(2, m); // Digit 2
  } else if (Temperature < 99)
  {
    tm1637.display(0, 104); // Clear Digit
    tm1637.display(1, n); // Digit 1
    tm1637.display(2, m); // Digit 2
  } else
  {
    tm1637.display(0, l); // Digit 0
    tm1637.display(1, n); // Digit 1
    tm1637.display(2, m); // Digit 2
  }
  tm1637.display(3, 102); // F Character
}

void DisplayClockOnLedTM1637()
{
  if (!(DisableSecondDisplay)) {
    tm1637.switchColon();
  }
  tm1637.dispNumber(Minutes24 + Hours24 * 100);
}

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

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
                   dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  delay(10);
  Wire.write(decToBcd(second)); // set seconds
  delay(10);
  Wire.write(decToBcd(minute)); // set minutes
  delay(10);
  Wire.write(decToBcd(hour)); // set hours
  delay(10);
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  delay(10);
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  delay(10);
  Wire.write(decToBcd(month)); // set month
  delay(10);
  Wire.write(decToBcd(year)); // set year (0 to 99)
  delay(10);
  Wire.endTransmission();
}

void readDS3231time(byte *second, byte *minute, byte *hour)
{
  byte dummy;
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  //request seven bytes of data from DS3231 starting from register 00h
  while (Wire.available())   // slave may send less than requested
  {
    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    dummy = bcdToDec(Wire.read());
    dummy = bcdToDec(Wire.read());
    dummy = bcdToDec(Wire.read());
    dummy = bcdToDec(Wire.read());
  }
}

void ScheduledTasks ()
{
  if ((Hours24 == 6) and (Minutes24 == 00) and (Seconds24 == 00) )
  {
    readDS3231time(&Seconds24, &Minutes24, &Hours24);
  }
  if ((Hours24 == 12) and (Minutes24 == 00) and (Seconds24 == 00) )
  {
    readDS3231time(&Seconds24, &Minutes24, &Hours24);
  }
  if ((Hours24 == 18) and (Minutes24 == 00) and (Seconds24 == 00) )
  {
    readDS3231time(&Seconds24, &Minutes24, &Hours24);
  }
  if ((Hours24 == 0) and (Minutes24 == 00) and (Seconds24 == 00) )
  {
    readDS3231time(&Seconds24, &Minutes24, &Hours24);
  }
}


//Serial Command Interpreter Functions -------------------------------

void ClearCBuffer ()
{
  for (byte a = 0; MaxInputBufferSize - 1; a++)
    Cbuffer[a] = 0;
}

boolean CheckforserialEvent()
{
  while (Serial.available()) {
    // get the new byte:
    TBuffer = Serial.read();
    if (TBuffer > 9 && TBuffer < 14)
    {
      Cbuffer[Ccount] = 0;
      TBuffer = 0;
      Serial.print(char(13));
      Serial.flush();
      Serial.println("");
      Sbuffer = "";
      value = 0;
      EnterInput = true;
      return true;
    } else if (TBuffer > 47 && TBuffer < 58 )
    {
      if ( Ccount < MaxInputBufferSize)
      {
        Cbuffer[Ccount] = TBuffer;
        Ccount++;
      } else {
        Serial.print("#");
      }
      //Number Input detected
      NumberInput = true;
    }
    else if (TBuffer > 64 && TBuffer < 123 )
    {
      if ( Ccount < MaxInputBufferSize)
      {
        Cbuffer[Ccount] = TBuffer;
        Ccount++;
        Serial.print(char(TBuffer));
        Serial.flush();
      }
      //Character Char Input detected
      StrInput = true;
    }
    else if ( (TBuffer == 127 )  |  (TBuffer == 8 ) )
    {
      if ( Ccount > 0)
      {
        Ccount--;
        Cbuffer[Ccount] = 0;
        Serial.print("-");
        Serial.flush();
      }
    }
    else
    {
      if ( Ccount < MaxInputBufferSize)
      {
        Cbuffer[Ccount] = TBuffer;
        Ccount++;
        Serial.print(char(TBuffer));
        Serial.flush();
        //Data Input detected
        DataInput = true;
      }
      return false;
    }
    return false;
  }
}

byte SerInputHandler()
{
  byte result = 0;
  int c;
  int d;
  int a;
  int b;
  result = 0;
  if (CheckforserialEvent())
  {
    if ((NumberInput) and not (DataInput) and not (StrInput))    //Numbers only
    {
      Sbuffer = "";
      value = 0;
      StrInput = false;
      NumberInput = false;
      DataInput = false;
      EnterInput = false;
      a = 0;
      b = 0;
      c = 0;
      d = 0;
      Sbuffer = Cbuffer; // Zahl wird AUCH ! in SBUFFER übernommen, falls benötigt.
      if (Ccount == 1) {
        value  = Cbuffer[0] - 48 ;
      }
      if (Ccount == 2) {
        a = Cbuffer[0] - 48 ;
        a = a * 10;
        b = Cbuffer[1] - 48 ;
        value = a + b;
      }
      if (Ccount == 3) {
        a = Cbuffer[0] - 48 ;
        a = a * 100;
        b = Cbuffer[1] - 48 ;
        b = b * 10;
        c = Cbuffer[2] - 48 ;
        value = a + b + c;
      }
      if (Ccount == 4) {
        a = Cbuffer[0] - 48 ;
        a = a * 1000;
        b = Cbuffer[1] - 48 ;
        b = b * 100;
        c = Cbuffer[2] - 48 ;
        c = c * 10;
        d = Cbuffer[3] - 48 ;
        value = a + b + c + d;
      }
      if (Ccount >= 5)
      {
        Sbuffer = "";
        value = 0;
        Sbuffer = Cbuffer;
        ClearCBuffer;
        result = 2;
      } else
      {
        ClearCBuffer;
        Ccount = 0;
        result = 1;                                                //Number Returncode
        NumberInput = false;
        StrInput = false;
        DataInput = false;
        EnterInput = false;
        Ccount = 0;
        return result;
      }
    }
    if ((StrInput) and not (DataInput))                          //String Input only
    {
      Sbuffer = "";
      Sbuffer = Cbuffer;
      value = 0;
      StrInput = false;
      NumberInput = false;
      DataInput = false;
      EnterInput = false;
      Ccount = 0;
      ClearCBuffer;
      result = 2;                                                 //Number Returncode
    }
    if (DataInput) {
      Sbuffer = "";
      Sbuffer = Cbuffer;
      value = 0;
      StrInput = false;
      NumberInput = false;
      DataInput = false;
      EnterInput = false;
      Ccount = 0;
      ClearCBuffer;
      result = 3;                                               //Number Returncode
    }
    if ((EnterInput) and not (StrInput) and not (NumberInput) and not (DataInput))
    {
      Sbuffer = "";
      value = 0;
      Ccount = 0;
      ClearCBuffer;
      result = 4;                                               //Number Returncode
    }
    NumberInput = false;
    StrInput = false;
    DataInput = false;
    EnterInput = false;
    Ccount = 0;
    return result;
  }
  return result;
  //End CheckforSerialEvent
}

void SerialcommandProcessor()
{
  int a;
  Inptype = 0;
  Inptype = SerInputHandler();
  // 0 keine Rückgabe
  // 1 Nummer
  // 2 String
  // 3 Data
  if (Inptype > 0)
  {
    MenueSelection = 0;
    if ((MnuState < 2) && (Inptype == 2)) {
      Sbuffer.toUpperCase();  // For Easy Entering Commands
    }
    if ((Sbuffer == "T") && (MnuState == 0) && (Inptype == 2))   {
      MenueSelection = 1;
    }
    if ((Sbuffer == "C") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 2;
    }
    if ((Sbuffer == "B") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 3;
    }
    if ((Sbuffer == "F") && (MnuState == 0) && (Inptype == 2))       {
      MenueSelection = 4;
    }
    if ((MnuState == 2)  && (Inptype == 1))                          {
      MenueSelection = 8;
    }
    if (MnuState == 3)                                               {
      MenueSelection = 9;
    }
    if (MnuState == 4)                                               {
      MenueSelection = 10;
    }
    //Display  Selected Content
    if (MnuState == 9)                                               {
      MenueSelection = 20; // Color Set
    }
    if (MnuState == 10)                                              {
      MenueSelection = 21; // Time Set
    }
    if (MnuState == 11)                                              {
      MenueSelection = 24; // Time Set
    }
    if (MnuState == 12)                                              {
      MenueSelection = 25; // Time Set
    }
    if (MnuState == 13)                                              {
      MenueSelection = 27; // Background Set
    }
    if (MnuState == 14)                                              {
      MenueSelection = 29; // ClockFace Set
    }
    switch (MenueSelection)
    {
      case 1:
        {
          Serial.println("System Time: " + String (Hours24) + ":" + String (Minutes24) + ":" + String (Seconds24) );
          Serial.println("Hour: (0-23)");
          MnuState = 12;
          value = 0;
          Sbuffer = "";
          break;
        }
      case 20:
        {
          value = 0;
          MnuState = 0;
          Sbuffer = "";
          break;
        }
      case 21:
        {
          if ((value >= 0) & (value < 60))
          {
            Seconds24 = value;
            A60telSeconds24 = 0;
            Serial.println("Seconds " + String (value) + " set.");
            Serial.println("Updated new Time: " + String (Hours24) + ":" + String (Minutes24) + ":" + String (Seconds24) );
            MnuState = 0;
            setDS3231time( Seconds24, Minutes24, Hours24, 1, 24, 6, 77);
            delay(100);
          } else
          {
            readDS3231time(&Seconds24, &Minutes24, &Hours24);
            value = 0;
            Sbuffer = "";
            MnuState = 0;
            Serial.println("Value out of Range.");
          }
          value = 0;
          MnuState = 0;
          Sbuffer = "";
          break;
        }
      case 24:
        {
          if ((value >= 0) & (value < 60))
          {
            Minutes24 = value;
            Serial.println("Minutes " + String (value) + " set.");
            MnuState = 10;
            Serial.println("Seconds: (0-60)");
          } else
          {
            readDS3231time(&Seconds24, &Minutes24, &Hours24);
            value = 0;
            Sbuffer = "";
            Serial.println("Value out of Range.");
            MnuState = 0;
          }
          value = 0;
          Sbuffer = "";
          break;
        }
      case 25:
        {
          if ((value >= 0) & (value < 24))
          {
            Hours24 = value;
            Serial.println("Hour " + String (value) + " set.");
            MnuState = 11;
            Serial.println("Minute: (1-60)");
          } else
          {
            readDS3231time(&Seconds24, &Minutes24, &Hours24);
            value = 0;
            Sbuffer = "";
            Serial.println("Value out of Range.");
          }
          value = 0;
          Sbuffer = "";
          break;
        }
      default:
        {
          Serial.println("-Smart LED Clock  by T.Kuch 2019-");
          Serial.println("T - Set Time");
          Serial.println("Type Cmd and press Enter");
          Serial.flush();
          MnuState = 0;
          value = 0;
          Sbuffer = "";
        }
    }
  } // Eingabe erkannt
}

void loop()
{
  bool PressedC;
  if ((A60telSecInterruptOccured) && (!(SecInterruptOccured)) )
  {
    A60telSecInterruptOccured = false;
    if (BHMeasure.SensorEnabled)
    {
      //   Run_BH1750Sensor(false);
    }
  }
  if (SecInterruptOccured)
  {
    SecInterruptOccured = false;

    // if (DisableSecondDisplay) {Displayalternation = 25;}
    if ((Displayalternation < 7) & (!DisableSecondDisplay))
    {
      DisplayTempOnLedTM1637();
    } else if ((Displayalternation < 14)  & (!DisableSecondDisplay))
    {
      DisplayTempinFOnLedTM1637();
    } else if ((Displayalternation < 21) & (!DisableSecondDisplay))
    {
      DisplayHumityOnTM1637();
    } else if ((Displayalternation < 35) | (DisableSecondDisplay))
    {
      DisplayClockOnLedTM1637();
    } else
    {
      Displayalternation = 0;
    }

    if (!DisableSecondDisplay)
    {
      if (BHMeasure.SensorEnabled) {
        Run_BH1750Sensor(false);
      };
      Run_BH1750Sensor(false);
      Displayalternation ++;
      ScheduledTasks();
    }
  }
  CheckConfigButtons();
  SerialcommandProcessor();
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości