void loop() { if( readDetector() == occupied ) digitalWrite( 13, HIGH ); else digitalWrite( 13, LOW );}
const int sampleInterval = 5;const int timeOut = 2000 / sampleInterval ; // // 2 second timeout, kan je ook 10 of 20s maken, net wat je wiltuint8_t readDetector() { static uint16_t timeCounter = 0; static uint16_t prevTime = 0; // op deze wijze hebben we geen long nodig uint16_t currentTime; currentTime = millis() & 0x0000FFFF; // ( and masker is eigenlijk overbodig. Hij staat er om te illustreren dat we alleen de laatste 16 bits gebruiken van millis) if( currentTime - prevTime > sampleInterval ) { // elke 5ms prevTime = currentTime;
if( digitalRead( sensor ) == LOW ) { // if train is detected timeCounter = timeOut; // force the counter again to 2 seconds } if( timeCounter > 0 ) timeCounter--; // start counting down time if( timeCounter == 0) { return freed; } else { return occupied; }
const int ledPin = 13;const int sensor = 3; // ??enum blockStates { occupied, freed,};void setup() { pinMode( 13, OUTPUT ); pinMode( sensor, INPUT_PULLUP );}void loop() { if( readDetector() == occupied ) digitalWrite( 13, HIGH ); else digitalWrite( 13, LOW );}const int sampleInterval = 5;const int timeOut = 2000 / sampleInterval ; // // 5 second timeoutuint8_t readDetector() { static uint16_t timeCounter = 0; static uint16_t prevTime = 0; // op deze wijze hebben we geen long nodig uint16_t currentTime; currentTime = millis() & 0x0000FFFF; // ( and masker is eigenlijk overbodig, we hebben zo geen long nodig ) if( currentTime - prevTime > sampleInterval ) { // elke 5ms ofzo prevTime = currentTime; if( digitalRead( sensor ) == LOW ) { // if train is detected timeCounter = timeOut; // force the counter again to 3 seconds } if( timeCounter > 0 ) timeCounter--; // start counting down time if( timeCounter == 0) { return freed; } else { return occupied; } }}
if(!digitalRead(SENSOR_PIN)) { train_detected = 1; end_of_train_time = millis() + 2000UL; // wachttijd in [ms] }if(millis() > end_of_train_time) train_detected = 0;
#define WAIT_TIME 2000 // [ms]#define SENSOR_PIN 8byte train_detected;unsigned long end_of_train_time;void setup() { pinMode(SENSOR_PIN, INPUT_PULLUP); pinMode(13, OUTPUT); // on board LED digitalWrite(13, LOW);}void loop() { if(!digitalRead(SENSOR_PIN)) { end_of_train_time = millis() + (unsigned long)WAIT_TIME; train_detected = 1; } if(millis() > end_of_train_time) train_detected = 0; digitalWrite(13, train_detected);}
Dat is wel een heel wetenschappelijke aanpak. Dit werkt ook:Code: [Selecteer]if(!digitalRead(SENSOR_PIN)) { train_detected = 1; end_of_train_time = millis() + 2000UL; // wachttijd in [ms] }if(millis() > end_of_train_time) train_detected = 0;