tijdschakelaar

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

Re: tijdschakelaar

Berichtdoor nicoverduin » 01 Nov 2016, 22:18

Wim
Ik ben inderdaad scherper als de rest. Dat koepel zo ongeveer alles voorkauwt moet hij zelf weten al vind ik dat de leden daar weinig van leren. Op een ander topic was er zelfs een die beweerde een datasheet niet te kunnen vinden terwijl als hij ze intikt hij ze gelijk kon vinden. enne ik kom uit het tijdperk van geen internet, geen forums of werkgroepen dus werd dat studie en zelf onderzoeken. En als het niet werkte ging je net zolang door tot het wel aan de praat kreeg. Maar als je liever naar Koepel luistert mijn zege heb je.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

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

Re: tijdschakelaar

Berichtdoor Koepel » 01 Nov 2016, 22:35

Rustig aan mensen.
Soms geef ik een voorbeeld, ik vind millis() en I2C nu eenmaal leuk.

@wim2584, als ik iets programmeer dan doe ik dat voor een deel gevoelsmatig, en met de kwaliteitsstandaarden van tegenwoordig om software te ontwerpen heb ik niet leren omgaan. Tja, ieder doet het op zijn eigen manier.
Ik kan je wel een kijkje geven in mijn gedachten:
Stel je hebt twee emmers cola. Hoe ver loopt dat uit als je dat op een grasveld uitgiet ? Dan zie ik dat voor me. Probeer als het ware het gras te ruiken, en whoesh, daar gaan de twee emmers leeg. Ik schat dat op 0.5 tot 2 meter. Dus als ik het vervolgens ga berekenen en er komt 2.46E-12 meter uit, dan weet ik meteen dat de berekening fout was. Het gaat er dus om, om eerst wat afstand te nemen en het geheel te overzien, terwijl anderen ijverig formules gaan berekenen.

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

Re: tijdschakelaar

Berichtdoor wim2584 » 01 Nov 2016, 22:54

@Nico

Ja, het zelf uitzoeken is de beste leerschool, ook ik kom uit een tijdperk van geen internet, mijn weg is echter altijd naar discrete/ analoge elektronica en mijn andere grote interesse auto en motor techniek gegaan, tevens ben ik heel lang intensief met chemie bezig geweest in mijn toenmalig werk.
echter tijden veranderen snel, en ik heb ingezien dat microcontrollers het hebben gewonnen, vanaf toen ben ik daar pas ingestapt, en dan is het een hele kluif! (vooral door onbekendheid , en andere bezigheden).

@koepel,
gelukkig voor mij vindt jij millis() en I2C leuk! , ik vind eea ook erg leuk (anders was ik er niet mee bezig) , maar merk dat ik een grote kenniskloof heb, en een persoonlijkheid die resultaat en pragmatisch gericht is.

gelukkig zijn we allemaal verschillend, anders was de techniek nooit op huidige niveau

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

Re: tijdschakelaar

Berichtdoor wim2584 » 02 Nov 2016, 22:51

update:

Toch nog een avond besteed aan de Oled, krijg eea redelijk op display, maar weer problemen met te late reactie op inputs, en bijna gehele geheugen vol (ook melding van IDE).

dus van de Oled neem ik voor dit project afstand . Oled is een leuk goedkoop en duidelijk display, maar geeft toch wel problemen, zeker de library zijn erg groot, en (voor mij) moeilijk

ben nu nog bezig met een LCD 20x4 display (had ik nog liggen) , zien er goed uit, moet nog beslissen of 16x2 beperkte info of meer uitgebreid en dan de 20x4, ligt ook een beetje aan het kastje wat ik er voor vind , nog niet gezocht in de "voorraad" :D

iedereen nog bedankt, Wim

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: tijdschakelaar

Berichtdoor shooter » 03 Nov 2016, 20:23

wellicht kun je 2 bordjes gebruiken, dan heb je wat minder geheugenproblemen.
een late reactie wordt altijd veroorzaakt door of delay of dat je ergens een blocking code hebt.
paul deelen
shooter@home.nl

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

Re: tijdschakelaar

Berichtdoor wim2584 » 05 Nov 2016, 16:30

Twee bordjes? Dat is misschien een idee,had ik mog niet aan gedacht.
Maar voor dit project blijf ik bij de 20x4 lcd .
Maar in de toelomst leuk om te proberen, op ebay (of aliexpress) kost een mini pro toch bijna niks.

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

Re: tijdschakelaar

Berichtdoor wim2584 » 05 Nov 2016, 21:03

De code is af (denk ik?) hieronder de final code met alles bling-bling , alles wordt getoond op een 20*4 LCD I2C display, het backlight niet via de "normale" jumper maar via een weerstand van 220 Ohm naar uitgang 4.
het backlight is altijd uit behalve als:

1- input 10 laag wordt, dan 10 sec aan
2- een van de accu's aan het laden is
3- tijdens de start-up

[code][/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 06-11-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 backlightPin = 10; // backlight pushbutton pin
const int backlight = 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)

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

// Very short test values or real value.
// Very short test values:
//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(backlight, OUTPUT);
pinMode(backlightPin, INPUT_PULLUP);
digitalWrite(backlight, 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( "november 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(backlight, LOW); // backlight off after setup
}
}
void loop()
{

// Backlight on for 10 sec
unsigned long current = millis();

if (digitalRead(backlightPin) == LOW)
{
digitalWrite(backlight, HIGH);
}
if (current - backlightTime >= Timer)
{
backlightTime = current;
digitalWrite(backlight, LOW);
}

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


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

// 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
battery_state[i] = WAIT;
battery_count[i] = 0; // reset counter
digitalWrite( pinUitgang[i], LOW);
}

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

}
}
}

ShowEverything();
}

// check buttons for direct charging and act.

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], 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 ( i = 0; i < 2; i++)
{
// When 'i' is zero, it will be the first battery "A".
// When 'i' is one, it will be the second battery "B".

// print battery status. L = laden, W = wachten
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) // functie onbekend
lcd.print(F( "0"));
lcd.print( hours);

// print minutes
if (i == 0)
lcd.setCursor( 13, 1);
else
lcd.setCursor( 13, 3);
if ( minutes < 10) // functie onbekend
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 :");
}
}
}
}

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

Re: tijdschakelaar

Berichtdoor Koepel » 06 Nov 2016, 00:25

Ik lees de code door en wat in mijn oog springt dat schrijf ik hier op:

1 )
Aan het einde van setup zet je de backlight uit. Dat hoeft niet in die for-loop, maar kan er na. Die for-loop is voor de twee accus.

2 )
De functie "UpdateLCD()" heb je binnen de loop(). Normaal gesproken staat een functie er buiten. Op hetzelfde niveau als setup() en loop(). Bij de definitie van een functie hoort er geen puntkomma achter.

3 )
Je hoeft niet steeds te kijken of 'i' nul is als je wilt wisselen tussen regel 1 en 3. Dit kan ook: int regel = 1 + 2 * i;

4 )
Aan het begin van de loop() had je de 'currentMillis = millis()' kunnen zetten, en die overal gebruiken. Nu heb je een tweede 'current' toegevoegd.

5 )
Ik begrijp niet hoe dit onderdeel kan werken: if (current - backlightTime >= Timer). Werkt dat maar één keer bij het opstarten. En daarna is het niet na 10 seconden, maar willekeurig tussen 0 en 10 seconden ?

6 )
Het ontbreken van een '{' nadat je kijkt of de battery_state[i] == CHARGE, dat doet wel erg zeer aan mijn ogen. Ik denk zelfs dat het een code fout is. Volgens mij is dit de bedoeling:
Code: Alles selecteren
      if ( battery_state[i] == CHARGE)
      {
        // state is CHARGE, count 10 hours.
        if ( battery_count[i] >= TenHoursInSeconds)
        {
          // Stop charging, return to WAIT
          battery_state[i] = WAIT;
          battery_count[i] = 0; // reset counter
          digitalWrite( pinUitgang[i], LOW);
        }
      }
      else
      {
        // state is WAIT, count a month
        ...

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

Re: tijdschakelaar

Berichtdoor wim2584 » 06 Nov 2016, 12:45

Beste Koepel,
Bedankt voor de review van de code, zie hieronder mijn vraag/opmerking:

1 )
Aan het einde van setup zet je de backlight uit. Dat hoeft niet in die for-loop, maar kan er na. Die for-loop is voor de twee accus.


aangepast, stond verkeerd.



2 )
De functie "UpdateLCD()" heb je binnen de loop(). Normaal gesproken staat een functie er buiten. Op hetzelfde niveau als setup() en loop(). Bij de definitie van een functie hoort er geen puntkomma achter.


nu laat ik het zo, zal er in het vervolg beter om denken, op dit moment een beetje teveel informatie in korte tijd.


3 )
Je hoeft niet steeds te kijken of 'i' nul is als je wilt wisselen tussen regel 1 en 3. Dit kan ook: int regel = 1 + 2 * i;

zelfde als 2)


4 )
Aan het begin van de loop() had je de 'currentMillis = millis()' kunnen zetten, en die overal gebruiken. Nu heb je een tweede 'current' toegevoegd.

ik dacht dat ik dan ook de accutimer zou beinvloeden, gebrek aan kennis mijn zijde, zal er nog eens mee gaan spelen.

5 )
Ik begrijp niet hoe dit onderdeel kan werken: if (current - backlightTime >= Timer). Werkt dat maar één keer bij het opstarten. En daarna is het niet na 10 seconden, maar willekeurig tussen 0 en 10 seconden ?

ik dacht het goed gedaan te hebben (blink without delay) ik had hier eerst delay gebruikt, maar vond dat niet netjes, display aan maar uitlezing stopt, (hier trouwens wel duidelijk wat je met de timer correctie doet in de code!).
maar :
als: current - backlightTime >= Timer, zet ik:
backlightTime = current;
digitalWrite(backlight, LOW);

wat doe ik hier Fout? (eea werkt wel, maar waarschijnlijk niet op juiste manier?


6 )
Het ontbreken van een '{' nadat je kijkt of de battery_state[i] == CHARGE, dat doet wel erg zeer aan mijn ogen. Ik denk zelfs dat het een code fout is. Volgens mij is dit de bedoeling:



Aangepast, een fout in de code ! (vreemd dat hij wel wekte?)



Nogmaals bedankt voor je comments, hier leer ik van!

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

Re: tijdschakelaar

Berichtdoor Koepel » 06 Nov 2016, 17:30

2 )
Dat lijkt me echt wel een fout.
Als je de code hier op het forum laat zien, zou je dan de knop "Code" of de drop-down "Select a Syntax" met C++ willen gebruiken ?
Dan kan ik zien of het inspringen en de haakjes kloppen.
Je kunt met Ctrl+T de tekst layout goed zetten, maar dan is het wel volgens de stijl die Arduino heeft ingesteld.

4 )
Als er geen (of hele korte) delays in de sketch zitten, dan kun je één currentMillis = millis() gebruiken voor de hele code binnen de loop(). Dat geeft duidelijkheid en het voorkomt dat millis() intussen 1 milliseconde verder tikt. Sommigen gebruiken geen currentMillis maar gaan een stuk of 10 keer millis() gebruiken in de code.
Dat is nauwelijks langzamer, maar dan moet ik opeens gaan nadenken wat er gebeurt als een millis() een milliseconde verder is dan de vorige millis().

5 )
Daar gebruik je millis() op een vreemde manier. En er zijn maar een handvol manieren waarop millis() goed werkt. Het is nu een soort interval, terwijl ik dacht dat je een tijdvertraging zou willen hebben.
Daarom vroeg ik of het display na 10 seconden uitgaat, of dat het na 0 tot 10 seconden uit gaat (afhankelijk van waar in het interval je zit op dat moment).
Ik weet eigenlijk niet wat je wilt.

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 98 gasten