blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik ben voor mijn ruis meetsetje bezig een deel van de besturing met een Arduino uit te voeren,
ik loop hier door gebrek aan kennis vast.
Na een zoektocht hoe toetsjes uit te lezen stuite ik op onderstaande code.
Dat leest de druktoetsjes op een wat meer inteligenter manier uit en stuurd een up/down counter.
Ik test dit op het ogenblik met 5 ledjes en twee druktoetsjes,
maar in mijn uiteindelijke toepassing gaat het om maar 3 uitgangen.
Als ik weet hoe het werkt, dan kan ik dit simpel aanpassen.
De volgende stap is b.v. 8 toetsjes uitlezen op een intelligente manier en dan hiermee relais of andere zaken sturen.
Op het ogenblik is er geen debounce aanwezig in de software, ik doe dit met een 4093 hardware matig.
De code moet dus uiteindelijk D4 tot D9 aanzetten op de Arduino dit afhankelijk van de teller stand.
Het gekke is dat de serieele monitor steeds met twee stapjes omhoog of omlaag gaat...
De counter gaat niet voorbij 1 of 5, dus dat is OK.
Alleen de uitgang waar "5" aan hangt gaat de LED van aan als de conter op 5 staat, bij 3 of 1 gaat de LED (uitgang) niet aan...
Natuurlijk heb ik ook al de Arduino Nano vervangen voor een andere.
Ziet iemand waar de fouten in deze code zitten of ben ik de fout? *grin*
// Variables That will change:
int count = 0; // counter for the number of button presses
int currentUpState = 0; // current state of the up button
int lastUpButtonState = 0; // previous state of the up button
int currentDownState = 0; // current state of the down button
int lastDownButtonState = 0; // previous state of the down button
int aVals [] = {51,102,153,204,255};
void setup() {
// initialize input/output:
pinMode(2, INPUT);
pinMode(3, INPUT);
for (int i = 4; i <= 9; i++) {
pinMode(i, OUTPUT);
}
Serial.begin(9600);
}
void loop() {
int countVal = 0;
currentUpState = digitalRead(2); // read the Up pushbutton input pin
if (currentUpState != lastUpButtonState) {
countVal = 1;
lastUpButtonState = currentUpState;
}
currentDownState = digitalRead(3); // read the Down pushbutton input pin
if (currentDownState != lastDownButtonState) {
countVal = -1;
lastDownButtonState = currentDownState;
}
if (countVal) {
count += countVal;
count = constrain(count,1,5);
Serial.print("Count: ");
Serial.println(count);
for (int i = 4; i < 9; i++) {
digitalWrite(i, i < count ? HIGH : LOW);
analogWrite(9, aVals[i-4]);
}
}
delay (30);
}Dank alvast voor de hulp.
Gegroet,
Blackdog
Progger
GMT+1
digitalWrite(i, i < count ? HIGH : LOW)
I begint bij 4, dus kan alleen als count 5 is een high opleveren.
I == (count -4) kan het oplossen.
Het dubbel tellen wordt veroorzaakt doordat je een verschil krijgt met de last_X_state bij het in drukken en bij het loslaten
Je moet je countval alleen aanpassen bij de gewenste actie.
currentUpState = digitalRead(2); // read the Up pushbutton input pin
if (currentUpState != lastUpButtonState) {
if( currentUpState == LOW ) // of HIGH al naar gelang behoefte
countVal = 1;
lastUpButtonState = currentUpState;
}
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi Progger,
Jij even als eerste, ik heb het op verschillende manieren geprobeerd.
Maar kan jij het voor mij goed in de desbetreffende regel zetten.
Ik heb het op een paar maniren geprobeerd maar de "Computer Says NO" dit vrij naar Little Brittain 
Dank,
Bram
Progger
GMT+1
Bram,
je wilt als I=1, dan D4 hoog, I=2 -> D5, enz..?
for (int i = 1; i <= 5; i++) { // count wordt door contstrain beperkt tussen deze waarden
digitalWrite(i+3, (i == count) ? HIGH : LOW);
analogWrite(9, aVals[i-4]);
}verder overschrijf je met analogwrite de uitgang D9!
in deze loop gebruik je 4..8. hiermee stel je de duty cycle in van een PWM signaal (0..255)
zoals je ziet is pin 9 een PWM uitgang..
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi, 
Mijn dank, ik heb de code aangepast zoals Progger en driessens_nl het aangaf.
Dit in stapjes en niet tegelijk want ik ben knap gaar op dit moment en staar me echt blind *grin*
De counter loopt nu mooi van LED-1 naar LED-5 en terug.
De pwm LED doet weinig, hij is aan of uit.
Wat ik ook nog probeer te bereiken is dat na een reset de eerste LED direct aan is.
Bij een reset zijn alle LED's uit en de PWM LED is ook uit.
Het maakt niet uit welek toets ik indruk na een reset, altijd gaat de 1e LED aan en de PWM LED.
Nadat de eerste LED aan is, werk het up/down gedeelte goed.
Waar kan ik nu het beste aangeven dat bij het opstarten de eerste LED altijd brand?
Dit is nu de code
// Variables That will change:
int count = 0; // counter for the number of button presses
int currentUpState = 0; // current state of the up button
int lastUpButtonState = 0; // previous state of the up button
int currentDownState = 0; // current state of the down button
int lastDownButtonState = 0; // previous state of the down button
int aVals [] = {51,102,153,204,255};
void setup() {
// initialize input/output:
pinMode(2, INPUT);
pinMode(3, INPUT);
for (int i = 4; i <= 8; i++) {
pinMode(i, OUTPUT);
}
Serial.begin(9600);
}
void loop() {
int countVal = 0;
currentUpState = digitalRead(2); // read the Up pushbutton input pin
if (currentUpState != lastUpButtonState) {
if( currentUpState == LOW ) // of HIGH al naar gelang behoefte
countVal = 1;
lastUpButtonState = currentUpState;
}
currentDownState = digitalRead(3); // read the Down pushbutton input pin
if (currentDownState != lastDownButtonState) {
if( currentDownState == LOW ) // of HIGH al naar gelang behoefte
countVal = -1;
lastDownButtonState = currentDownState;
}
if (countVal) {
count += countVal;
count = constrain(count,1,5);
Serial.print("Count: ");
Serial.println(count);
for (int i = 1; i <= 5; i++) { // count wordt door contstrain beperkt tussen deze waarden
digitalWrite(i+3, (i == count) ? HIGH : LOW);
analogWrite(9, aVals[i]);
}
}
//delay (30);
}Gegroet,
Blackdog
Je counter loopt van 1 t/m 5, maar je initialiseert de counterwaarde aan het begin met 0. Dit moet 1 zijn om bij 1 te beginnen ( je kan ook bij 3 beginnen als je dat leuk vindt).
Verder wordt de PWM uitgang pas gezet bij een counter verandering dus moet je ook de PWM uitgang bij initialisatie zetten.
De PWM uitgang moet je pas zetten als de leds goed hebt gezet adh van de counter , dit moet dus buiten de for loop
// Variables That will change:
int count = 1; // ==== WAS 0 ===== // counter for the number of button presses
int currentUpState = 0; // current state of the up button
int lastUpButtonState = 0; // previous state of the up button
int currentDownState = 0; // current state of the down button
int lastDownButtonState = 0; // previous state of the down button
int aVals [] = {51,102,153,204,255};
void setup() {
// initialize input/output:
pinMode(2, INPUT);
pinMode(3, INPUT);
for (int i = 4; i <= 9; i++) {
pinMode(i, OUTPUT);
}
Serial.begin(9600);
analogWrite(9, aVals[count-1]); // ZET PWM BIJ INITIALISATIE
}
void loop() {
int countVal = 0;
currentUpState = digitalRead(2); // read the Up pushbutton input pin
if (currentUpState != lastUpButtonState) {
countVal = 1;
lastUpButtonState = currentUpState;
}
currentDownState = digitalRead(3); // read the Down pushbutton input pin
if (currentDownState != lastDownButtonState) {
countVal = -1;
lastDownButtonState = currentDownState;
}
if (countVal) {
count += countVal;
count = constrain(count,1,5);
Serial.print("Count: ");
Serial.println(count);
for (int i = 4; i < 9; i++) {
digitalWrite(i, i < count ? HIGH : LOW);
// analogWrite(9, aVals[i-4]);
}
analogWrite(9, aVals[count-1]); // DENK DAT JE DE PWM adh COUNTER WILT WEERGEVEN
}
delay (30);
}
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi Marco,
Deze waarde was het eerste wat ik teste om bij resetde eerste LED uitgang "1" te krijgen => int count = 1;
Dit werkt dus niet zoals verwacht...
Wat er gebeurd is dit, alle 5 LED's blijven uit en als ik dan een toets indruk b.v "down" toets, dan gaat de eerste LED aan.
Druk ik nu na een reset op de "up" toets, dan gaat LED 2 aan.
Gegroet,
Blackdog
Progger
GMT+1
ja, de instinker is dit:
if (countVal) {
omdat countVal een integer is, en if() een boolean wil, krijg je de situatatie dat zowel -1 als +1 boolean TRUE zijn, en 0 is false.
dus de code
count = constrain(count,1,5);
Serial.print("Count: ");
Serial.println(count);
for (int i = 1; i <= 5; i++) { // count wordt door contstrain beperkt tussen deze waarden
digitalWrite(i+3, (i == count) ? HIGH : LOW);
analogWrite(9, aVals[i]);
}wordt enkel uitgevoerd nadat countval wijzigt. dan wordt count bijgewerkt (count += countVal;) en worden de uitgangen ge-update.
je zal dus de bovenstaande code in een aparte funtie kunnen zetten, die je een keer tijdens je void setup() aanroept.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Progger, zoals ik het lees, is dat juist de bedoeling. countval blijft nul dus GEEN veranderingen dus geen print en zo. als countval -1 of 1 is, wordt wel de verandering geprocessed.
Alleen in
digitalWrite(i, i < count ? HIGH : LOW);
wil ik extra haakjes.
digitalWrite(i, (i < count) ? HIGH : LOW);
Voor je het weet maakt ie er van:
digitalWrite(i, i < (count ? HIGH : LOW));
Met dat vraagteken ding, erg uitkijken met evaluatie prioriteiten. Niets aan het toeval overlaten.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Morge Heren, 
Ik heb graag compacte code, en wat ik bij elkaar heb geraapt van het Internet werkt nu met jullie hulp.
Mijn dank hiervoor.
Ik worstel nog steeds met mijn dyslexie wat ik soms als hel ervaar
en natuurlijk een gebrek aan kennis betreffende programmeren maar daar werk ik aan.
Er zijn drie boeken onderweg dat het leren hopelijk zal verbeteren/versnellen.
De PDF's die ik van twee van deze boeken heb, vind ik niet prettig leesbaar voor het leren,
dus de PDF's gaan voor de zoekfunctie dienen 
Een van de boeken heb ik ook afgedrukt, die zitten nu in drie mapjes, dat is ook niet prettig leesbaar...
Deze oude man lees/leert het beste uit gewone boeken,
zou dat de leeftijd zijn of is het gewoon het meest efficiente systeem wat leren betreft 
Uitgang-1
Voor nu is een simpel stukje code onder de setup voldoende om de eerste uitgang aan te zetten zoals dit: digitalWrite(4, HIGH);
Maar dat doet niets met de counter, dit resulteerd in twee maal drukken op de "up" toets voor het in sync is.
Dit is werkbaar maar niet netjes 
Waar ik voor een aantal meetinstrumenten naar toe wil is dit.
een redelijk aantal drukknoppen waarvan een aantal een up/down counter gaan aanstuuren een aantal die direct relais en/of LED's aansturen en dan op een manier van klik aan klik uit en uitgangen die b.v. een puls geven van 0,2 seconde om een bipolair relais even aan te sturen.
Mijn vraag aan jullie (ik heb daar al naar gezocht om iets vergelijkbaars te vinden) is de bovenstaande code
een goed uitgangspunt om schakelaars uit te lezen of kan ik dit beter anders gaan aanpakken?
Progger
Ik begrijp wat je bedoeld te zeggen over de code die bij de setup sectie moet komen om de functionaliteit
te krijgen die ik wens, maar heb echt geen idee hoe dit te doen.
Ik ga vandaag al ik nog wat tijd over heb, eerst de vergelijkingen die in de code zit goed te grokken.
Maar nu eerst en Router en Accesspoint configgen met VLAN's 
Gegroet,
Blackdog
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Op 14 augustus 2016 11:25:35 schreef blackdog:
is de bovenstaande code
een goed uitgangspunt om schakelaars uit te lezen of kan ik dit beter anders gaan aanpakken?[/i]
Volgens mij is ie al beter dan dat JIJ denkt. 
Je zegt bijvoorbeeld iets over debouncen. Zoals die code nu in mekaar zit debounced dat in de software heel aardig. Als ie 10ms nadendert na het maken van het contact, dan merkt je software daar niets van omdat ie reageert op de eerste keer dat het signaal aanwezig is en dan 30ms lang nooit meer naar dat ding kijkt!
Ik zelf vind het overzihtelijk om
#define BUTTON_IS_PRESSED(btn) (digitalRead(btn) == 0)
#define BTN_UP 2
#define BTN_DOWN 3
te programmeren. Maar voor een beginner in deze (en dat ben ik zelf soms ook nog!) is het niet fijn om met allerlei substituties te werken terwijl je de basis nog aan het leren bent.
Dus ik kan me nog herinneren dat ik redelijk recent al dat soort defines er uit heb gegooid en direct met constanten aan de gang ben gegaan omdat ik even twijfelde aan of de defines wel uitkwamen op wat er in het datasheet staat.
Verder vind ik het prettig om als je meerdere buttons hebt iets te doen met een "buttons" variabele. Dus alle buttons zet je in 1x in een variabele en dan is if (cur_buttons != old_buttons) een makkelijke test of er iets moet gebeuren.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Nog even voor ik andere dingen ga doen...
Ik heb de code zover kunnen krijgen zodat hij nu doet wat ik wil.
Dit staat nu in de setup.
digitalWrite(4, HIGH);En bij de variabelen heb ik bij het declareren van de variabel "count" de waarde op 1 gezet i.p.v. "0"
int count = 1;Dit geeft nu het gedrag wat ik wil na een reset, dus eerste LED aan en bij het drukken op de "up" knop gaat hij direct naar LED-2,
BINGO Bram kan naar het volgende probleem 
Dat is het probleem, dat ik de analoge waarde niet in een begin stand krijg.
Het grootste probleem voor mij is denk ik, dat ik de setup en gebruik van de aVals niet kan doorgronden.
int aVals [] = {20,102,153,204,255};aVals kan dus de waarde aannemen van "20,102,153,204,255" dus willekeurige waarde tussen 0 en 255.
Dit zijn 5 waarden i.v.m. de 5 waarden van de up/down counter.
Maar hoe aan de hand van de waarde van de teller wordt er gekozen voor welke de waarde van aVals...
Onderstaande code heb ik in de setup geplaatst, maar werkt niet de pwm uitgang blijft "0" na een reset
analogWrite([b]9[/b], aVals[count]); // ZET PWM BIJ INITIALISATIEEn weer BINGO!
Ik had tekst gecopieerd en had gisteren de de PWM al op poort 11 gezet dus die code hierboven die naar poort 9 verwijst,
kan niet werken, de muts die ik ben 
Gegroet,
Blackdog
int aVals [] = {20,102,153,204,255};
Hier wordt aVals als array gedeclareerd. Hier is niet meer sprake van een enkele variabele aVals maar een tabel met 5 int's:
aVal[0] = 20, aVal[1] = 102, aVal[2] = 153, aVals[4] = 204 en aVal[4] = 255.
aVal[5] valt buiten de array. Werkt wel maar geeft de waarde van de eerstvolgende variabele en dat is niet de bedoeling.
Voor de besturing van mijn dubbele voeding ben ik uiteindelijk uitgekomen op 2 rotary encoders met schakelaar. Geen drukknopjes meer nodig. Ook het idee om een potmeter te gebruiken om een digitale waarde in te stellen heb ik uiteindelijk laten varen.
Ik gebruik de ene rotary om een funktie te kiezen:
- Voltage Ch1
- Current Ch1
- Voltage CH2
- Current CH2
- Callibreren CH1 ADC
- Callibreren CH2 ADC
...
Set timer
...
etc
De tweede rotary gebruik ik dan om een analoge waarde in te stellen.
Dus als Rotary-1 op 'Voltage ch1' staat dan kan ik met rotary-2 de spanning instellen.
Rotary-2 kan gewoon als draaischakelaar gebruikt worden. Links/rechts draaien geeft increment/decrement van de in te stellen waarde. Maar om een groot instel-bereik te krijgen kan ik ook de resolutie instellen met Rotary-2 :
Schakelaar indrukken:
- Kies resolutie 1 mV / 10 mV / 100 mV / 1 V / 10V
Nog een keer schakelaar indrukken:
- Instelwaarde aanpassen met gekozen resolutie.
Dat geeft voor mij de beste user interface zonder al te veel hardware. Hiermee wil ik mijn voeding aansturen met 2 uitgangen met gemeenschappelijke massa.
Te gebruiken als gewone voeding, maar ook als batterij lader (uitschakelen na x mAh), en als curve tracer (Spanning instellen tussen 0 en x, en bijbehorende stroom meten). En ook kan ik de uitgangsspanning gaan moduleren met een 100 Hz rimpel om te zien hoe een test schakeling daarop reageert.
De potmeter methode valt voor mij af omdat het voor mij niet intuïtief is om veranderende getallen in het display te volgen en daaruit af te leiden waar dat naar toe gaat en hoelang dat nog duurt.
En ook de methode om de draaisnelheid van een rotary encoder te gebruiken om de resolutie aan te passen (grotere stappen bij sneller draaien) werkt voor mij niet echt lekker.
Werken met een rotary encoder waarmee je ook de resolutie kunt kiezen is voor mij de beste interface.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi deKees,
Dank voor je input.
Dat de 5 waarden in de variabele aVals "hangen" had ik begrepen.
Het kwartje valt nog niet betreffende de code die gebruik maakt van de waarde die in aVals hangen.
Het gaat al beter de code te begrijpen van deze up/down counter.
Ik heb er nu ook een toon functie in hangen die als het middelste LED brand even een burst van 440Hz geeft op een zoemer, van 0,2 seconde.
Hiervoor heb ik een library gebruikt want de toon functie die er standaard in zit geeft rare bij effecten.
Dan even wat opmerkingen betreffende de rotary encoders.
Het is mooi dat je een manier gevonden hebt die bij jou past as interface voor je voeding, dat vind ik belangrijk om prettig met een apparaat te werken 
Kunne we betreffende je rotary code dit in het andere topic verder gaan.
Ik heb je code nog niet verder aangepast, het is een beetje rommelig hoe ik de laatste twee weken te werk ga maar ik ga er zeker nog gebruik van maken en verder testen.
Wil je de code die je nu gebruikt delen met ons?
Ik ben al blij met wat je nu al hebt laten zien en het inzicht 
rew
Ik heb de hardware debouncing even verwijderd uit mijn up/down counter (twee poorten van de 4093) en je hebt gelijk, ik heb geen last van het denderen van de contacten.
Verder gisteren nog gezocht naar een manier om meer contacten uit te lezen met minder pennen van de Arduino.
Ik kwam natuurlijk uit bij een i2c IC van Microchip, maar ook bij dit filmpje van Kevin Darrah.
https://www.youtube.com/watch?v=1Vb2BpxPnjU
Laters meer hierover.
Gegroet,
Blackdog
Jochem
If you want to succeed, double your failure rate.
Meerdere buttons kun je ook doen door elke button met een unieke weerstand in serie aan een analoge ingang (ADC) te hangen. Je gebruikt dan maar 1 pin, maar je kunt de verschillende buttons onderscheiden door de uitgelezen waarde. Kies je de weerstanden een beetje handig, dan kun je met gemak 16 knoppen op die ene pin kwijt.
Als je ook meerdere simultaan ingedrukte knoppen wilt kunnen onderscheiden moet je de waardes van de weerstanden goed kiezen. Met een R-2R ladder en 1% weerstanden zou je op die manier toch zeker 4 buttons op 1 pin moeten kunnen zetten (=16 combinaties).
Ik vond dit via Google, waarin ze beschrijven wat ik bedoel: Deel 1 en deel 2 (voor multi-button support).
Verder is (voor mij) hét voordeel van de Arduino dat er zoveel mensen mee bezig zijn en er dus een hoop libraries zijn waardoor je het wiel niet opnieuw uit hoeft te vinden en "even snel" iets kunt maken. Voor debouncen gebruik je gewoon de Bounce2 library en vaak grijp ik voor het gemak naar de r89m Buttons library waar dat debouncen voor r89m PushButtons al ingebouwd zit (onder water gebruikmakend van Bounce2).
Genoemde libraries zijn allemaal met een simpele klik vanuit de Arduino IDE te installeren. Waarom het wiel opnieuw uitvinden?
Het is mij niet helemaal duidelijk waar die aVal voor dient. Maar hier gaat het wel mis denk ik:
for (int i = 1; i <= 5; i++) { // count wordt door contstrain beperkt tussen deze waarden
digitalWrite(i+3, (i == count) ? HIGH : LOW);
analogWrite(9, aVals[i]);
}
Hier wordt in een loop alle leds aangezet, en tegelijk de corresponderende waarde uit aVals naar pin 9 geschreven. Dus bij elke druk op de knop doorloopt pin 9 alle 5 waarden uit aVals om uiteindelijk uit te komen op aVals[5] (die dus niet bestaat).
Ik denk dat het de bedoeling is om pin 9 de waarde te geven van de zojuist gekozen count. Dan moet AnalogWrite buiten de loop en count als index in aVals. Maar count loopt van 1 naar 5, en aVals loopt van 0 tot 4, dus daar moet je nog voor corrigeren:
// Eerste alle lampjes aan/uit zetten.
for (int i = 1; i <= 5; i++) { // count wordt door contstrain beperkt tussen deze waarden
digitalWrite(i+3, (i == count) ? HIGH : LOW);
}
// Dan de Pwm kiezen.
analogWrite(9, aVals[count - 1]);
Dan wordt Pin 9 = 20 bij count=1, 102 bij count=2, etc
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Ha die Jochem, 
De analoge ingang truc kon ik al.
De library die je aangeeft nog niet, dank je hiervoor.
Gisteren een uurtje gezocht op hoe je meerdere knopjes aan een arduino kan knopen als je aansluitingen te kort hebt.
Hier zijn dus meerdere oplossingen voor en een paar zijn er hier al aangegeven.
Nog een andere is de Arduino Due, kost iets meer, rond de 12 Euro en heeft 2x een 12bit DAC en Analoge ingangen die redelijk 12Bit zijn.
Prachtig om een voeding te sturen 
Verder aansluitingen zat.
Dus vele mogelijkheden en vanaag komt als het goed is twee versies van de Teensy binnen.
Als het enigzins kan, gebruik ik hardware debounce, dan kan de processor verder doen waar hij goed in is 
En er zijn nog een aantal redenen waarom het soms beter is een extra IC te gebruiken.
Hier een plaatje als voorbeeld, dit heb ik al eens laten zien denk ik.
De componenten waarden zijn zo gekozen dat voor een normale drukknop goed werkt.
Wel je een rotary encoder debouncen (die zijn vaak slecht) en je wilt snel draaien en toch goed werken.
Speel dan met de condensator van de ingang naar massa, een redelijk bereik is tussen 10nF en 0,1uF, voor een goede debounce.
Ik heb nog wat meetgegevens hierover, maar die staan op een ander werkstation, dus nu even niet voorhanden.
Maar het is voor mij geen "wet van Meden en Perzen" betreffende debounce, pas de manier toe die bij het ontwerp past.
Ik ga in ieder geval eens spelen met de "r89m Buttons library" lijkt me handig.
Update
Tijdens het typen werden de Teensy printjes afgeleverd
Mooi, nu weer geld verdienen.
Gegroet,
Blackdog
Jochem
If you want to succeed, double your failure rate.
Als het enigzins kan, gebruik ik hardware debounce, dan kan de processor verder doen waar hij goed in is
Wel geinig, ik zou zeggen dat die processor daar reuze goed in is, en dat je dus geen extra hardware nodig hebt 
Maar als je externe hardware gebruikt en een schakelaar naar ground zoals in jouw schema, dan zet ik zelf nog weleens een (schottky) diode over R2(/R3) (met de kathode richting de inverter). Maakt je switch net even wat responsiever.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi Jochem,
De truc met de diode ken ik, de schakeling zoals hij hier staat werd in een industrie omgeving veel toegepast.
Hij is zeer robuust voor stoorsignalen van buiten af door de filtering.
Gebruik je de schakeling in een apparaat zelf, dan kan je wat robuustheid opgeven voor snelheid zoals de door jou voorgestelde diode.
Met de diode ben je b.v. bij lange leidingen, weer gevoelig voor sterke HF velden.
Dus ook hier weer, pas toe wat goed is voor de schakeling die je ontwerpt.
Het bedrijf waar ik vroeger werkte gebruikte veel schakel materiaal van EAO, wat goed materiaal is,
er was dan weinig debounce nodig maar door de lange leidingen gebruikte wij dan toch vaak de hier aangegeven standaard schakeling.
deKees
De code die ik nu gebruik werkt goed, geen rare zaken, teld mooi op en af, ook de start condities werken goed.
Dat betekend niet dat ik vind dat je ongelijk hebt! 
Want dat zou inhouden dat ik al voldoende kennis van zaken heb van de code en dat is zeker niet zo.
Is er een mogelijkheid, om zeg met de seriele monitor jouw stelling te testen en hoe doe ik dit dan?
Gegroet,
Blackdog
Die laatste aanpassingen die ik hierboven voorstelde hebben geen effect op het al dan niet op- en aftellen, en ook niet op de aansturing van de LED's. Dat lijkt nu inderdaad allemaal goed te gaan.
Het is de aansturing van de PWM op Pin 9 waar nog wat mankeert. Met bovenstaande aanpassingen kun je met de knopjes kiezen welke waarde uit aVal naar de PWM gaat.
Testen met de seriële monitor is altijd bijzonder nuttig, doe ik (bijna) altijd als ik geen debugger voorhanden heb. Dan moet je zien wat je wilt weten, en daarop de code aanpassen.