Sketch 5 druktoetsen uitlezen

Arduino specifieke Software
Berichten: 4
Geregistreerd: 07 Okt 2016, 08:56

Sketch 5 druktoetsen uitlezen

Berichtdoor Johan62 » 11 Feb 2017, 13:35

Hallo mijn naam is Johan,

Ik heb een printje gemaakt met vijf druktoetsen (en verschillende weerstandwaarden).
De waarden van de ingedrukte toetsen kan je uitlezen door middel van een sketch die beschreven staat in een artikel van "Instructables" (How to acces 5 buttons through 1 Arduino input)
Het probleem is dat dit beschreven staat als "tmp" bestand en dat ik hem daardoor niet kan openen.
Nu is mijn vraag , is er iemand die dit programaatje werkend heeft en dit met mij wilt delen?

Groeten Johan.

Advertisement

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

Re: Sketch 5 druktoetsen uitlezen

Berichtdoor Koepel » 11 Feb 2017, 14:24

Hallo, welkom op dit forum.

Wij (vooral ik ;) ) hebben graag links naar dingen die je noemt of producten die je gebruikt.

Ik kan bijvoorbeeld kiezen uit deze twee:
1 ) http://www.instructables.com/id/How-to-access-5-buttons-through-1-Arduino-input/
2 ) http://www.instructables.com/id/Accessing-5-buttons-through-1-Arduino-pin-Revisi/

Als ik de eerste neem, dan zijn daar twee sketches te vinden:
1 ) Reading_with_debounce_test.pde
2 ) Reading_with_debounce.pde

Laat ik de tweede eens nemen. Dat is inderdaad raar :? er komt een .tmp bestand uit. Kun je dat in het Kladblok openen ?
Kun je in de Arduino IDE een nieuwe sketch openen, die stuk of 9 regels die er dan staan weghalen, vervolgens alles van dat tmp bestand er in kopiëren, en dan de sketch opslaan en een naam geven ?

Gebruik je Arduino IDE 1.8.1 ? (de versie staat bovenaan in de titelbalk).

Kun je misschien iets beters gaan gebruiken ? Natuurlijk is het mogelijk om met een analoge ingang 5 knoppen in te lezen. Maar echt handig is het niet en het heeft consequenties. Wanneer je te weinig pinnen hebt, dan is het eenvoudiger om een Arduino Mega 2560 te gaan gebruiken, die heeft meer dan 50 pinnen.

Voor de volledigheid, dit is de sketch:
cpp code
/* 
Debounce

Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
press), the output pin is toggled from LOW to HIGH or HIGH to LOW. There's
a minimum delay between toggles to debounce the circuit (i.e. to ignore
noise).

created 28 October 2009
by Riaan Cornelius


*/

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 0; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin for testing

const int BUTTON1 = 1;
const int BUTTON2 = 2;
const int BUTTON3 = 3;
const int BUTTON4 = 4;
const int BUTTON5 = 5;

const int BUTTON1LOW = 970;
const int BUTTON1HIGH = 1024;
const int BUTTON2LOW = 850;
const int BUTTON2HIGH = 950;
const int BUTTON3LOW = 700;
const int BUTTON3HIGH = 800;
const int BUTTON4LOW = 400;
const int BUTTON4HIGH = 650;
const int BUTTON5LOW = 250;
const int BUTTON5HIGH = 350;

// Variables will change:
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers

void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}

void loop() {
// read the state of the switch into a local variable:
int reading = analogRead(buttonPin);
int tmpButtonState = LOW; // the current reading from the input pin

if(reading>BUTTON5LOW && reading<BUTTON5HIGH){
//Read switch 5
tmpButtonState = BUTTON5;
}else if(reading>BUTTON4LOW && reading<BUTTON4HIGH){
//Read switch 4
tmpButtonState = BUTTON4;
}else if(reading>BUTTON3LOW && reading<BUTTON3HIGH){
//Read switch 3
tmpButtonState = BUTTON3;
}else if(reading>BUTTON2LOW && reading<BUTTON2HIGH){
//Read switch 2
tmpButtonState = BUTTON2;
}else if(reading>BUTTON1LOW && reading<BUTTON1HIGH){
//Read switch 1
tmpButtonState = BUTTON1;
}else{
//No button is pressed;
tmpButtonState = LOW;
}

// check to see if you just pressed the button
// (i.e. the input went from LOW to a buttonState), and you've waited
// long enough since the last press to ignore any noise:

// If the switch changed, due to noise or pressing:
if (tmpButtonState != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}

if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
buttonState = tmpButtonState;
Serial.println(buttonState);
}

// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonState = tmpButtonState;

// set the LED using the state of the button for testing:
switch(buttonState){
case BUTTON1:
digitalWrite(ledPin, buttonState>0);
break;
case BUTTON2:
digitalWrite(ledPin, buttonState>0);
break;
case BUTTON3:
digitalWrite(ledPin, buttonState>0);
break;
case BUTTON4:
digitalWrite(ledPin, buttonState>0);
break;
case BUTTON5:
digitalWrite(ledPin, buttonState>0);
break;
}
}

Ik zie op Instructables.com nogal vaak slechte Arduino code. Helaas ben ik ook niet tevreden over deze code.
Het gebruik van millis is verkeerd (geen unsigned long). Het gebruik van digitalWrite() is zeer curieus met een conditie voor HIGH of LOW (buttonState > 0). De buttonPin zou ik 'A0' maken en niet '0'. De 'tmpButtonState' kan verschillende waarden hebben, maar ook LOW. Dat zijn twee verschillende dingen die worden samengevoegd. Het werkt, maar het is niet correct programmeren.

Berichten: 4
Geregistreerd: 07 Okt 2016, 08:56

Re: Sketch 5 druktoetsen uitlezen

Berichtdoor Johan62 » 11 Feb 2017, 15:04

Koepel,

Allereerst bedankt voor je hulp, ik kreeg het niet voorelkaar om de sketch te openen en had al van alles geprobeerd.
Moet ook eerlijk bekennen dat ik nog niet zo lang bezig ben met de Arduino materie.
Ik heb de afgelopen tijd een 3D printer gemaakt (Multimaker cloone) deze werkt naar tevredenheid en ik maak er leuke kleine dingetjes mee.
Daardoor ontstond de interesse naar de wereld van de Arduino.
Ik heb een Arduino Uno (zo'n chinese cloon) waar ik de druktoetsen op wil laten draaien.
Wat ik er mee wil doen weet ik nog niet maar kwam laatst een artikel tegen van iemand die het gebruikt op een modeltrein forum en dacht dat het makkelijk was om (later)eventueel een menu mee te maken.
Ik begreep niet hoe hij aan de uitgelezen waarden kwam tot ik deze sketch tegen kwam.
De Arduino versie die ik gebruik is IDE 1.8.1.
Nogmaals dank, ik kan nu weer een stapje verder met ontdekken :lol:

Groet, Johan.

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

Re: Sketch 5 druktoetsen uitlezen

Berichtdoor Koepel » 11 Feb 2017, 15:29

Wanneer je een Arduino wilt inbouwen in iets dat je gemaakt hebt met de 3D printer, dan is de "Pro Micro" handig.
https://www.aliexpress.com/item/Free-Shipping-New-Pro-Micro-for-arduino-ATmega32U4-5V-16MHz-Module-with-2-row-pin-header/2040881593.html
In de Arduino IDE kun je gewoon "Arduino Micro" selecteren.
Dat board heeft een USB connector, dus je kunt het meteen aansluiten. En er zitten toch nog vrij veel pinnen op.
Het is lastiger dan de Arduino Uno, omdat er een half-zachte usb-serial verbinding in zit. Maar in Windows werkt dat vrijwel altijd goed.

Wanneer je een modeltrein (storing) met zulke knoppen (gevoelig voor storing) en een menu (lastig te maken) gaat combineren, dan is dat meer iets voor gevorderden :geek:
Het is misschien beter om met iets eenvoudigs te beginnen, bijvoorbeeld met ledjes in een vorm gemaakt met semi-transparant filament of met een temperatuursensor :D

Berichten: 4
Geregistreerd: 07 Okt 2016, 08:56

Re: Sketch 5 druktoetsen uitlezen

Berichtdoor Johan62 » 11 Feb 2017, 18:39

Koepel,

Bedankt voor de tip, ik denk dat ik op m'n werk maar is op zoek ga naar mede experimenteerders.... tenslotte weten we met z'n allen meer :idea:

Groet Johan

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

Re: Sketch 5 druktoetsen uitlezen

Berichtdoor shooter » 11 Feb 2017, 23:31

ik mis de resets van de leds
verder is buttonstate=LOW niet juist beter is 0 gebruiken.

met deze waarden kun je maar 1 knop tegelijk gebruiken, er zijn ook versies waarbij je een analoge ladder gebruikt.dan kun je dus 5 leds aanzetten.

soms heb je inderdaad een tekstding nodig ik gebruik graag notepad plusplus.
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 07 Okt 2016, 08:56

Re: Sketch 5 druktoetsen uitlezen

Berichtdoor Johan62 » 12 Feb 2017, 19:07

Shooter,
Bedankt voor de navolging , ik ga er mee aan de slag.

Groet Johan.
Laatst gewijzigd door Johan62 op 12 Feb 2017, 19:12, in totaal 1 keer gewijzigd.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: azojonovebo, ebaqamu en 17 gasten