tijdschakelaar

Arduino specifieke Software
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijdschakelaar

Berichtdoor Koepel » 22 Nov 2016, 23:36

Tijdens het laden altijd de background aan ? Als er storing op de knop voor het backlight zit, dan gaat na 10 seconden de backlight sowieso uit. Heb je goede pullup resistors bij de knoppen ?
Ook als een van de twee accus klaar is met laden, en de andere nog bezig, dan gaat toch nog de backlight uit.

Je hebt backlight[] twee keer gemaakt met dezelfde pin ? Dat klopt niet. Dat is gewoon één pin.
Zou je betere namen willen verzinnen voor "backlight" en "backlightPin". Het zijn allebei nummers van pinnen en allebei voor de backlight. Deze namen heb ik zomaar verzonnen, misschien weet jij iets beters:
Code: Alles selecteren
const int backlightButtonPin = 10;
const int backlightControlPin = 4;


Ik zit te denken aan een commando : "zet de backlight uit".
Onderaan de loop() kijken of dat commando er is, maar dan eerst alles controleren voordat de backlight echt wordt uitgezet. Het uitzetten is namelijk lastig, het aanzetten is geen probleem.
Een tweede mogelijkheid is om een getal te gebruiken. Iedereen die de backlight 'aan' zet verhoogt de integer, en iedereen die het 'uit' zet verlaagt het getal. Bij nul en lager gaat pas de backlight uit. Bij een programmeerfoutje gaat dat getal uit sync.

Denk je dat je dit er bij kunt maken ?

Overal waar je de backlight uit zet met digitalWrite(), vervangen door dit:
Code: Alles selecteren
turn_off_backlight = true;

Als beide accus tegelijkertijd klaar zijn met laden, dan wordt het twee keer op true gezet, dat is prima.

Aan het begin van de loop het commando op false zetten.
Dan op het einde van de loop() de grote test.
Code: Alles selecteren
void loop()
{
  boolean turn_off_backlight = false;

  ...
  ...
  ...
 
  // Test if the backlight needs to turn off.
  if( turn_off_backlight)
  {
    // Test all the conditions to see if the backlight needs to be turned off for real.
    if( !delayIsActive && battery_status[0] == WAIT && battery_status[1] == WAIT)
    {
       digitalWrite( backlight, LOW);
    }
  }

  // End of the loop()
}


Ik weet niet of dit de beste oplossing is. Mijn wiskundeknobbel zegt dat een getal dat ophoogt en verlaagt wordt mooier is, maar als ik mijn software-pet op zet dan is een fail safe in de code veel belangrijker. Als ik er een nachtje over slaap dan is misschien een functie gemakkelijker.

Advertisement

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 23 Nov 2016, 21:15

bedankt voor de op weg naar een oplossing tips, ik had in de code het volgende staan ,
Code: Alles selecteren
 // check of one of the accus charging or backlight timer active

    if (digitalRead(3) == HIGH || digitalRead(2) == HIGH || digitalRead(4) == HIGH) // check of one of the accus
    {
      digitalWrite(backlight, HIGH);
    }
    else
      digitalWrite(backlight, LOW);


ik heb dat (voor nu onduidelijke reden) uitgehaald, volgens mij ook een oplossing.

hetgeen jij nu voorstelt lijkt inderdaad beter, maar vraag wel een behoorlijke aanpassing.

Volgende week mag ik weer een weekje op dienstreis, dus even geen tijd hiervoor.
ook is het geheel nu in de garage ingebouwd, wat het niet eenvoudiger maakt "even" een aanpassing te doen (ik heb de Mini_pro gebruikt dus moet een interface aansluiten kastje open enz), maar zal daar wel een kamer "test versie" voor gebruiken (maar heb even geen 20x4 display .. is onderweg (aliexpress).

denk trouwens dat je het probleem wel gevonden hebt, er lopen twee timers, zodra er 1 klaar is gaat backlight uit, dit had ik over het hoofd gezien.

als ik weer verder ben zal ik een update geven, de rest werkt trouwens prima, probleem zit alleen in het backlight.

Groet Wim

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 03 Dec 2016, 22:15

ik heb de code aangepast ivm probleem Backlight , hopelijk is het nu goed.

testen verliep goed, nu de praktijk:)

Code: Alles selecteren
// "http://arduinoforum.nl/viewtopic.php?f=8&t=2054">viewtopic.php?f=8&t=2054</a><!-- l -->
// Tested with Arduino.cc 1.6.12, Arduino Uno.
// This sketch uses a software timer of 1 second.
// changed by Wim Lemson 03-12-2016


#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
#define WAIT   0       // WAIT means 30 days waiting
#define CHARGE 1       // CHARGE means 10 hours charging


// set the LCD address to 0x27 for LCD display
// Set the pins on the I2C chip used for LCD connections:addr, en,rw,rs,d4,d5,d6,d7,bl,blpol

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

const int pinKnop[2] = { 8, 9};         // first button at pin 8, second at pin 9
const int pinUitgang[2] = { 2, 3};      // first output at pin 2, second at pin 3
const int backlightButtonPin = 10;
const int backlightControlPin = 4;


unsigned long battery_count[2];         // counter in seconds for both batteries
unsigned long backlightTime = 0;        // timer for backlight LCD
const long Timer = 10000;               //time in millis LCD on after active
int battery_state[2] = { WAIT, WAIT};   // state of software (waiting or charging)

unsigned long previousMillisBackground;  // for backlight
boolean delayIsActive;                   // for backlight

// Variables for the 1 second software timer with millis()
unsigned long previousMillis;
unsigned long interval = 1000UL;        // 1000 milliseconds interval
const long Timebacklight = 1000UL;

// Very short test values or real value.

// very short
//const unsigned long TenHoursInSeconds = 10UL;   // 10 seconds for test
//const unsigned long ThirtyDaysInSeconds = 30UL; // 30 seconds for test

// Real values:
const unsigned long TenHoursInSeconds = 10UL * 60UL * 60UL; // 10 hours
const unsigned long ThirtyDaysInSeconds = 30UL * 24UL * 60UL * 60UL; // 30 days


void setup()
{
  pinMode(backlightControlPin, OUTPUT);
  pinMode(backlightButtonPin, INPUT_PULLUP);
  digitalWrite(backlightControlPin, HIGH);   // during startup backlight on
  Serial.begin( 9600);
  Serial.println(F( "\nStarted"));

  lcd.begin( 20, 4);
  lcd.setCursor( 3, 0);
  lcd.print(F( "LAAD TIMER"));
  lcd.setCursor( 3, 2);
  lcd.print(F( "FIETSACCU'S"));

  delay( 3000);

  lcd.clear();
  lcd.setCursor( 2, 0);
  lcd.print(F( "Wim Lemson"));
  lcd.setCursor( 2, 1);
  lcd.print(F( "December 2016"));
  lcd.setCursor( 2, 2);
  lcd.print(F( "30 dagen wachten"));
  lcd.setCursor( 2, 3);
  lcd.print(F( "10 uur laden"));

  delay( 3000);

  lcd.clear();
  lcd.setCursor( 1, 1);
  lcd.print(F( "-- Dagen --:--:--"));
  lcd.setCursor( 1, 3);
  lcd.print(F( "-- Dagen --:--:--"));

  // A test added to tell if the test values are used.

  if ( TenHoursInSeconds < ( 60UL * 60UL) || ThirtyDaysInSeconds < ( 24UL * 60UL * 60UL))
  {
    Serial.println(F( "Running in test mode"));
    lcd.clear();
    lcd.setCursor( 1, 2);
    lcd.print(F( "Running in "));
    lcd.setCursor( 1, 3);
    lcd.print(F( "test mode"));
    delay (3000);
    lcd.clear();
    lcd.setCursor( 1, 1);
    lcd.print(F( "-- Dagen --:--:--"));
    lcd.setCursor( 1, 3);
    lcd.print(F( "-- Dagen --:--:--"));
  }
  for ( int i = 0; i < 2; i++)
  {
    pinMode( pinKnop[i], INPUT_PULLUP);
    pinMode( pinUitgang[i], OUTPUT);
    digitalWrite(pinUitgang[i], HIGH);
  }

 digitalWrite(backlightControlPin, LOW);  // backlight off after setup
}

void loop()
{
  // boolean status voor backlight uit te zteen aan einede code
  boolean turn_off_backlightControlPin = false;

  // A single currentMillis for the whole loop.
  unsigned long currentMillis = millis();

  // Backlight on for 10 sec after input 10 = low (switch)

  if (digitalRead(backlightButtonPin) == LOW)
  {
    digitalWrite(backlightControlPin, HIGH);
    previousMillisBackground = currentMillis;          // timestamp this moment
    delayIsActive = true;    // enable the delay
  }
  if (delayIsActive)
  {
    if ( currentMillis - previousMillisBackground >= 10000UL)
    {
      delayIsActive = false;    // disable the delay
      turn_off_backlightControlPin = true;
    }
  }


  // Has one second passed ?

  if ( currentMillis - previousMillis >= interval)
  {
    // Special case here, add the interval to keep time accurate.
    // Normally it would be: previousMillis = currentMillis;
    // But here is is: previousMillis += interval;
    // That way the timing is not influenced by a delay in the code.

    previousMillis += interval;


    // -------------------------------------------
    // This section is executed once every second.
    // -------------------------------------------

    for ( int i = 0; i < 2; i++)
    {
      // Increment the time in minutes for this battery.
      battery_count[i]++;

      if ( battery_state[i] == CHARGE)
      {
        // state is CHARGE, count 10 hours.
        if ( battery_count[i] >= TenHoursInSeconds)
        {
          // Stop charging, return to WAIT and change backlight boolean

          battery_state[i] = WAIT;
          battery_count[i] = 0; // reset counter
          digitalWrite( pinUitgang[i], HIGH);
          turn_off_backlightControlPin = true;
        }
      }
      else
      {
        // state is WAIT, count a month
        if ( battery_count[i] >= ThirtyDaysInSeconds)
        {
          // 30 days are over, start charging and backlight on
          battery_state[i] = CHARGE;
          battery_count[i] = 0; // reset counter
          digitalWrite( pinUitgang[i], LOW);
          digitalWrite(backlightControlPin, HIGH);

        }
      }
    }
    ShowEverything();
    UpdateLCD();
  }

  // check buttons for direct charging and act and put backlight on.

  for ( int i = 0; i < 2; i++)
  {
    if ( digitalRead( pinKnop[i]) == LOW)
    {
      // start cycle right now.
      battery_state[i] = CHARGE;
      battery_count[i] = 0;
      digitalWrite( pinUitgang[i], LOW);
      digitalWrite(backlightControlPin, HIGH);


    }
  }
}

// The function ShowEverything() shows everything.

void ShowEverything()
{
  Serial.println(F( "----------------------------------"));

  for ( int i = 0; i < 2; i++)
  {
    Serial.print(F( "Accu "));
    Serial.print( i == 0 ? "A" : "B");
    Serial.print(F( " : "));

    if ( battery_state[i] == WAIT)
      Serial.print( "Waiting ");
    else if ( battery_state[i] == CHARGE)
      Serial.print( "Charging");
    else
      Serial.print( "Error");

    // Show the counter in days,hh:mm:ss
    int days = (int) (battery_count[i] / (24UL * 60UL * 60UL));
    int hours = (int) ((battery_count[i] / (60UL * 60UL)) % 24UL);
    int minutes = (int) ((battery_count[i] / (60UL)) % 60UL);
    int seconds = (int) (battery_count[i] % 60UL);

    // A sprintf with formatting is easer
    char buffer[40];
    sprintf( buffer, " %d days, %02d:%02d:%02d", days, hours, minutes, seconds);
    Serial.print( buffer);

    Serial.println();
  }
}


void UpdateLCD()
{
  for (int i = 0; i < 2; i++)
  {
    if (i == 0)
      lcd.setCursor( 12, 0);
    else
      lcd.setCursor( 12, 2);
    if ( battery_state[i] == WAIT)
      lcd.print(F( "WACHTEN"));
    else if ( battery_state[i] == CHARGE)
      lcd.print(F( "LADEN  "));

    // Show the counter in days,hh:mm:ss
    int days = (int) (battery_count[i] / (24UL * 60UL * 60UL));
    int hours = (int) ((battery_count[i] / (60UL * 60UL)) % 24UL);
    int minutes = (int) ((battery_count[i] / (60UL)) % 60UL);
    int seconds = (int) (battery_count[i] % 60UL);

    // print days
    if (i == 0)
      lcd.setCursor( 1, 1);
    else
      lcd.setCursor( 1, 3);
    if ( days < 10)
      lcd.print(F( " "));
    lcd.print( days);

    // print hours
    if (i == 0)
      lcd.setCursor( 10, 1);
    else
      lcd.setCursor( 10, 3);
    if ( hours < 10)
      lcd.print(F( "0"));
    lcd.print( hours);

    // print minutes
    if (i == 0)
      lcd.setCursor( 13, 1);
    else
      lcd.setCursor( 13, 3);
    if ( minutes < 10)
      lcd.print(F( "0"));
    lcd.print( minutes);

    // print seconds
    if (i == 0)
      lcd.setCursor( 16, 1);
    else
      lcd.setCursor( 16, 3);;
    if ( seconds < 10)
    {
      lcd.print(F( "0"));
    }
    lcd.print( seconds);
    if (i == 0)
      lcd.setCursor( 0, 0);
    else
      lcd.setCursor( 0, 2);
    lcd.print( i == 0 ? "Fiets Rita:" : "Fiets Wim :");

    delay(20);

    // Test if the backlight needs to turn off.
    // Test all the conditions to see if the backlight needs to be turned off for real.

    if ( !delayIsActive && battery_state[0] == WAIT && battery_state[1] == WAIT)
    {
      digitalWrite( backlightControlPin, LOW);
    }
  }
}



Groet Wim

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijdschakelaar

Berichtdoor Koepel » 03 Dec 2016, 23:52

Misschien dat het zo werkt, maar ik had het anders in gedachten.

Dit:
Code: Alles selecteren
boolean turn_off_backlightControlPin = false;
is een lokale variabele. Die is dus alleen geldig in de loop(). Iedereen kan die op 'true' zetten, maar pas op het einde van de loop() wordt gekeken of de backlight inderdaad uit wordt gezet.

Kijk nog eens naar mijn voorbeeld, de test of de backlight echt uit gaat staat boven "// End of the loop()". Dat is dus nog binnen de loop(). Jij hebt het binnen de functie "UpdateLCD()" gezet, en toen had je opeens de variable "turn_off_backlightControlPin" niet meer tot je beschikking.

De naam "turn_off_backlight" geeft aan dat het een commando is voor de backlight. De naam "turn_off_backlightControlPin" geeft aan dat de pin van de backlight uitgezet wordt... ? Het gaat om een variabele voor de backlight die los staat van de uiteindelijke pin. Dus mijn benaming vind ik toch beter ;)

Ik geef toe dat de boolean variabele om binnen de loop() een commando te verwerken er niet heel mooi uit ziet. Dus je zou misschien bij "UpdateLCD()" iedere keer kunnen kijken of de backlight aan of uit moet zijn, zoals je nu hebt. Ik denk dat het zou kunnen werken. Maar dan kun je de hele constructie met "turn_off_backlightControlPin" verwijderen.

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 04 Dec 2016, 14:52

hallo, je heb gelijk, het hele Boolean gedoe heeft geen zin als ik het niet gebruik!, maar eea was gegroeid, ik had eerst problemen dan de state van de batterijen (nog) niet bekend is /was als ik het geheel voor de 1 sec loop zet.

daarna had ik inderdaad het probleem dat de variable "turn_off_backlightControlPin" niet meer tot beschikking was, heb dat toen opgelost met,

cpp code
// Test if the backlight needs to turn off.
// Test all the conditions to see if the backlight needs to be turned off for real.

if ( !delayIsActive && battery_state[0] == WAIT && battery_state[1] == WAIT)
{
digitalWrite( backlightControlPin, LOW);
}


maar had daarbij overhet hoofd gezien dat ik niet meer met de boolean deed.

anders geprobeerd maar kreeg weer problemen met de state battery,

Nu gehele boolean eruit, en bij de Update lcd de test of backlight uit moet.
dit lijkt mij nu goed?

cpp code
// "http://arduinoforum.nl/viewtopic.php?f=8&t=2054">viewtopic.php?f=8&t=2054</a><!-- l -->
// Tested with Arduino.cc 1.6.12, Arduino Uno.
// This sketch uses a software timer of 1 second.
// changed by Wim Lemson 03-12-2016


#include <Wire.h> // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
#define WAIT 0 // WAIT means 30 days waiting
#define CHARGE 1 // CHARGE means 10 hours charging


// set the LCD address to 0x27 for LCD display
// Set the pins on the I2C chip used for LCD connections:addr, en,rw,rs,d4,d5,d6,d7,bl,blpol

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

const int pinKnop[2] = { 8, 9}; // first button at pin 8, second at pin 9
const int pinUitgang[2] = { 2, 3}; // first output at pin 2, second at pin 3
const int backlightButtonPin = 10;
const int backlightControlPin = 4;


unsigned long battery_count[2]; // counter in seconds for both batteries
unsigned long backlightTime = 0; // timer for backlight LCD
const long Timer = 10000; //time in millis LCD on after active
int battery_state[2] = { WAIT, WAIT}; // state of software (waiting or charging)

unsigned long previousMillisBackground; // for backlight
boolean delayIsActive; // for backlight

// Variables for the 1 second software timer with millis()
unsigned long previousMillis;
unsigned long interval = 1000UL; // 1000 milliseconds interval
const long Timebacklight = 1000UL;

// Very short test values or real value.

// very short
const unsigned long TenHoursInSeconds = 10UL; // 10 seconds for test
const unsigned long ThirtyDaysInSeconds = 30UL; // 30 seconds for test

// Real values:
//const unsigned long TenHoursInSeconds = 10UL * 60UL * 60UL; // 10 hours
//const unsigned long ThirtyDaysInSeconds = 30UL * 24UL * 60UL * 60UL; // 30 days


void setup()
{
pinMode(backlightControlPin, OUTPUT);
pinMode(backlightButtonPin, INPUT_PULLUP);
digitalWrite(backlightControlPin, HIGH); // during startup backlight on
Serial.begin( 9600);
Serial.println(F( "\nStarted"));

lcd.begin( 20, 4);
lcd.setCursor( 3, 0);
lcd.print(F( "LAAD TIMER"));
lcd.setCursor( 3, 2);
lcd.print(F( "FIETSACCU'S"));

delay( 3000);

lcd.clear();
lcd.setCursor( 2, 0);
lcd.print(F( "Wim Lemson"));
lcd.setCursor( 2, 1);
lcd.print(F( "December 2016"));
lcd.setCursor( 2, 2);
lcd.print(F( "30 dagen wachten"));
lcd.setCursor( 2, 3);
lcd.print(F( "10 uur laden"));

delay( 3000);

lcd.clear();
lcd.setCursor( 1, 1);
lcd.print(F( "-- Dagen --:--:--"));
lcd.setCursor( 1, 3);
lcd.print(F( "-- Dagen --:--:--"));

// A test added to tell if the test values are used.

if ( TenHoursInSeconds < ( 60UL * 60UL) || ThirtyDaysInSeconds < ( 24UL * 60UL * 60UL))
{
Serial.println(F( "Running in test mode"));
lcd.clear();
lcd.setCursor( 1, 2);
lcd.print(F( "Running in "));
lcd.setCursor( 1, 3);
lcd.print(F( "test mode"));
delay (3000);
lcd.clear();
lcd.setCursor( 1, 1);
lcd.print(F( "-- Dagen --:--:--"));
lcd.setCursor( 1, 3);
lcd.print(F( "-- Dagen --:--:--"));
}
for ( int i = 0; i < 2; i++)
{
pinMode( pinKnop[i], INPUT_PULLUP);
pinMode( pinUitgang[i], OUTPUT);
digitalWrite(pinUitgang[i], HIGH);
}

digitalWrite(backlightControlPin, LOW); // backlight off after setup
}

void loop()
{
// A single currentMillis for the whole loop.
unsigned long currentMillis = millis();

// Backlight on for 10 sec after input 10 = low (switch)

if (digitalRead(backlightButtonPin) == LOW)
{
digitalWrite(backlightControlPin, HIGH);
previousMillisBackground = currentMillis; // timestamp this moment
delayIsActive = true; // enable the delay
}
if (delayIsActive)
{
if ( currentMillis - previousMillisBackground >= 10000UL)
{
delayIsActive = false; // disable the delay

}
}


// Has one second passed ?

if ( currentMillis - previousMillis >= interval)
{
// Special case here, add the interval to keep time accurate.
// Normally it would be: previousMillis = currentMillis;
// But here is is: previousMillis += interval;
// That way the timing is not influenced by a delay in the code.

previousMillis += interval;


// -------------------------------------------
// This section is executed once every second.
// -------------------------------------------

for ( int i = 0; i < 2; i++)
{
// Increment the time in minutes for this battery.
battery_count[i]++;

if ( battery_state[i] == CHARGE)
{
// state is CHARGE, count 10 hours.
if ( battery_count[i] >= TenHoursInSeconds)
{
// Stop charging, return to WAIT and change backlight boolean

battery_state[i] = WAIT;
battery_count[i] = 0; // reset counter
digitalWrite( pinUitgang[i], HIGH);

}
}
else
{
// state is WAIT, count a month
if ( battery_count[i] >= ThirtyDaysInSeconds)
{
// 30 days are over, start charging and backlight on
battery_state[i] = CHARGE;
battery_count[i] = 0; // reset counter
digitalWrite( pinUitgang[i], LOW);
digitalWrite(backlightControlPin, HIGH);

}
}
}
ShowEverything();
UpdateLCD();
}

// check buttons for direct charging and act and put backlight on.

for ( int i = 0; i < 2; i++)
{
if ( digitalRead( pinKnop[i]) == LOW)
{
// start cycle right now.
battery_state[i] = CHARGE;
battery_count[i] = 0;
digitalWrite( pinUitgang[i], LOW);
digitalWrite(backlightControlPin, HIGH);


}
}
}

// The function ShowEverything() shows everything.

void ShowEverything()
{
Serial.println(F( "----------------------------------"));

for ( int i = 0; i < 2; i++)
{
Serial.print(F( "Accu "));
Serial.print( i == 0 ? "A" : "B");
Serial.print(F( " : "));

if ( battery_state[i] == WAIT)
Serial.print( "Waiting ");
else if ( battery_state[i] == CHARGE)
Serial.print( "Charging");
else
Serial.print( "Error");

// Show the counter in days,hh:mm:ss
int days = (int) (battery_count[i] / (24UL * 60UL * 60UL));
int hours = (int) ((battery_count[i] / (60UL * 60UL)) % 24UL);
int minutes = (int) ((battery_count[i] / (60UL)) % 60UL);
int seconds = (int) (battery_count[i] % 60UL);

// A sprintf with formatting is easer
char buffer[40];
sprintf( buffer, " %d days, %02d:%02d:%02d", days, hours, minutes, seconds);
Serial.print( buffer);

Serial.println();
}
}


void UpdateLCD()
{
for (int i = 0; i < 2; i++)
{
if (i == 0)
lcd.setCursor( 12, 0);
else
lcd.setCursor( 12, 2);
if ( battery_state[i] == WAIT)
lcd.print(F( "WACHTEN"));
else if ( battery_state[i] == CHARGE)
lcd.print(F( "LADEN "));

// Show the counter in days,hh:mm:ss
int days = (int) (battery_count[i] / (24UL * 60UL * 60UL));
int hours = (int) ((battery_count[i] / (60UL * 60UL)) % 24UL);
int minutes = (int) ((battery_count[i] / (60UL)) % 60UL);
int seconds = (int) (battery_count[i] % 60UL);

// print days
if (i == 0)
lcd.setCursor( 1, 1);
else
lcd.setCursor( 1, 3);
if ( days < 10)
lcd.print(F( " "));
lcd.print( days);

// print hours
if (i == 0)
lcd.setCursor( 10, 1);
else
lcd.setCursor( 10, 3);
if ( hours < 10)
lcd.print(F( "0"));
lcd.print( hours);

// print minutes
if (i == 0)
lcd.setCursor( 13, 1);
else
lcd.setCursor( 13, 3);
if ( minutes < 10)
lcd.print(F( "0"));
lcd.print( minutes);

// print seconds
if (i == 0)
lcd.setCursor( 16, 1);
else
lcd.setCursor( 16, 3);;
if ( seconds < 10)
{
lcd.print(F( "0"));
}
lcd.print( seconds);
if (i == 0)
lcd.setCursor( 0, 0);
else
lcd.setCursor( 0, 2);
lcd.print( i == 0 ? "Fiets Rita:" : "Fiets Wim :");

delay(20);

// Test if the backlight needs to turn off.
// Test all the conditions to see if the backlight needs to be turned off for real.

if ( !delayIsActive && battery_state[0] == WAIT && battery_state[1] == WAIT)
{
digitalWrite( backlightControlPin, LOW);
}
}
}


Het leek allemaal zo'n simpel idee , en verwachte ook een simpele code, nu na alle hulp en zelf uitzoeken, heb ik heel veel geleerd, maar toch een code die wel erg ingewikkeld lijkt voor twee simpele timers? , maar gezien het grote aantal "meelezers" denk ik dat ook andere hier veel van geleerd hebben.
bij mij volgende project zal ik eerst proberen het idee goed op te schrijven, dan een code (proberen) te bedenken, dan pas bouwen.

Beste Koepel , nog heel veel dank voor jou niet aflatende hulp en review, ik hoop ooit jou nivo te bereiken!

Groet Wim

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijdschakelaar

Berichtdoor Koepel » 04 Dec 2016, 23:33

Ik denk dat het zo werkt (ik heb er alleen globaal doorheen gescrollt).

De functies ShowEverything() en UpdateLCD() maken geen deel uit van de structuur van de sketch. Dus daar kun je snel overheen lezen. De code in setup() is nodig om alles goed te zetten, en dus blijft alleen de loop() over, daar gebeurt het.
Als je het zo bekijkt dan valt het nog mee ;)

Toch kan het volgens mij de helft korter.
Het kan eenvoudiger door: ofwel alle timing binnen de seconde timer, ofwel alles direct met millis(), ofwel een library voor de timing.

In ShowEverything() zit een sprintf(), maar de UpdateLCD() spelt het helemaal uit met Serial.print(). Dat kan ingekort worden met 30 regels door daar ook sprintf() te gebruiken.

Er is nog een mogelijkheid die precies doet wat jij in gedachten hebt: multitasking :geek:
De twee verschillende accus hebben dan twee taken die naast elkaar draaien.
Er zijn een stuk of 5 multitasking libraries voor eenvoudige Arduino boards, maar die hebben allemaal veel nadelen en maar een paar voordelen.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: tijdschakelaar

Berichtdoor nicoverduin » 05 Dec 2016, 09:00

Hij kan ook gewoon freeRtos (ook voor de Uno) gebruiken. Maar ik betwijfel of er voldoende basis is om daar doorheen te worstelen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Alexduh, omuviop en 15 gasten