The Arduino repeat the setup() routine often. And i think after a time it crashes.
My Program works fine if i dont use Wire.begin().
For testing the correct connection i tried http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock
and it works fine. With the same configuration.
Need the Wire library anything to work fine. Maybe it doesnt work with a Duemilanove?
I use the Arduino IDE 0017
Strange:
If i change the Serial.println(ASDF) string to Serial.println(AS) it seems to work. Any hints?
void setup() {
//i2c bus anfang Arduino ist Master
//Wire.begin();
// klappt aus irgendeinem Grund nicht
//Start up the serial port
Serial.begin(9600);
//Signal the program start
Serial.println("Timer2 Test");
// set up the LCD's number of rows and columns:
// lcd.begin(20, 1);
lcd.begin(16,2); //Olli Display anpassen
// Print a message to the LCD.
lcd.print(" init ");
Serial.println("ASDF"); // 1
Wire.begin(); // olli Test
Serial.println("Warum ist das nötig"); // malsehen ob das reicht oder warum das nötig ist OLLi
}
Here is the sketch.
Why do you need it?
I think the setup() dont use any functions that i have written.
The strange think, if i change the serial.println("DF"); to a other output or delete it. The behavior change. But i dont see
the reason for this behavior.
#include <LiquidCrystal.h>
#include <Wire.h>
/*
Version : 0.1.prealpha
Titel : AutoDisplay: Uhr Temperatur
Zweck : Erstmal nur einfach
*/
// Display ist ein 20 * 1 Zeichen Display
// Ansatz der Ausgabe:
// 12:34 22°C
// 12345678901234567890
// 12:23 12.5 V 23°C
/*
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte anzeigeStunden = 01;
byte anzeigeMinuten = 01;
byte anzeigeTemperatur = 01;
boolean DisplayAktualisieren = false;
byte AbgleichStunden = 23;
byte AbgleichMinuten = 59;
long letztesMalMillis = 0;
const char* VariablenListe[] = {"hallo","test"};
void setup() {
//Start up the serial port
Serial.begin(9600);
//Signal the program start
Serial.println("Timer2 Test");
// set up the LCD's number of rows and columns:
// lcd.begin(20, 1);
lcd.begin(16,2); //Olli Display anpassen
// Print a message to the LCD.
lcd.print(" init ");
//Serial.println("DF");
Wire.begin(); // olli Test
Serial.println("Warum"); // malsehen ob das reicht oder warum das nötig ist OLLi
}
void loop() {
// lcd.setCursor(0,1);
// lcd.print(millis()/1000);
if ( (millis() - letztesMalMillis) > 100 ){ // eine Sekunde um?
letztesMalMillis = millis();
Zeit();
Display();
SerialDebug();
}
i2cAnfang();
}
void i2cAnfang(){
const byte adresseRTC = B1101000; //DS1307 arbeitet nur im 100kHz Modus
}
boolean stimmenStrings(char* ersterString, char* zweiterString){
boolean zwischen = false;
// noch eine Maximalstringlänge berücksichtigen
for (byte i = 0; (ersterString[i] != '\0') || (zweiterString[i] != '\0') ; i++ ){
if ( ersterString[i] == zweiterString[i] ) {
zwischen = true;
} else {
return false;
}
}
return zwischen;
}
// Damit man jede Variable anzeigen und ändern kann.
// Für Debug Zwecke.
// wird periodisch von loop() aufgerufen.
// Befehle: Help, Status, Test
void SerialDebug(){
byte incomingByte;
char buffer[50];
byte bufferzaehler = 0;
while (Serial.available() != 0){ // Zeichen in buffer einlesen bis CF 13 kommt
incomingByte = Serial.read();
if ( incomingByte == 13) {
break;
} else if (incomingByte == 10) {
break;
} else if (incomingByte == 0) {
break;
} else {
buffer[bufferzaehler] = char(incomingByte);
bufferzaehler++;
}
}
buffer[bufferzaehler]= '\0';
/* // warum klappt das nicht? Olli
if ( buffer == "test" ) {
Serial.println("Dieser Test ist geglückt");
}
*/
if (stimmenStrings(buffer,"test") == true ){
Serial.println("Dieser wenigstens?");
}
if (stimmenStrings(buffer,"get time") == true){
Serial.print("Die Zeit : ");
Serial.print(anzeigeStunden,DEC);
Serial.print(":");
Serial.println(anzeigeMinuten,DEC);
}
if (stimmenStrings(buffer,"get timer") == true){
Serial.println(millis(),DEC);
}
if (stimmenStrings(buffer,"help") == true){
Serial.println("Derzeit mögliche Eingaben:");
Serial.println("help : gibt diesen Text aus");
Serial.println("get time : gibt die angezeigte Zeit aus");
Serial.println("get timer : gibt die timer variable millis() aus.");
}
}
// in millis sind die Millisekunden gespeichert seit dem der uC
// eingeschaltet wurde.
// Alle 50 Tage wird er überlaufen. //Olli
// Also entweder vorher einen RTC-Chip einbauen oder abfangen. :)
void Zeit(){
byte zwischenStunden = 0;
byte zwischenMinuten = 0;
byte zwischenTage = 0;
unsigned long zwischenMillisG = millis()/1000;
// sekunden = millis()/1000;
// minuten = millis()/(1000*60);
// stunden = millis()/(1000*60*60);
zwischenTage = zwischenMillisG/(60*60*24);
zwischenMillisG = zwischenMillisG - zwischenTage*(60*60*24); //Tage werden abgezogen
zwischenStunden = zwischenMillisG/(60*60);
zwischenMillisG = zwischenMillisG-(zwischenStunden*(60*60));//Stunden werden abgezogen
zwischenMinuten = zwischenMillisG/60;
anzeigeMinuten = AbgleichMinuten+zwischenMinuten;
anzeigeStunden = AbgleichStunden+zwischenStunden;
if (anzeigeMinuten > 59) {
anzeigeMinuten -= 60;
anzeigeStunden++;
}
if (anzeigeStunden > 23) {
anzeigeStunden -= 24;
}
}
void Display(){
lcd.clear();
// der Teil ist unwichtig nur für statuskram
lcd.setCursor(0, 1);
lcd.print("ha");
// Hier wird die Zeit ausgegeben
lcd.setCursor(0,0);
lcd.print(anzeigeStunden,DEC);
lcd.print(":");
lcd.print(anzeigeMinuten,DEC);
lcd.print(" ");
lcd.print(millis()/1000);
lcd.print(" ");
lcd.print(anzeigeTemperatur,DEC);
}