Switch case vraagje

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Switch case vraagje

Berichtdoor hazanovo » 13 Okt 2016, 01:20

Hallo,

hoe kan ik een int als een case gebruiken.
Wie kan mij helpen!!!!


void switchTemp2(){


tempSwitchWaarde=tempWaarde * 100; tempWaarde hier is een float

const int temperatura=1900; //..............................................<<<<Zo lukt het wel maar ik kan dat niet veranderen via een lcd


switch(tempSwitchWaarde){

case 1910: //..........................................<<<<<<<<<<<<<<<<<<<<<<<hier wil ik een int gebruiken ipv 1910 dus bijv als het 25graden dat ik dan niet het programma moet aanpassen
Serial.println("19.10 graden");//............................................ maar alleen een int. Alles is afleesbaar via een lcd en ik heb knoppen om deze int hoger of lager te maken.
//.................................................................. Het lukt wel met een const int...maar die kan ik niet meer veranderen dan
break;

case temperatura+20: //............................................ <<<<< dit is de bedoeling. Maar ik wil de "temperatura" kunnen veranderen via lcd. kan natuurlijk met tientallen case 1900tm2500
Serial.println("19.20 graden"); .//............................................ maar er moet toch een makkelijker manier zijn......


break;//................................................Dat ik uiteindelijk maar 10 cases heb 0.00 t/m 0.90 is dan afleesbaar en de "0" wil ik veranderen

case 1930:
Serial.println("19.30 graden");

break;

}

}

Advertisement

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

Re: Switch case vraagje

Berichtdoor Koepel » 13 Okt 2016, 04:37

Dat gaat niet.
De switch-case statement werkt met vaste waarden.
Het is uitgebreid met een range, maar dat is het wel zo'n beetje.
Code: Alles selecteren
switch( x)
{
  case 0:
    break:
  case 1 ... 8:
    break:
  case 9:
    break:
  default:
    break;
}


Het alternatief is een if-else-if
Code: Alles selecteren
if( x == 0)
{
}
else if( x == y + 25)
{
}
else if( x == 125)
{
}
else
{
}

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Switch case vraagje

Berichtdoor hazanovo » 13 Okt 2016, 17:39

Heeft arduino ook een limiet op die ifjes en elsjes? Of kan je er probleemloos 50 van die if else statement in de loop zetten ?

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

Re: Switch case vraagje

Berichtdoor shooter » 13 Okt 2016, 17:52

dit moet je anders oplossen door een berekening te maken en die om te zetten naar een INT.
het printen kun je beter oplossen met het formateren van je tekst.

omdat je in de case alleen met constanten kunt werken zul je eerst een berekening moeten maken om naar de juiste case te gaan.
zet dit in een aparte functie die je in de loop aanroept, dan hou je overzicht.
probeer delen van je programma niet groter te maken dan op 1 bladzijde past.
en nee een const kun je niet veranderen als je dat weghaalt gaat het wel, en kun je het ook gebruiken om een case te kiezen. maar de cases zelf moeten wel constanten zijn.
paul deelen
shooter@home.nl

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

Re: Switch case vraagje

Berichtdoor Koepel » 13 Okt 2016, 19:42

hazanovo schreef:Heeft arduino ook een limiet op die ifjes en elsjes?

Je kunt er zoveel gebruiken als je wilt, totdat de flash van de microcontroller vol is. Van mij mag je er duizend gebruiken.

Weet je wat het XY-probleem is ? Dat is dit : http://xyproblem.info/

Ik kan me niet voorstellen dat je 50 totaal verschillende dingen wilt doen bij 50 verschillende temperaturen.
Dus misschien kan de structuur van de sketch beter.

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Switch case vraagje

Berichtdoor hazanovo » 13 Okt 2016, 20:53

Ik gebruik er wel meer dan 50 alleen niet voor de tempratuur.
Voor de tempratuur heb ik er 4 nodig. Het is een dc motor die
een 1k pot aan de eind as heeft. Die verdeel ik dan in 4 posities. Hij open vervolgens een klep. 1 is dicht, 4 is open. De rest is voor om de klep een stukje open te zetten, om de tempratuur constant te houden. Dit allemaal icm een ventilator die de ruimte koelt.
temp bereikt is klep dicht. Temp te hoog klep open vent aan. Temp 0.10-0.30 te hoog dan gaat de klep 1 stap open en voert de ventilator de snelheid op. Na 1 minuut als de temp weer 0.10 hoger is, dan gaat de klep weer een stand verder open en de vent gaat ook sneller draaien. Totdat de temp een te hooge waarde heeft waarna de vent op volle toeren gaat en de klep op stand open.
Mijn sketch werkt met Time.h en Alarm library. In de loop zit een constante delay v 100ms om de tijd bij te houden. Accelstepper kan niet samen met die delay, en servo.h blijkbaar ook niet.
Met stappenmotor was ik allang klaar geweest zonder die delay...nu moet het met een pot servo.

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Switch case vraagje

Berichtdoor hazanovo » 13 Okt 2016, 20:57

Ik kan het natuurlijk veel simpeler maken door een aantal schakelaars te plaatsen. Maar het is veel leuker en interessanter om het met een homemade servo te doen :))

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

Re: Switch case vraagje

Berichtdoor Koepel » 13 Okt 2016, 21:27

Dan zou ik met if-statements werken, en dan met float getallen voor de temperatuur.

Bij 0.10 tot 0.30 erboven:
Code: Alles selecteren
float t1, t2;
if( t1 > t2 + 0.10 && t1 < t2 + 0.30)
{
}


Een delay in je loop() voor de tijd ? Dat kan niet nauwkeurig zijn. Dat kan beter met millis().
Ik noem dat vaak een "software timer". Het gebruik van millis() begint hier: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Deze AccelStepper ? http://www.airspayce.com/mikem/arduino/AccelStepper/
Lost die alle problemen op ?

Kun je de code laten zien, en vertellen hoe snel elk onderdeel moet werken ?

Berichten: 59
Geregistreerd: 19 Mrt 2015, 01:17

Re: Switch case vraagje

Berichtdoor hazanovo » 13 Okt 2016, 21:47

posNummer word gelezen door A3, dat is de pot van de motor
klepPosition is een positie waar posNummer moet stoppen
tempWaarde is de echte temperatuur
buttoPushCounter is de tempratuur die gehandhaafd moet worden
klepSpeed is motor PWM
driver is L293D
ventState wordt gebruikt bij een andere waarde die niet van toepassing is bij de ventilatie rules
open=4
dicht=1

ik kan je niet de gehele code uploaden dat zijn een aantal bladzijdes vol.


Hier onder zie je de ventilation Rules:


if (tempWaarde > buttonPushCounter + 0.30) {



analogWrite(ventilator, 255);
analogWrite(ventilator2, 255);

analogWrite(klepSpeed, 150);



ventState = HIGH;

if (posNummer == Open) {
analogWrite(klepSpeed, 0);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, LOW);
}

else if (posNummer > Open) {
analogWrite(klepSpeed, 150);
digitalWrite(motorBackward, HIGH);
digitalWrite(motorForward, LOW);
}

else if (posNummer < Open) {
analogWrite(klepSpeed, 150);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, HIGH);
}



posNummer = analogRead(posRead);
posNummer = map(posNummer, 50, 950, 0, 7);

hours = hour();
minutes = minute();
}

//__________________________________________________________________________

else if (tempWaarde < buttonPushCounter - 0.30) {



analogWrite(ventilator, 100);
analogWrite(ventilator2, 100);

analogWrite(klepSpeed, 150);


ventState = HIGH;


if (posNummer == dicht) {
analogWrite(klepSpeed, 0);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, LOW);
}

else if (posNummer > dicht) {
analogWrite(klepSpeed, 150);
digitalWrite(motorBackward, HIGH);
digitalWrite(motorForward, LOW);
}

else if (posNummer < dicht) {
analogWrite(klepSpeed, 150);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, HIGH);
}





posNummer = analogRead(posRead);
posNummer = map(posNummer, 50, 950, 0, 7);

hours = hour();
minutes = minute();
}

else if (tempWaarde == buttonPushCounter) {



analogWrite(ventilator, 100);
analogWrite(ventilator2, 100);

analogWrite(klepSpeed, 150);



ventState = HIGH;


if (posNummer == 1) {
analogWrite(klepSpeed, 0);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, LOW);

}


else if (posNummer > 1) { //backward== - forward== +
analogWrite(klepSpeed, 150);
digitalWrite(motorBackward, HIGH);
digitalWrite(motorForward, LOW);
}

else if (posNummer < 1) {
analogWrite(klepSpeed, 150);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, HIGH);
}

posNummer = analogRead(posRead);
posNummer = map(posNummer, 50, 950, 0, 7);
hours = hour();
minutes = minute();

}

//_____________________________________________________________________________

else if (tempWaarde > buttonPushCounter + 0.10){

ventSpeed+15;


analogWrite(klepSpeed, 150);
analogWrite(ventilator, ventSpeed);
analogWrite(ventilator2, ventSpeed);
if (posNummer > klepPosition) {
digitalWrite(motorBackward, HIGH);
digitalWrite(motorForward, LOW);
}
else if (posNummer < klepPosition) {
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, HIGH);
}

else if (posNummer == 4) {
analogWrite(klepSpeed, 0);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, LOW);
}
else if (posNummer == 1) {
analogWrite(klepSpeed, 0);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, LOW);
}

else if (posNummer == klepPosition) {
analogWrite(klepSpeed, 0);
digitalWrite(motorBackward, LOW);
digitalWrite(motorForward, LOW);
klepAuto==LOW;

}

posNummer = analogRead(posRead);
posNummer = map(posNummer, 50, 950, 0, 7);
}


de code werkt wel. alleen zou het veel makkelijker zijn met accelstepper. Maar die kan absoluut niet met delay werken.



dit is de TimeAlarms.h

dit staat gewoon in de loop samen met de ventilation rules

Alarm.alarmRepeat(read5uur, read6min, 0, redOn);
Alarm.alarmRepeat(read7uur, read8min, 0, blueOn);

Alarm.delay(100); < zonder dit werkt de alarm niet

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

Re: Switch case vraagje

Berichtdoor Koepel » 13 Okt 2016, 22:12

Een paar bladzijden code, dat is voor ons geen probleem hoor. Je kunt het misschien als zip bestand toevoegen.

De bedoeling van de TimeAlarms library is dat de Arduino delay() vervangen wordt door Alarm.delay(). Als er een alarm is, dan wordt die betreffende functie vanuit de Alarm.delay() aangeroepen.

Het nadeel is, dat je sketch gedurende die 100ms niet andere code kan uitvoeren.

De oplossing is Alarm.delay(0) ;
In de beschrijving wordt dat vermeld: https://www.pjrc.com/teensy/td_libs_TimeAlarms.html

De oplossing is om de "update" dingen, zoals Alarm.delay(0) en misschien ook voor AccelStepper bij iedere loop() uit te voeren. Met "update" dingen bedoel ik ook kijken of er iets van de Serial of Ethernet available is.
De code die bijvoorbeeld 50 keer per seconde, of 1 keer per seconde wordt uitgevoerd, kun je binnen een software timer met millis() plaatsen.

Heb je Blink Without Delay al bekeken ?

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten