Problem SRF02 mit DS1307

Hallo, ich habe folgendes Problem, habe ein Uhrmodul DS1307 und zwei Sensoren SRF02 am Board angeschlossen. Die Sensoren habe ich so eingestellt, das sie über "SRF02::setInterval(2000)" nur alle zwei Sekunden abgefragt werden. Jetzt läuft die Uhr aber im gleichen Takt, das heißt viel zu langsam. Wie kann das kommen? Noch eine andere Frage, kann man die Sensoren eigentlich zum Wasserstand messen benutzen oder sind die nicht für feuchte Umgebung geeignet? Gruß Bernward

Bitte Schaltplan und Sketch.
Grüße Uwe

Hallo Uwe,
Sensoren SRF02 und DS1307 sind parallel an A4 und A5 sowie +5V und GND angeschlossen.

Auszüge aus dem Programm, nur ganz kurz das wesentliche, das Programm selbst ist sonst zu lang.

#include <Wire.h>
#include "SRF02.h"
#include <Wprogram.h>
#include <DS1307.h>
#include <LiquidCrystal.h>
#define LCD_WIDTH 20
#define LCD_HEIGHT 4
#define LCDBeleuchtung 12
SRF02 sensor[2] = {SRF02(0x70, SRF02_CENTIMETERS), SRF02(0x72, SRF02_CENTIMETERS)};

//---------------------------------------------------------------------------------------------
void setup(void){
 pinMode(LCDBeleuchtung, OUTPUT);
 lcd.begin(LCD_WIDTH, LCD_HEIGHT,1);
 Serial.begin(9600);
 Wire.begin();
 SRF02::setInterval(2000);
 RTC.get(ProgrammStart,true);
 }

void loop(void) 
{
 SRF02::update();
 RTC.get(UhrDaten,true); 
 if (sensor[0].read() > Max[0]) { ... }; 

}

Kann es sein, daß Du mit: SRF02::setInterval(2000); einen delay von 2 sec versteckt hast???? Damit muß auch die Uhr 2sec warten.....

mfg Reinhard

Auszüge aus dem Programm, nur ganz kurz das wesentliche, das Programm selbst ist sonst zu lang.

Und was ist wenn der Fehler im unwesentlichen Teil drin ist? Grüße Uwe

Hallo Uwe,
hier ist es, aber ob das ohne Beschreibung hilft weiß ich nicht.
Jedenfalls läuft alles ohne den SRF02 problemlos, auch die Uhr, wenn
ich aber den Sensor dazu anstecke, bleibt die Uhr stehen.
Ich habe aber ein paar Programmpunkte (aber nur LCD-Ausgaben und Tasterabfragen) löschen müssen, da es zum Senden zu lang war.

Gruß
Bernward

#include <Wire.h>
#include "SRF02.h"
#include <Wprogram.h>
#include <DS1307.h>
#include <LiquidCrystal.h>
#define LCD_WIDTH 20
#define LCD_HEIGHT 4
#define TasterNull 10 // Taster zum Stellen der Uhr
#define TasterEins 9
#define TasterZwei 8
#define TasterDrei 11
#define LCDBeleuchtung 12
SRF02 sensor[2] = {SRF02(0x70, SRF02_CENTIMETERS), SRF02(0x72, SRF02_CENTIMETERS)};
#define Relais00 14 //Relais für Wassertank Keller
#define Relais01 15 //Relais für Wassertank Dachboden
#define Schwimmeroben 16 //oberer Schwimmerschalter Dachboden
#define Schwimmerunten 17 //unterer Schwimmerschalter Dachboden
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Ausgabepins für das LCD-Display
unsigned long Laufzeit[2];
unsigned long tg,st,mi,se;// Auswertung der Laufzeit der zwei Relais
long UhrStartzeit, UhrMomentanzeit;
int tasterstatus0, tasterstatus1, tasterstatus2, tasterstatus3, letzterwert, prellzeit, tasterval = 0;
int obenstatus,untenstatus;
int i, j, check, zaehler, flag, lcdan, controll, ProgrammStart[7], Stunde[2], Minute[2];
int UhrDaten[7];
char puffer[20]; 
boolean clean, lcdreset;
int Min[2] = {80,45}, Max[2] = {70,45};
String WochenTag[7]={"Sonntag   ","Montag    ","Dienstag  ","Mittwoch  ","Donnerstag","Freitag   ","Samstag   "};
const int Einschaltzeiten[2] = {7,20}; //Befüllung nur zwischen 7 und 20 Uhr
//---------------------------------------------------------------------------------------------
void setup(void){
 pinMode(TasterNull, INPUT); 
 pinMode(TasterEins, INPUT); 
 pinMode(TasterZwei, INPUT); 
 pinMode(LCDBeleuchtung, OUTPUT);
 pinMode(Relais00, OUTPUT); //Relais für Wassertank Keller
 pinMode(Relais01, OUTPUT); //Relais für Wassertank Dachboden
 lcd.begin(LCD_WIDTH, LCD_HEIGHT,1);
 Serial.begin(9600);
 Wire.begin();
 SRF02::setInterval(1000);
 RTC.get(ProgrammStart,true);
 digitalWrite(Relais00, LOW);digitalWrite(Relais01, LOW);
 delay(3000);
}
//---------------------------------------------------------------------------------------------
void LCDein(){
 if (lcdan == 1){
  Stunde[0] = UhrDaten[2]; Minute[0] = UhrDaten[1]; //setzt Stunde und Minute auf aktuelle Zeit  
  digitalWrite(LCDBeleuchtung, HIGH);
  lcdan = 0;   
 }
 // LCD wird nach 10 Minuten ohne Tastenbetätigung ausgeschaltet
 if ((UhrDaten[2] * 60 + UhrDaten[1]) - (Stunde[0] * 60 + Minute[0]) > 10) digitalWrite(LCDBeleuchtung, LOW);
}
//---------------------------------------------------------------------------------------------
int ZeitScrollen(int endwert, int flag, int i){
 UhrMomentanzeit = millis();
 int scroll=flag; 
 while (tasterstatus2 == LOW && millis() - UhrMomentanzeit < 4000 ) {
  tasterstatus1=digitalRead(TasterEins);
   if (tasterstatus1==HIGH){
     UhrMomentanzeit = millis();
     lcd.noCursor(); scroll ++;
     Ausgabe(scroll,i);     
    if(scroll >= endwert) scroll=flag; 
   }
  prellzeit=digitalRead(TasterZwei); delay(50);
  letzterwert=digitalRead(TasterZwei);
   if(prellzeit == letzterwert){
    tasterstatus2=prellzeit; delay(200);
   }
  } 
 if (millis() - UhrMomentanzeit < 4000) controll++;
 tasterstatus2 = LOW; return scroll;
}
//---------------------------------------------------------------------------------------------
void UhrStellen(){
  lcdan = 1; LCDein();
  lcd.clear(); clean=HIGH; controll=0;
  lcd.setCursor(0,0);lcd.print("Eingabe Datum/Uhrz.");
  lcd.setCursor(2,2);lcd.print("Taster 1 stellen");
  lcd.setCursor(2,3);lcd.print("Taster 2 weiter");
  lcd.setCursor(0,1); lcd.print(WochenTag[0]);  
  UhrDaten[3] = ZeitScrollen(6,-1,0);
   if(UhrDaten[3]==-1)UhrDaten[3]=6; lcd.setCursor(11,1);lcd.print("00");
  UhrDaten[4] = ZeitScrollen(31,0,1);
   if(UhrDaten[4]==0)UhrDaten[4]=31; lcd.setCursor(13,1);lcd.print(".00");
  UhrDaten[5] = ZeitScrollen(12,0,2);
   if(UhrDaten[5]==0)UhrDaten[5]=12; lcd.setCursor(16,1);lcd.print(".00");
  UhrDaten[6] = ZeitScrollen(30,10,3);
   if(UhrDaten[6]==10)UhrDaten[6]=30;
   lcd.setCursor(1,2);lcd.print("Uhrzeit           "); lcd.setCursor(11,2);lcd.print("00");
  UhrDaten[2] = ZeitScrollen(23,-1,4);
   if(UhrDaten[2]==-1)UhrDaten[2]=23; lcd.setCursor(13,2); lcd.print(".00");
  UhrDaten[1]=ZeitScrollen(59,-1,5);
   if(UhrDaten[1]==-1)UhrDaten[1]=59; lcd.setCursor(16,2); lcd.print(".00");
  UhrDaten[0]=ZeitScrollen(59,-1,6);
   if(UhrDaten[0]==-1)UhrDaten[0]=59;
//Uhrmodul wird neu gesetzt
  if(controll > 4){ // mindestens fünf Werte wurden geändert, sonst bleibt alte Uhrzeit bestehen
   RTC.stop();
   RTC.set(DS1307_SEC,UhrDaten[0]);//geht nicht, Sekunden werden auf Null gesetzt
   RTC.set(DS1307_MIN,UhrDaten[1]);
   RTC.set(DS1307_HR,UhrDaten[2]);
   RTC.set(DS1307_DOW,UhrDaten[3]+1);
   RTC.set(DS1307_DATE,UhrDaten[4]);
   RTC.set(DS1307_MTH,UhrDaten[5]);
   RTC.set(DS1307_YR,UhrDaten[6]);
   RTC.start();
  }
 controll=0;
}
//---------------------------------------------------------------------------------------------
void BasisDaten(int aktuell){ 
 } 
//---------------------------------------------------------------------------------------------
void zeitberechnen(int aktuell){
 tg=Laufzeit[aktuell]/86400;
 st=(Laufzeit[aktuell]-tg*86400)/3600;
 mi=(Laufzeit[aktuell]-tg*86400-st*3600)/60;
 se=Laufzeit[aktuell]-tg*86400-st*3600-mi*60;
}
void Ausgabe(int scroll, int i){ 
}
//---------------------------------------------------------------------------------------------
void BasisAnzeige(){ 
}
//---------------------------------------------------------------------------------------------
void TasterAbfrage(int taster, boolean tasterstatus, int i){

}
//---------------------------------------------------------------------------------------------
void Keller(){ // Tanksteuerung Keller 
  // Füllpumpe auf ein, wenn Minimalstand erreicht ist, Füllpumpe aus, wenn Maximalstand erreicht ist
  // beides aber nur tagsüber, daher Abfrage der Uhrzeit
 if (UhrDaten[2] >Einschaltzeiten[0] && UhrDaten[2] < Einschaltzeiten[1]){
  flag=1;
  if (sensor[0].read() > Min[0]) flag=0; 
  if (sensor[0].read() < Max[0]) flag=2; 
  if (flag == 0) digitalWrite(Relais00, HIGH); //Relais für Füllpumpe ein
  if (flag == 2) digitalWrite(Relais00, LOW); //Relais für Füllpumpe aus
 }
 else digitalWrite(Relais00, LOW);
}
//---------------------------------------------------------------------------------------------
void DachBoden(){ // Tanksteuerung Dachboden
 // Füllpumpe auf ein, wenn Minimalstand erreicht ist, Füllpumpe aus, wenn Maximalstand erreicht ist
 flag = 1;
 obenstatus = digitalRead(Schwimmeroben);
 untenstatus = digitalRead(Schwimmerunten);
 if (untenstatus == HIGH) flag=0; 
 if (obenstatus == HIGH) flag=2; 
 if (flag == 0) digitalWrite(Relais01, HIGH); //Relais für Füllpumpe ein
 if (flag == 2) digitalWrite(Relais01, LOW); //Relais für Füllpumpe aus
}
//---------------------------------------------------------------------------------------------
void RelaisTest(){
 digitalWrite(Relais00, LOW);digitalWrite(Relais01, LOW);
 j = 0;
  do {
   tasterstatus3 = digitalRead(TasterDrei);
   tasterstatus2 = digitalRead(TasterZwei);
   RTC.get(UhrDaten,true);
   if (tasterstatus3 == HIGH) {
    delay(500); 
    Stunde[1] = UhrDaten[2]; Minute[1] = UhrDaten[1];
    if (j > 2) j = 0;
    lcdan = 1; LCDein();
    lcd.clear(); lcd.setCursor(1,0);lcd.print("Test aller Relais"); lcd.setCursor(1,1); lcd.print("Weiter mit Taster 4");
    lcd.setCursor(0,2); lcd.print("Beenden mit Taster 2"); 
    j++;
    switch(j){ 
     case 1: digitalWrite(Relais00, LOW);digitalWrite(Relais01, LOW);
      lcd.setCursor(0,3); lcd.print("R aus, Ende in "); break;
     case 2: digitalWrite(Relais00, HIGH);digitalWrite(Relais01, LOW);
      lcd.setCursor(0,3); lcd.print("R1 an, Ende in "); break;
     case 3: digitalWrite(Relais00, LOW);digitalWrite(Relais01, HIGH);
      lcd.setCursor(0,3); lcd.print("R2 an, Ende in "); break;
    }
   }
   i = (UhrDaten[2] * 60 + UhrDaten[1]) - (Stunde[1] * 60 + Minute[1]);
   lcd.setCursor(14,3); 
   sprintf (puffer, "%2d", 10 - i);  // %02d sind Platzhalter: int mit zwei Ziffern und führender Null oder %2d mit Leerzeichen
   lcd.print(puffer); lcd.print(" min");
  } while (tasterstatus2 == LOW && (UhrDaten[2] * 60 + UhrDaten[1]) - (Stunde[1] * 60 + Minute[1]) < 10); // nach spätestens 10 min ohne Tastendruck Rücksprung
 lcd.clear();
 digitalWrite(Relais00, LOW);digitalWrite(Relais01, LOW); 
} 
//---------------------------------------------------------------------------------------------
void loop(void) 
{
 //if (UhrDaten[0] < 1) 
 SRF02::update(); // einmal je Minute reicht
 TasterAbfrage(TasterEins,tasterstatus1,1);  
 TasterAbfrage(TasterZwei,tasterstatus2,2);  
 tasterstatus0 = digitalRead(TasterNull);
 if (tasterstatus0 == HIGH) UhrStellen();  
 tasterstatus3 = digitalRead(TasterDrei);// manuelles Testen der Relais
 if (tasterstatus3 == HIGH) RelaisTest();
 LCDein();
 BasisAnzeige();
 Keller();
 DachBoden();
}