tijdschakelaar

Arduino specifieke Software
Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar

Berichtdoor wim2584 » 20 Okt 2016, 20:34

hallo,

code met de array aangepast, outputs lijken nu goed te werken, wil echter eea ook volgen op Serial Print (en later via LCD display, maar dat id hetzelfde)

wat is het beste op de waarde van de betreffende output en / of input te printen?

Serial.println(digitalRead (2)); of Serial.println (digitalRead (PinUitgan[i])) werken Niet?




CODE:
// Example with software timer of 1 minute.
// That 1 minute software timer is the framework.
// Everything else is under that framework.

const int pinKnop[2] = { 8, 9};
const int pinUitgang[2] = { 2, 3};

enum state { WAIT, CHARGE }; // WAIT is 30 days waiting

long battery_count[2];
int battery_state[2] = { WAIT, WAIT};


// DEBUG: to test it, make the interval very short and the rest will go along.
unsigned long previousMillis;
unsigned long interval = 1000UL; // * 60UL; // 1 minute in milliseconds even 1000UL gemaakt voor test

const long TenHoursInMinutes = 10L; // * 60L; even 10L gemaakt voor test
const long ThirtyDaysInMinutes = 30L; // * 60L * 24L; even 30L gemaakt voor test


void setup()
{
Serial.begin( 9600);

for ( int i = 0; i < 2; i++)
{
pinMode (pinKnop[i], INPUT_PULLUP);
pinMode (pinUitgang[i], OUTPUT);
}
}

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

// Has one minute passed ?
if ( currentMillis - previousMillis >= interval)
{
// Special case: add the interval to keep time accurate.
// Normally it would be: previousMillis = currentMillis;
previousMillis += interval;

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

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] >= TenHoursInMinutes)
{
// 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] >= ThirtyDaysInMinutes)
{
// 30 days are over, start charging.
battery_state[i] = CHARGE;
battery_count[i] = 0; // reset counter
digitalWrite( pinUitgang[i], HIGH);
Serial.println(digitalRead (2));
}
}
}
}

Advertisement

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

Re: tijdschakelaar

Berichtdoor Koepel » 21 Okt 2016, 02:22

Je hebt nu mijn grote voorbeeld waar nog wel een en ander aan te verbeteren viel.

Ik had een eenvoudig voorbeeld gemaakt, waarbij ik alleen de knop had toegevoegd en de status van de led had losgeweekt.

Kun je vertellen wat je wilt ?
Het grote voorbeeld, maar dan met seconden (dat lijkt me handiger). Dus dan toch de paraplu van 1 seconde waar alles onder hangt.
Of het eenvoudige voorbeeld uitbreiden door alles dubbel te doen of met arrays.

Voor mij persoonlijk zou ik die paraplu doen, omdat ik dan een handige teller heb, dus dan kan ik ook ieder uur een melding naar de seriële monitor geven hoe lang het opladen al bezig is, of dat bijhouden op een LCD scherm.
Voor jouw is die bling-bling misschien niet nodig, en mijn voorstel is om het eenvoudige voorbeeld te doen met arrays.
Voor het tellen van het aantal laadcycli maakt het niet uit.

Je kunt een uitgang lezen met digitalRead(). Dat mag. Als je in een for-loop met 'i' zit, dan kun je dit doen:
Code: Alles selecteren
  Serial.print( digitalRead(pinUitgang[i]));

Ik zou echter gewoon de tekst uitprinten om te vertellen wat er gebeurt.
Dus op het moment dat het laden start, dan dit:
Code: Alles selecteren
  Serial.print(F( "Charging started !"));

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

Re: tijdschakelaar

Berichtdoor wim2584 » 21 Okt 2016, 15:23

Hallo Koepel,

ik ben nu overtuigd dat array's gebruiken makkelijker is , zeker bij het tellen.

maar Serial.print( digitalRead(pinUitgang[i])); , kreeg ik niet direkt iets op mijn scherm te zien...

ik zal eea nog eens gaan uitproberen.

Wat wil ik?

op display (ik denk een LCD display, misschien Oled maar heb hier slechte ervaring mee i.v.m. library geheugen verbruik...)

lader 1: wacht xx dag, (of laad xx h + cycle xx )

lader 1: wacht xx dag, (of laad xx h + cycle xx )

de rest van relais aansluiten kastje enz is geen probleem.

als ik weet hoe Serial print in een ARRAY, is het display (hoop ik ) ook geen probleem


Groet Wim

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

Re: tijdschakelaar

Berichtdoor Koepel » 21 Okt 2016, 19:57

Wil je de bling-bling sketch met een software timer van 1 minuut (of 1 seconde) als een soort paraplu waar de rest onder hangt, of wil je de basic sketch waarbij alles direct met millis() wordt gedaan ?

Kijk eens naar de code hieronder. De integer 'i' en 'j' zijn gewone integers. De integers k[0] tot en met k[3] zijn ook gewoon integers. Dat ze met een paar in een array zitten, dat maakt verder niet uit.
Code: Alles selecteren
int i,j;
int k[4];

i = 3;      // deze integer wordt 3
k[2] = 3;  // deze integer wordt 3

Het array is alleen handig als er meerdere keren hetzelfde moet worden gedaan, met bijvoorbeeld alleen een andere waarde voor de integer. Met 'i' en 'j' lukt dat niet, maar door gebruik te maken van de index met 'k[index]' lukt dat wel.

Stel je hebt pinMode(13,OUTPUT), dan is die pin een OUTPUT. Stel je gaat vervolgens die pin lezen met digitalRead(13), dan krijg je HIGH of LOW. Stel je gaat het getal van HIGH en LOW sturen naar de seriële monitor, dan is dat een '1' of een '0'. Dus op je scherm staat er ergens een '1' of een '0' tussen de rest. Niet zo interessant dus ;)

Als je een pin als uitgang zet, dan is de hardware in de chip voor de ingang nog steeds aanwezig en gewoon werkend. Eigenlijk is het circuit in de chip voor de ingang er altijd, en wordt alleen het circuit voor de uitgang er bij aangezet op diezelfde pin.

Ik probeer het lezen van uitgang te voorkomen, omdat ik het niet zo netjes programmeren vind. Je sketch heeft al de 'state' die al aangeeft of de uitgang aktief is of niet.

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

Re: tijdschakelaar

Berichtdoor nicoverduin » 21 Okt 2016, 20:23

Koepel schreef:Ik probeer het lezen van uitgang te voorkomen, omdat ik het niet zo netjes programmeren vind.
Volkomen gelijk. Bij de 32 bitters gaat het verhaal meestal niet meer op omdat er aparte invoer en uitvoer registers zijn.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: tijdschakelaar

Berichtdoor shooter » 21 Okt 2016, 20:24

@koepel: als je iets verder in dat in/uitgang verhaal duikt is het niet helemaal waar wat je zegt, maar voor het begin heb wel gelijk hoor.
paul deelen
shooter@home.nl

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

Re: tijdschakelaar

Berichtdoor wim2584 » 21 Okt 2016, 20:37

ik wil nu gaan voor de "paraplu"van 1 min (of sec).
dit omdat ik inmiddels overtuigd ben dat dit de beste oplossing is.

heb je nog goede ideeen hoe ik mijn programmeer kennis kan opkrikken?

bij boeken als arduino cook book en de A12 ROC van kompanje, lijkt het allemaal eenvoudig, totdat jezelf begint met geen/weinig ervaring in programmeren...

ik stam nog uit de dicrete elektronica tijdperk (Hef reeks / LM 317 / Lm747 enz) maar deze tijd is voorbij

gr Wim

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

Re: tijdschakelaar

Berichtdoor Koepel » 22 Okt 2016, 10:22

Okay, ik zal proberen iets te maken met een software timer van 1 seconde.

Ik kom nog uit de tijd dat je met je pantoffel op de Philips televisie moest slaan om weer beeld te krijgen :o

Hier staat alvast een oefening.
Code: Alles selecteren
// Arduino.cc 1.6.12, Arduino Uno

int mijnArray[3][6] =
{
  { 10,   11,   12,   13,   14,   15 },
  { -1,   -2,   -3,   -4,   -5,   -6 },
  { 100,  1213, 454,  1934, 823,  74 },
};

void setup()
{
  Serial.begin( 9600);
  Serial.println( "\nStarted");

  // Wijzig een waarde.
  mijnArray[1][3] = 4444;

  for( int rij=0; rij<3; rij++)
  {
    for( int kolom=0; kolom<6; kolom++)
    {
      Serial.print( mijnArray[rij][kolom]);
      Serial.print( ", ");
    }
    Serial.println();
  }
  Serial.println();
}

void loop()
{
}

In de sketch wijzig ik "mijnArray[1][3]". Weet je welke er wordt gewijzigd ?

Een index van een array begint bij 0. De grove onderverdeling komt eerst, dat zijn hier de rijen. De fijnere onderverdeling staat achteraan, dat zijn hier de kolommen.
Dus als je 5 planeten hebt, elk met 10 steden, en 50 straten per stad, en 3 huizen per straat, en 2 bewoners per huis. Dan kun je de leeftijd van elk persoon opslaan met dit: int leeftijd[5][10][50][3][2];

De index is niets anders dan "de zoveelste" van het array. Dus stel dat je een array hebt die 'buffer' heet, dan is buffer[0] de eerste en buffer[1] is de tweede, enzovoorts.

Een array hoeft geen integer te zijn, het kan van alles zijn. Een array kan met float getallen of met long, en zelfs met een object of een struct.

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

Re: tijdschakelaar

Berichtdoor Koepel » 22 Okt 2016, 12:08

De sketch heb ik uitgebreid met de knoppen en ik stuur iedere seconde de status naar de seriële monitor.

Kun je de batterij en de knoppen een naam geven ? Zoals "A" en "B" of "De Mijne" en "De Jouwe", of "Sparta" en "Gazelle", want een array index begint bij nul, dus het is erg verwarrend als je jouw accu nummer 1 en 2 geeft.

De software timer is nu 1 seconde, en de battery_counter is een unsigned long, omdat het veel beter is om zulke tellers een unsigned long te maken, vooral als ze met millis() te maken hebben.

In de functie "ShowEverything()" die de tekst laat zien, daar heb ik zomaar wat aangerommeld. Als je dat niet begrijpt, dan geeft het niet. Dat kan ook op een andere manier geschreven worden.

Laat de sketch maar draaien, en druk op een knop. Dan zie je dat ze onafhankelijk van elkaar werken.
cpp code
// For : viewtopic.php?f=8&t=2054
//
// Tested with Arduino.cc 1.6.12, Arduino Uno.
//
// This sketch uses a software timer of 1 second.

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

#define WAIT 0 // WAIT means 30 days waiting
#define CHARGE 1 // CHARGE means 10 hours charging

unsigned long battery_count[2]; // counter in seconds for both batteries
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()
{
Serial.begin( 9600);
Serial.println(F( "\nStarted"));

// 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"));
}

for( int i = 0; i < 2; i++)
{
pinMode( pinKnop[i], INPUT_PULLUP);
pinMode( pinUitgang[i], OUTPUT);
}
}


void loop()
{
// 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);
}
}
}

// -------------------------------------------------
// Do here other things that should run every second
// -------------------------------------------------

// Every second update to LCD display is okay,
// but for the serial monitor perhaps once per 5 seconds ?
// static int count5;
// count5++;
// if( count5 >= 5)
// {
// count5 = 0; // start again.
// ShowEverything();
// }
ShowEverything();
}


// -------------------------------------------------------------------
// Add things here that should be executed everytime the loop() runs.
// The use of a small delay() will not influence the 1 second software timer.
// A long delay now and then will also not influence the 1 second timer.
// -------------------------------------------------------------------

// check buttons and act.
// Add debounce later.
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();
}
}

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

Re: tijdschakelaar

Berichtdoor wim2584 » 22 Okt 2016, 18:49

De batterijen heten Rita en Wim
complilatie code liep vast op showEverything
ik zag dat jij IDE 16.12 gebruikt. ... ik zat mog op 16.5 zal eerdt upgraden en dan weer proberen

Alsvast bedankt

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: rigevwij en 18 gasten