Dzięki panowie! Mimochodem już nauczyłem się kilku fajnych rzeczy... Pozdrawiam
Ocena wątku:
Błąd kompilacji
|
...przedwczesna euforia - nie wiem w którym miejscu zakomentować, bo jak próbuję w tym gdzie są podane godziny to jest błąd kompilacji!!!
09-01-2021, 04:49
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
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()
09-01-2021, 17:32
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ą.
09-01-2021, 17:36
Masz podany zestaw 21 znaków:
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.
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
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...
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);
}
13-01-2021, 15:02
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.
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
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'
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();
}
Przeglądający: 1 gości