keuzeschakelaar

Arduino specifieke Software
Berichten: 4
Geregistreerd: 11 Sep 2015, 21:41

keuzeschakelaar

Berichtdoor DPF » 11 Sep 2015, 22:40

Hallo allemaal,



Ik ben bezig met een blaas/zuig schakelaar voor kinderen met een spierziekte.
Deze kunnen ze gaan gebruiken om diverse dingen straks aan te sturen, bv een muziek instrument of een spelcomputer.

Ik gebruik hiervoor een Arduino Nano in combinatie met een mpxv7025 en 3 potmeters.
Met 2 potmeters stel ik de druk/vacuum in de ander gebruik ik om de pulstijd in te stellen.
Zodra de vacuum waarde is bereikt schakelt er een uitgang en ook wanneer de druk waarde is bereikt schakelt er een uitgang.

Tot zover geen probleem.

Nu wil ik graag met een 4 standen schakelaar meerdere functies gaan selecteren.

1- off delay ( vacuum/druk valt weg --> uitgang 0-2sec HOOG )
2- puls delay ( vacuum/druk Hoog --> uitgang 0-2sec HOOG )
3- On/Of (vacuum uitgang A Hoog / druk uitgang B HOOG )
4- kort/lang ( kort blazen uitgang A / Lang blazen uitgang B )

Het programma wat ik nu heb geschreven is met functie 1. Dus zodra vacuum wegvalt blijft uitgang A een bepaalde tijd hoog net als bij Druk uitgang B hoog blijft.
De andere 3 functies gaan ook wel lukken denk ik, maar mijn probleem is nu hoe ga ik met die keuze om?

Hoe kan ik dus in het programma een keuze schakelaar verwerken.
Ik weet gewoon even niet hoe ik nu verder moet.

Het is mijn eerste projekt dus sta open voor comentaar op mijn sketch ook.



int outputValue; // value output Sensor
int vacume = 2; // Vacuum output to pin D2
int pressure = 3; // Pressure output to pin D3
int Preset = 4; // Reset
int stand0 = 5; // Keuzeschakelaar (0) =
int stand1 = 6; // Keuzeschakelaar (1) = off delay
int stand2 = 7; // Keuzeschakelaar (2) = puls delay
int stand3 = 8; // Keuzeschakelaar (3) = On/Of
int stand4 = 9; // Keuzeschakelaar (4) = Short pulse = Output A (Vacume) /Long pulse = Output B (Pressure)
int ZeroPoint;

void setup () // run once, when the sketch starts
{

Serial.begin(9600); // open the serial port at 9600 bps:

pinMode (2, OUTPUT); // D2 = OUTPUT
pinMode (3, OUTPUT); // D3 = OUTPUT
pinMode (4, INPUT); // D4 = INPUT
pinMode (stand0, INPUT); // D5 = INPUT
pinMode (stand1, INPUT); // D6 = INPUT
pinMode (stand2, INPUT); // D7 = INPUT
pinMode (stand3, INPUT); // D8 = INPUT
pinMode (stand4, INPUT); // D9 = INPUT


ZeroPoint = analogRead(A0); // Read A0 and set as zero callibration


}

void loop(){ // run over and over again


//Set Pulse Delay Vacume & Pressure


int pulseValue; // variable pulseValue
pulseValue = analogRead(A3); // Read analog A3 and set as pulseValue
pulseValue = map(pulseValue, 0, 1023, 0, 1500); // Scale pulseValue 0-1023 to 0-1500



//Read and scale Analog Pressure Switch

int sensValue; // variable pressure value
sensValue = analogRead(A0); // read analog A0 (pressure switch) and set as sensValue
outputValue = map(sensValue , 200, 823, 0, 1023); // Scale Analog sensValue 25-850 to 255-0 and set as outputValue 25,850,255,0



//Vacume output

int Vadjust; // variable Vacume value
Vadjust = analogRead(A1); // Read analog A1 (pot1) and set as Vadjust
Vadjust = map(Vadjust, 0, 1023, 1, 45); // Scale Analog sensValue 0-1023 to 0-40 and set as outputValue

if (outputValue <= ZeroPoint-Vadjust) { // If sensValue is <= (ZeroPoint - Vadjust)
digitalWrite (vacume, HIGH); // write Vacume output High
delay(pulseValue); // Time delay off Vacume Output (D2)
}
else{
digitalWrite (vacume,LOW); // Else write Vacume output Low
}


// Pressure output

int Padjust; // variable Pressure value
Padjust = analogRead(A2); // Read analog A2 (pot2) and set as Padjust
Padjust = map(Padjust, 0, 1023, 1, 45); // Scale Analog sensValue 0-1023 to 0-40 and set as outputValue

if (outputValue >= ZeroPoint+Padjust) { // If sensValue is >= (ZeroPoint - Padjust)
digitalWrite (pressure, HIGH); // write Pressure output High
delay (pulseValue); // Time delay off Pressure Output (D3)
}
else{
digitalWrite (pressure,LOW); // Else write Pressure output Low
}

Advertisement

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

Re: keuzeschakelaar

Berichtdoor shooter » 12 Sep 2015, 18:02

maak een schema van wat je wilt, je programmern is wel goed, maar in de loop staat ook de calibratie en dat is niet goed.
maak een functie voor elk ding
en je keuzeschakelaar kan met een case.
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 11 Sep 2015, 21:41

Re: keuzeschakelaar

Berichtdoor DPF » 15 Sep 2015, 22:51

Hoi Paul,

Bedankt voor de tip! Dat is precies wat ik zocht.
Ik denk dat ik nu een heel eind kom.

Wat bedoel je met in de loop staat ook calibratie?
Die kalibratie was bedoeld om bij het opstarten te kijken wat de sensor waarde is, om die vervolgens als nulpunt te gebruiken.
De gedachte was dat de druk misschien nog wel eens kan variëren (weersomstandigheden bv)
Eventueel kan ik later dit ook nog met een drukknop gaan kalibreren, mocht dat nodig zijn.

Ik laat je weten of het is gelukt met het " switch case " commando.

Vr.gr
Peter

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

Re: keuzeschakelaar

Berichtdoor shooter » 16 Sep 2015, 23:27

in de loop is niet slim want als er geblazen wordt er ook gecalibreert dus in een functie zetten
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 11 Sep 2015, 21:41

Re: keuzeschakelaar

Berichtdoor DPF » 18 Sep 2015, 20:01

Misschien begrijp ik niet precies wat je bedoelt Paul.
Maar zoals ik het in gedachten had lees ik de sensor uit in de setup en gebruik deze waarde als mijn ZeroPoint.
Vervolgens gebruik ik deze als referentie in de loop.

Alleen bij een eventuele reset wordt het zeropoint weer opnieuw bepaald

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

Re: keuzeschakelaar

Berichtdoor shooter » 21 Sep 2015, 09:46

ja is wel goed sorry,
kijk eens naar case, daar kun je dus afhankelijk van hoe een schakelaar staat diverse routes aflopen, (vergeet de break niet).
dat zou ik trouwens ook doen bij de toestand van de drukschakelaar,
dus een routine maken waar je de druk bekijkt, en dan een een waarde terugsturen vanuit de functie die weergeeft hoe de druktest is afgelopen (kort/lang druk/vacuum)

de volgende is om niet met delay te werken maar met blink without delay te bekijken, dan kun je ondertussen namelijk nog andere dingen doen, alhoewel voor een eerste projekt is delay een veilige en amkellijke methode om te testen.
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 11 Sep 2015, 21:41

Re: keuzeschakelaar

Berichtdoor DPF » 26 Sep 2015, 14:54

Je hebt me erg geholpen met de SWITCH CASE functie, ik geloof dat ik dat nu aardig onder de knie heb.
Ik kan nu met een schakelaar 6 verschillende functies selecteren.
Het is de bedoeling dat de gebruiker straks zelf via de schakelaar kan selecteren hoe ze de drukschakelaar gaan gebruiken.
Dit hoef ik dus niet af te leiden uit het gedrag van de druksensor. misschien was mijn inleidend verhaal niet helemaal duidelijk.

Ik kom er nu inderdaad achter dat de functie DELAY voor een hoop problemen zorgt.

Bij de functie Puls Delay bv daar loop ik nu even vast.
Zodra de druk een bepaalde waarde heeft bereikt moet er iets gebeuren en na een bepaalde tijd pas weer stoppen. In die tijd maakt het niet meer uit wat er met de druk gebeurd.

Als ik nu Case 2 selecteer zie ik de LED (aangesloten op pressure) heel flauw branden, bij de andere functies is dit niet het geval.
de functie doet verder niets.



case 2:

//Set Pulse Delay Vacume & Pressure

pulseValue = analogRead(A3); // Read analog A3 and set as pulseValue
pulseValue = map(pulseValue, 0, 1023, 0, 3000); // Scale pulseValue 0-1023 to 0-1500



//Read and scale Analog Pressure Switch


sensValue = analogRead(A0); // read analog A0 (pressure switch) and set as sensValue
outputValue = map(sensValue , 200, 823, 0, 1023); // Scale Analog sensValue 25-850 to 255-0 and set as outputValue 25,850,255,0


// Pressure output


Padjust = analogRead(A2); // Read analog A2 (pot2) and set as Padjust
Padjust = map(Padjust, 0, 1023, 1, 45); // Scale Analog sensValue 0-1023 to 0-40 and set as outputValue

if (outputValue >= ZeroPoint + Padjust){ // If sensValue is >= (ZeroPoint - Padjust)
int presState = HIGH;
}
else {
int presState = LOW;
}

if (presState = HIGH){
digitalWrite (pressure, HIGH);
delay (pulseValue);
digitalWrite (pressure, LOW);
delay, 200;
}
else{
digitalWrite (pressure, LOW);
}

break;

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

Re: keuzeschakelaar

Berichtdoor shooter » 26 Sep 2015, 18:06

tja je zet de led even aan en dus zie je hem zwak.
oplossing is een minimum waarde waarboven pas de led high gezet wordt
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 99 gasten