Hallo Forum,
ich habe ein Problem mit der Geschwindigkeit in der Abarbeitung der Inputs.
Das programm soll Besucher zählen mit Industrie-Lichtschranken die schnell genug
sind ( getestet ). Es begann mit 2 Lichtschranken, da bei der Konzeption nicht von Rück-
wärtsbegungen die Rede war, kamen noch 2 Stck hinzu. es sind noch andere Funktionen wie
Temperatur und Speichern auf SD vorhanden die funktionieren. Das Ganze läuft mit einem
Adafruit Shield RTC/SD.
Das Zählen funktioniert nur bei langsamen Bewegungen.
Meine Bitte : was kann man im Programm so strukturieren um den Teil der Zählung nicht
zu verlangsamen ? Ist denn die Struktur das Problem ?
Vielen Dank für Hinweise im voraus.
/*
******* BESUCHERZÄHLER *******
*/
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
const int LS1 = 2; // DI2 = Lichtschranke 1
const int LS2 = 3; // DI3 = Lichtschranke 2
const int LS3 = 4; // DI4 = Lichtschranke 3
const int LS4 = 5; // DI5 = Lichtschranke 4
OneWire ds(6); // DI6 = 18B20
const int buttonPin1 = 7; // DI7 = Count up
const int buttonPin2 = 8; // DI8 = Count down
boolean Countup = 0; // Inc Besucher manuell (DI7)
boolean Countdown = 0; // Dec Besucher manuell (DI8)
int Sensor1; // Variable LS 1
int Sensor2; // Variable LS 2
int Sensor3; // Variable LS 3
int Sensor4; // Variable LS 4
boolean schmier1 = 0; // Merker LS 1 betätigt
boolean schmier2 = 0; // Merker LS 2 betätigt
boolean schmier3 = 0; // Merker LS 3 betätigt
boolean schmier4 = 0; // Merker LS 4 betätigt vor
boolean schmier5 = 0; // Merker LS 4 betätigt zurück
boolean Zeit = false; // Merker Zeit > 19:30
int counter = 0; // Besucher aktuell
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
long Debounce=500;
long DelayTemp = 100;
long WrongLS12=2000; // Keine LS2 nach LS1
long WrongLS23=2000; // Keine LS3 nach LS2
long WrongLS34=2000; // Keine LS4 nach LS3
float AnzTempLow; // Anzeige min Temperatur
float AnzTempHigh; // Anzeige max Temperatur
float TempHigh = 8.0; // Startwert maxTemp n.Reset
float TempLow = 25.0; // Startwert minTemp n.Reset
File myFile;
byte i;
byte present = 0;
byte data[12];
byte addr[8];
float celsius; // Temperatur von Sensor
char dateString[7]; // Daten-String Datum
unsigned long interval_1=800;
unsigned long waitUntil_1=interval_1;
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// oder 0x3f
void setup()
{ // Void Setup
Serial.begin(9600);
Wire.begin();
RTC.begin();
lcd.begin(20,4);
pinMode(LS1, INPUT); // DI2
pinMode(LS2, INPUT); // DI3
pinMode(LS3, INPUT); // DI4
pinMode(LS4, INPUT); // DI5
pinMode(buttonPin1, INPUT); // DI7
pinMode(buttonPin2, INPUT); // DI8
pinMode(10, OUTPUT); // D010 (SD-Card )
// Zeile zum Setzen RTC
//RTC.adjust(DateTime(DATE, TIME));
} // Void Setup
void loop()
{
DateTime now = RTC.now();
Sensor1 = digitalRead(LS1);
Sensor2 = digitalRead(LS2);
Sensor3 = digitalRead(LS3);
Sensor4 = digitalRead(LS4);
Countup = digitalRead(buttonPin1);
Countdown = digitalRead(buttonPin2);
unsigned long currentMillis = millis();
// ******************************************
// BEREICH ZÄHLER
// ******************************************
// Merker setzen wenn 19:30:01 Uhr >> Zählen unterbinden
if ((now.hour()==19)&&(now.minute()==30)&&(now.second()==1))
Zeit = true;
// Merker rücksetzen um
if ((now.hour()==19)&&(now.minute()==33)&&(now.second()==1))
Zeit = false;
// Merker setzen wenn LS 1 betätigt
if ((Sensor1==1)&&(Sensor2==0))
{
schmier1 = 1;
previousMillis1= currentMillis;
}
// Merker setzen wenn LS 2 betätigt
if ((Sensor2==1)&&(schmier1==1))
{
schmier2 = 1;
schmier1 = 0;
previousMillis2= currentMillis;
}
// Merker setzen wenn LS 3 betätigt
if ((Sensor3==1)&&(schmier2==1))
{
schmier3 = 1;
schmier2 = 0;
previousMillis3= currentMillis;
}
// Merker setzen wenn LS 4 betätigt
if ((Sensor4==1)&&(schmier3==1))
{
schmier4 = 1;
schmier3 = 0;
}
// Merker setzen wenn LS 4 betätigt als
// Rückwärtsbewegung und Sensor 1 war betätigt
if ((Sensor4==1)&&(schmier1==1))
{
schmier1 = 0;
}
// Merker rücksetzen wenn LS 3 betätigt nach
// Rückwärtsbewegung und LS4 war betätigt
if ((Sensor3==1)&&(schmier5==1))
{
schmier5 = 0;
schmier1 = 0;
}
// Zähler hochzählen +1
if ((schmier4==1)&&(Sensor4==0))
{
counter+=1;
delay(80);
schmier4 = false;
}
// Abfrage Zeit keine Betätigung LS 2 >> Reset Merker
if ((Sensor2==0)&&(schmier1==1)
&&(currentMillis - previousMillis1 > WrongLS12))
{
schmier1 = false;
}
// Abfrage Zeit keine Betätigung LS 3 >> Reset Merker
if ((Sensor3==0)&&(schmier2==1)
&&(currentMillis - previousMillis2 > WrongLS23))
{
schmier2 = false;
}
// Abfrage Zeit keine Betätigung LS 4 >> Reset Merker
if ((Sensor4==0)&&(schmier3==1)
&&(currentMillis - previousMillis3 > WrongLS23))
{
schmier3 = false;
}
//
// Manuelles Zählen Besucher
//
if (Countup==true)
{ // loop Count up manuell
counter = counter + 1;
delay(300);
} // loop Count up manuell
//
if (Countdown==true)
{ // loop Count down manuell
counter = counter - 1;
delay(300);
} // loop Count down manuell
//
// Bereich Temperaturerfassung und Ermittlung min / max
//
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,0); // start conversion, with parasite power off
// chip present
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
delay(300);
for ( i = 0; i < 9; i++) { // we need 9 bytes of data
data = ds.read(); }
_ celsius = ((data[1] << 8) + data[0] ) * 0.0625; // 12Bit = 0,0625 C per Bit_
- if (celsius > TempHigh ){*
- TempHigh = celsius; }*
- if (celsius < TempLow)*
- TempLow = celsius;*
//
// Ende Temperatur
// - sprintf_P(dateString, PSTR("%02d.%02d.%02d"), now.day(), now.month(), now.year());*
//
// Ausgabe auf LCD
// - lcd.setCursor(2,0);*
// Führende Leerstelle Tage einfügen wenn unter 10 - if((now.day())<10)*
- lcd.print(' '); *
- lcd.print(now.day());*
- lcd.print(".");*
- lcd.print(now.month());*
- lcd.print(".");*
- lcd.print(now.year());*
- lcd.print(" ");*
// Führende Null Stunden einfügen wenn unter 10 - if((now.hour())<10)*
- lcd.print('0');*
- lcd.print(now.hour());*
- lcd.print(":");*
// Führende Null Minuten einfügen wenn unter 10 - if((now.minute())<10)*
- lcd.print('0');*
- lcd.print(now.minute());*
- lcd.setCursor(1,1);*
- lcd.print("Temperatur: ");*
- lcd.print(celsius,1);*
- lcd.print(" ");*
- lcd.write(223);*
- lcd.print("C");*
- lcd.setCursor(0,2);*
- lcd.print("min: ");*
// Führende Null Temperatur einfügen wenn unter 10 - if((TempLow)<10)*
- lcd.print('0');*
- lcd.print(TempLow,1);*
- lcd.print(" max: ");*
// Führende Null Temperatur einfügen wenn unter 10 - if((TempHigh)<10)*
- lcd.print('0');*
- lcd.print(TempHigh,1);*
- lcd.setCursor(3,3);*
- lcd.print("Besucher: ");*
- lcd.print(counter);*
- // Nachführende Leerzeichen einfügen wenn unter 10*
- if (counter<10)*
- lcd.print(" ");*
//
*// SD Karte beschreiben um 20:30:01 *
// - if ((now.hour()==20)&&(now.minute()==30)&&(now.second()==1))*
// if (((now.minute()==5)||(now.minute()==35))&&
// ((now.second()==0)||(now.second()==1))) - { // loop SD Karte beschreiben*
- SD.begin(10); *
- myFile = SD.open("Daten.txt", FILE_WRITE);*
- if (myFile)*
- { // loop SD Karte geöffnet*
- myFile.print(dateString); *
- myFile.print(","); *
- myFile.print(TempLow,1);*
- myFile.print(",");*
- myFile.print(TempHigh,1);*
- myFile.print(",");*
- myFile.println(counter);*
- myFile.close();*
- delay(1500); *
} // loop SD Card geöffnet
} // loop SD Card beschreiben
//
// Werte rücksetzen jeden Tag um 08:30:00 + 08:30:01
// - if ((now.hour()==8)&&(now.minute()==30)&&((now.second()==0)||(now.second()==1)))*
- { // Reset Werte*
- TempHigh = 8.0;*
- TempLow = 25.0;*
- counter = 0;*
- Zeit = false;*
- } // Reset Werte*
} // Void loop
Gruss olmuk