switch case help

Arduino specifieke Software
Berichten: 14
Geregistreerd: 09 Mrt 2013, 00:00

switch case help

Berichtdoor bauer1 » 10 Nov 2013, 00:28

hallo,

wie wil een newbie uitleggen hoe je switch case kunt gebruiken
ik heb volgend geval ik heb 2 temp sensors die een bepaalde ingestelde temperatuur moeten bewaken (settemp) en daar een pomp of verwarming element op moeten sturen, dat gaat prima maar nu wil ik het volgende:

na een bepaalde ingestelde tijd moet de settemp veranderen in een hogere temperatuur dit moet zich enige malen herhalen.

mijn idee is om bij een bepaalde tijdwaarde verschillende cases te gebruiken bijvoorbeeld Tijd1 , Tijd 2 etc.
dus bijvoorbeeld case 1 Tijd < tijd 1 ==settemp1, case 2 tijd1 < Tij <Tijd 2 == settemp2 etc.

hoe doe ik dit correct en kan ik de tijd bijhouden door millis om te zetten naar minuten?

wat ik tot nu geschreven (vooral gejat) heb:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
int ledm =7; // led is at pin 7
int ledr =6;
// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int backLight = 13; // pin 13 will control the backlight

// Data wire is plugged into pin 8 on the Arduino
#define ONE_WIRE_BUS 8

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.


DeviceAddress maischpan = { 0x28, 0xD2, 0x9F, 0x63, 0x03, 0x00, 0x00, 0x90 };
DeviceAddress retourleiding = { 0x28, 0x1B, 0xAB, 0x63, 0x03, 0x00, 0x00, 0x02 };

void setup(void)
{
// Start up the library
sensors.begin();
// set the resolution to 10 bit
sensors.setResolution(maischpan, 10);
sensors.setResolution(retourleiding, 10);
//float Settemp = 25;
pinMode (ledm, OUTPUT);
pinMode (ledr, OUTPUT);
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
}

void printTemperature(DeviceAddress deviceAddress)
{
float Settemp = 25;
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
//lcd.print("/");
//lcd.print(DallasTemperature::toFahrenheit(tempC));
}
{
float tempC = sensors.getTempC(maischpan);
if (tempC >23.00)
{digitalWrite (ledm, HIGH);}
else
{digitalWrite (ledm, LOW);}
}
{
float tempC = sensors.getTempC(retourleiding);
if (tempC > Settemp)
{digitalWrite (ledr, HIGH);}
else
{digitalWrite (ledr, LOW);}
}
}

void loop(void)
{
delay(5000);
sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("maisch: ");
printTemperature(maischpan);
lcd.setCursor(0,1);
lcd.print("retour: ");
printTemperature(retourleiding);
}


bedankt,

Nico

Advertisement

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

Re: switch case help

Berichtdoor shooter » 10 Nov 2013, 10:31

je maakt dus timers met millis() ipv delay (dit stopt het programma)
ergens begin je met een tijd dat doe je met een startknop.
if (startknop) {starttijd=millis()}
periode=0
timer1
if (millis()-starttijd > timer1set){periode=1)
timer2
if (millis()-starttijd > timer2set){periode=2)

case periode
1:
settemp=settemp1
2:
settemp=settemp2
etc
paul deelen
shooter@home.nl

Berichten: 14
Geregistreerd: 09 Mrt 2013, 00:00

Re: switch case help

Berichtdoor bauer1 » 13 Nov 2013, 23:47

Hoi,

Dank je wel voor je input,

ben druk bezig geweest met je tips maar loop nu vast..

ik heb wel eens een startbutton geschreven maar na een loop commando nu moet ie er voor en gaat het mis..
suggesties?
//This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Tutorial:
// http://www.hacktronics.com/Tutorials/ar ... orial.html

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
int ledm =7; // led is at pin 7 (to be relay pump)
int ledr =6; // to be relay heater
int SettempX = 25;// begin temp 25C variable for settemp
int Periode = 1;
int Maischtijd1 = 10000;//60000=1 min
int Maischtijd2 = 10000;
int Maischtijd3 = 10000;
int kPinButton1 = 2;//startbutton
long Starttijd;
// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int backLight = 13; // pin 13 will control the backlight

// Data wire is plugged into pin 8 on the Arduino
#define ONE_WIRE_BUS 8

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);



DeviceAddress maischpan = { 0x28, 0xD2, 0x9F, 0x63, 0x03, 0x00, 0x00, 0x90 };
DeviceAddress retourleiding = { 0x28, 0x1B, 0xAB, 0x63, 0x03, 0x00, 0x00, 0x02 };

void setup(void)
{
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(maischpan, 10);
sensors.setResolution(retourleiding, 10);


pinMode (ledm, OUTPUT);
pinMode (ledr, OUTPUT);
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
unsigned long Starttijd;
Starttijd = millis();
pinMode(kPinButton1, INPUT);
digitalWrite(kPinButton1, HIGH); //high is std vallue port


}

void printTemperature(DeviceAddress deviceAddress)
{
float Settemp= SettempX;
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
}
{
float tempC = sensors.getTempC(maischpan);
if (tempC > Settemp)
{digitalWrite (ledm, HIGH);}
else
{digitalWrite (ledm, LOW);}
}
{
float tempC = sensors.getTempC(retourleiding);
if (tempC > Settemp + 5) //HLT to be 5C hotter than Maisch
{digitalWrite (ledr, HIGH);}
else
{digitalWrite (ledr, LOW);}
}
}

// timer part
int buttonState = 0;

//Hier gaat het mis....
// read the state of the pushbutton value:

buttonState = digitalRead(kPinButton1);
// check if the pushbutton is pressed. if it is, the buttonState is LOW:
if (buttonState == LOW){Starttijd = millis();}
Periode=1;
//timer1
{
if (millis()-Starttijd > Maischtijd1){Periode=2;}
//timer2
{
if (millis()-Starttijd > Maischtijd2){Periode=3;}
//timer 3
{
if (millis()-Starttijd > Maischtijd3){Periode=4;}
}

void loop(void)
{
delay(5000);
sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("maisch: ");
printTemperature(maischpan);
lcd.setCursor(0,1);
lcd.print("retour: ");
printTemperature(retourleiding);
}


alvast bedankt

Nico

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

Re: switch case help

Berichtdoor nicoverduin » 14 Nov 2013, 00:53

Hoewel het mij niet erg duidelijk is wat je precies met die periodes wilt, maar dit kan?
Code: Alles selecteren
//This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Tutorial:
// http://www.hacktronics.com/Tutorials/ar ... orial.html

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
int ledm = 7; // led is at pin 7 (to be relay pump)
int ledr = 6; // to be relay heater
int SettempX = 25; // begin temp 25C variable for settemp
int Periode = 1;
int Maischtijd1 = 10000; //60000=1 min
int Maischtijd2 = 10000;
int Maischtijd3 = 10000;
int kPinButton1 = 2; //startbutton
long Starttijd;
// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int backLight = 13; // pin 13 will control the backlight

// Data wire is plugged into pin 8 on the Arduino
#define ONE_WIRE_BUS 8

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

DeviceAddress maischpan = { 0x28, 0xD2, 0x9F, 0x63, 0x03, 0x00, 0x00, 0x90 };
DeviceAddress retourleiding = { 0x28, 0x1B, 0xAB, 0x63, 0x03, 0x00, 0x00, 0x02 };

void setup(void) {
// Start up the library
   sensors.begin();
// set the resolution to 10 bit (good enough?)
   sensors.setResolution(maischpan, 10);
   sensors.setResolution(retourleiding, 10);

   pinMode(ledm, OUTPUT);
   pinMode(ledr, OUTPUT);
   pinMode(backLight, OUTPUT);
   digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
   lcd.begin(16, 2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
   lcd.clear(); // start with a blank screen
   unsigned long Starttijd;
   Starttijd = millis();
   pinMode(kPinButton1, INPUT);
   digitalWrite(kPinButton1, HIGH); //high is std vallue port

}

void printTemperature(DeviceAddress deviceAddress) {
   float Settemp = SettempX;
   float tempC = sensors.getTempC(deviceAddress);
   if (tempC == -127.00) {
      lcd.print("Error");
   } else {
      lcd.print(tempC);
   }
   float tempC = sensors.getTempC(maischpan);
   if (tempC > Settemp) {
      digitalWrite(ledm, HIGH);
   } else {
      digitalWrite(ledm, LOW);
   }
   float tempC = sensors.getTempC(retourleiding);
   if (tempC > Settemp + 5) //HLT to be 5C hotter than Maisch
         {
      digitalWrite(ledr, HIGH);
   } else {
      digitalWrite(ledr, LOW);
   }
}

void loop(void) {
   delay(5000);
   // timer part
   int buttonState = digitalRead(kPinButton1);
   // check if the pushbutton is pressed. if it is, the buttonState is LOW:
   if (buttonState == LOW) {
      Starttijd = millis();
   }
   Periode = 1;
   //timer1
   if (millis() - Starttijd > Maischtijd1) {
      Periode = 2;
   }
   //timer2
   if (millis() - Starttijd > Maischtijd2) {
      Periode = 3;
   }
   //timer 3
   if (millis() - Starttijd > Maischtijd3) {
      Periode = 4;
   }

   sensors.requestTemperatures();
   lcd.setCursor(0, 0);
   lcd.print("maisch: ");
   printTemperature(maischpan);
   lcd.setCursor(0, 1);
   lcd.print("retour: ");
   printTemperature(retourleiding);
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 14
Geregistreerd: 09 Mrt 2013, 00:00

Re: switch case help

Berichtdoor bauer1 » 14 Nov 2013, 13:15

nico bedankt,

ik zie dat je de button in de loop hebt opgenomen.
(soms kan de oplossing zo eenvoudig zijn)

naar aanleiding van je opmerking mbt de perioden: die komen in het vervolg, ik heb nu de temperatuur afvraag en weergave,de pomp en heater besturing en de tijds bewaking
volgende stap wordt de switch case waar aan de periodes verschillende Settemp hangen.

zo kom ik steeds een stapje verder en leer ik steeds een beetje C

mvg

Nico

Berichten: 14
Geregistreerd: 09 Mrt 2013, 00:00

Re: switch case help

Berichtdoor bauer1 » 07 Dec 2013, 23:13

hallo,

ik ben een stuk verder (weinig tijd gehad) maar loop weer vast

1. ondanks dat geen startknop gedrukt is verspringt de periode wel, blijkbaar telt de vergelijking de millis zonder starttijd maar ik zie niet waar.
2.na het drukken van de startknop loopt het schema (zie ser. monitor) maar bij case4: moet de settemp 100 worden, dat leest de monitor, maar de temperatuur regeling doet hier niets mee.... komt dat doordat deze buiten de loop staat? en hoe pas ik dat aan?
ook als ik de 2 led's Low maak in case 4 reageert de regeling hier niet op.

iemend een paar slimme hints?

zie sketch:
//This Arduino sketch reads DS18B20 "1-Wire" digital
// temperature sensors.
// Tutorial:
// http://www.hacktronics.com/Tutorials/ar ... orial.html

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
int ledm =7; // led is at pin 7 (to be relay pump)
int ledr =6; // to be relay heater
int SettempX = 23;// begin temp 25C variable for settemp
int Periode = 00;
int Maischtijd1 = 120000;//60000=1 min
int Maischtijd2 = 90000;
int Maischtijd3 = 90000;
int kPinButton1 = A2;//startbutton analoog2
long Starttijd;
// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int backLight = 13; // pin 13 will control the backlight

// Data wire is plugged into pin 8 on the Arduino
#define ONE_WIRE_BUS 8

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);



DeviceAddress maischpan = { 0x28, 0xD2, 0x9F, 0x63, 0x03, 0x00, 0x00, 0x90 };
DeviceAddress retourleiding = { 0x28, 0x1B, 0xAB, 0x63, 0x03, 0x00, 0x00, 0x02 };

void setup(void)
{
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(maischpan, 10);
sensors.setResolution(retourleiding, 10);


pinMode (ledm, OUTPUT);
pinMode (ledr, OUTPUT);
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.
lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
unsigned long Starttijd;
Starttijd = millis();
pinMode(kPinButton1, INPUT);
digitalWrite(kPinButton1, HIGH); //high is std vallue port
Serial.begin (9600);


}

void printTemperature(DeviceAddress deviceAddress)
{
float Settemp= SettempX;
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
}
{
float tempC = sensors.getTempC(maischpan);
if (tempC > Settemp)
{digitalWrite (ledm, HIGH);}
else
{digitalWrite (ledm, LOW);}
}
{
float tempC = sensors.getTempC(retourleiding);
if (tempC > Settemp + 5) //HLT to be 5C hotter than Maisch
{digitalWrite (ledr, HIGH);}
else
{digitalWrite (ledr, LOW);}
}
}

// timer part
int buttonState = 0;
// read the state of the pushbutton value:

void loop (void)
{
buttonState = digitalRead(kPinButton1);
// check if the pushbutton is pressed. if it is, the buttonState is LOW:
if (buttonState == LOW){Starttijd = millis();}
Periode=1;
//timer1
{
if (millis()> (Starttijd + Maischtijd1)){Periode=2;}
//timer2
{
if (millis()> (Starttijd + Maischtijd2 + Maischtijd1)){Periode=3;}
//timer 3
{
if (millis()> (Starttijd + Maischtijd2 + Maischtijd1 + Maischtijd3)){Periode=4;}
//periode 4 alles is klaar
// todo eindtijd stop alles
}

delay(5000);
sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("maisch: ");
printTemperature(maischpan);

Serial.println("Periode:");
Serial.println (Periode);
//printTemperature(maischpan);
lcd.setCursor(0,1);
lcd.print("retour: ");
printTemperature(retourleiding);

Serial.println("settempX:");
Serial.println (SettempX);

Serial.println("buttonState:");
Serial.println(buttonState);
Serial.println("Starttijd:");
Serial.println(Starttijd);
//printTemperature(retourleiding);
}
}
//}

switch (Periode) {
case 1:
Periode=1; (SettempX = 23);
break;
// break is optional
case 2:
Periode=2; (SettempX = 24);
break;
case 3:
Periode=3; (SettempX = 25);
break;
case 4:
Periode=4; (SettempX= 100);
digitalWrite (ledm, LOW);
digitalWrite (ledr, LOW);
break;

}
}

Berichten: 108
Geregistreerd: 07 Aug 2013, 21:34

Re: switch case help

Berichtdoor KrisG » 08 Dec 2013, 01:24

De voorwaarden voor je if statement kloppen niet, als je lang genoeg wacht worden ze allemaal voldaan.
Ik antwoord even snel mobiel, vandaar ook niet uitgebreid.
Kris.
Als je het probleem gedetailleerd genoeg omschrijft, heb je meestal al de oplossing.

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

Re: switch case help

Berichtdoor nicoverduin » 08 Dec 2013, 01:29

Hij zal in deze structuur altijd verspringen. Immers starttijd is een variabele en heeft altijd een waarde.
Dat 2e punt zou best eens het gevolg van het eerste zijn.

Verder een paar tips:
-sloop alle overbodige accolades eruit
-Als je een sketch hier neer zet, zet deze dan tussen de code blokken (zie code buttons bij volledige reactie pagina)
-Sloop alle overbodige haakjes eruit.
- formatteer je code (daar is een menu optie voor in de IDE).

Dit alles maakt de sketch leesbaarder en nodigt anderen om ook meer support te geven. Nu kan ik eerst die hele sketch gaan herstructureren om het leesbaar te maken........

Tenslotte:
millis() is een teller die continu doorloopt totdat hij bij 2^32 komt dan begint hij opnieuw.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 14
Geregistreerd: 09 Mrt 2013, 00:00

Re: switch case help

Berichtdoor bauer1 » 10 Dec 2013, 19:56

heren, bedankt voor jullie input,

ik zal eens kijken of ik het if statement kan aanpassen
een volgende keer zal ik proberen de tekst tussen de code blokken te zetten

ik snap alleen nog steeds niet waarom bij case 4 de settempX geen invloed heeft op de regeling

nico

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

Re: switch case help

Berichtdoor nicoverduin » 10 Dec 2013, 21:26

Ik ook niet, maar ik heb geen zin om eerst die code helemaal te fatsoeneren om inzicht te krijgen in het programma.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 14 gasten