arduino temperaturstyring

PID regulator, styringer og programmer.
Besvar
Lillelund
Indlæg: 62
Tilmeldt: 6. nov 2014, 20:13

arduino temperaturstyring

Indlæg af Lillelund »

Hej Medbryggere.

jeg sidder og leger med en arduino, jeg har lavet en styring der måler temperaturen hvis den er under setpunkt tænder den varmen/output til næste setpunkt er nået, det samme gælder for køling, kort sagt samme funktion som en STC 1000.

jeg har koblet et display på der viser temperaturen samt om varme eller køling er aktiv. http://www.ebay.com/itm/310575296583?_t ... EBIDX%3AIT" onclick="window.open(this.href);return false;

nu kommer problemet: jeg vil gerne kunne justere setpunkterne via nogle trykknapper! jeg havde forestillet mig 3 trykknapper.
1. trykknap aktiverer ''redigeringsmode'' og kan også bruges til at steppe imellem de 4 setpunkter (varme start, varme stop, Køling start, køling stop)
2. trykknap bruges til at steppe værdien af valgte setpunkt op.
3. trykknap bruges til at steppe værdien af valgte setpunkt ned.

håber der er en der har et eksempel på hvordan det gøres/eller et link til et sted det er beskrevet.
Hvis der er andre/simplere måder at gøre det på modtages alt med kyshånd (dog køber jeg ingen STC-1000).

Højt skum: Søren
Brugeravatar
admin
Site Admin
Indlæg: 4754
Tilmeldt: 4. dec 2005, 16:25
Geografisk sted: 7080 Børkop

Re: arduino temperaturstyring

Indlæg af admin »

mit korte svar er nimbus39 ;) hvis du ikke ved hvad jeg mener må du vente og se ;)

Sendt fra min SM-G920F med Tapatalk
Mvh.
Jens
Øl og sol er livet....

http://www.fribryg.dk" onclick="window.open(this.href);return false;
http://www.facebook.dk/fribryg" onclick="window.open(this.href);return false;
Lillelund
Indlæg: 62
Tilmeldt: 6. nov 2014, 20:13

Re: arduino temperaturstyring

Indlæg af Lillelund »

jeg ved godt hvad du mener, det er lidt ham jeg håber læser indlægget. :-)
Brugeravatar
martin_pedersen
Indlæg: 413
Tilmeldt: 6. okt 2011, 13:49
Geografisk sted: 7080 Børkop

Re: arduino temperaturstyring

Indlæg af martin_pedersen »

jeg har nok noget liggende derhjemme, men søg på arduino menu programming.. værdier osv. ligger man op i eprom hukommelsen. så kan den tåle at blive slukket

Sendt fra min SM-G925F med Tapatalk
All right, brain, I don't like you and you don't like me - so let's just do this and I'll get back to killing you with beer.

Martin

Ps. Det skal nok blive til øl!
rasmusa
Indlæg: 17
Tilmeldt: 14. feb 2014, 23:25
Geografisk sted: Strandby, Nordjylland

Re: arduino temperaturstyring

Indlæg af rasmusa »

Prøv at tage et kig på koden her: http://haandbrygforum.dk/viewtopic.php? ... =15#p94064" onclick="window.open(this.href);return false;
Der gør jeg stort set det du efterlyser med 4 alarmer.

/Rasmus
Brugeravatar
Nimbus39
Indlæg: 3392
Tilmeldt: 27. jun 2010, 09:52
Geografisk sted: Greve (Mosede Strand)
Kontakt:

Re: arduino temperaturstyring

Indlæg af Nimbus39 »

Lillelund skrev:jeg ved godt hvad du mener, det er lidt ham jeg håber læser indlægget. :-)
Jamen så må jeg jo hellere svare ;-)
Det du spørger om har jeg lavet til Admins HLT styring.
Det brugte LCD/Keypad er denne type:
http://www.aliexpress.com/item/Free-Shi ... 79279.html" onclick="window.open(this.href);return false;
Det fungerer ved at læse en analog indgang og alt efter hvad værdien er på indgangen kan det afgøres hvilken knap der trykkes på fordi hver knap har en unik modstand monteret, faktisk lidt smart måde kun at bruge en indgang på at aflæse 5 knapper (den 6. og sidste knap er en hard reset knap)
Jeg læser keypad på denne måde:

Kode: Vælg alt

void ReadKey() // Aflæser keypad, og lægger værdi for knap i KeyPress variablen
{
  int x;
  x = analogRead (0);
  KeyPress = 0;
  if (x < 60) // Right
  {
    KeyPress = 5;
  }
  else if (x < 200) // Up
  {
    KeyPress = 3;
  }
  else if (x < 400) // Down
  {
    KeyPress = 4;
  }
  else if (x < 600) // Left
  {
    KeyPress = 2;
  }
  else if (x < 800) // Select
  {
    KeyPress = 1;
  }
}
Når jeg så har gemt hvilken knap der er trykket på kan jeg aflæse et 10K ohm potmeter og omregne værdien til en temperatur som gemmes i den knap der blev valgt tidligere:

Kode: Vælg alt

boolean SetTemperatur () // Juster temperatur
{
  int y = 0;
  float x = 0;
  boolean stored = false;
  lcd.clear();
  while (SetTemp)
  {
   lcd.setCursor(0,0);
   lcd.print("Preset: ");
   lcd.setCursor(0,1);
   lcd.print("New Value:");
   delay (400);
   while (!PresetSelcected)
   {
    ReadKey();
     switch (KeyPress) 
     {
      case 2:    // Left
        lcd.setCursor(8,0);
        lcd.print("Left ");
        PresetSelcected = true;
        y = KeyPress;
        break;
      case 3:    // Up
        lcd.setCursor(8,0);
        lcd.print("Up   ");
        PresetSelcected = true;
        y = KeyPress;
        break;
      case 4:    // Down
        lcd.setCursor(8,0);
        lcd.print("Down ");
        PresetSelcected = true;
        y = KeyPress;
        break;
      case 5:    // Right
        lcd.setCursor(8,0);
        lcd.print("Right");
        PresetSelcected = true;
        y = KeyPress;
        break;
     }
   }
   ReadPotMeter();
   x = ((PotMeter/ScaleStep)+ScaleStart); // Udregn temperatur der skal lagres
   lcd.setCursor(11,1);
   lcd.print("     "); // Ryd pladsen hvor udregnet værdi skrives
   lcd.setCursor(11,1);
   lcd.print(x); // Skriv udregnet værdi til display
   ReadKey();
   if (KeyPress == 1) // Hvis der trykkes på Select
   {
    SetTemp = false; // bryd set temp løkken
   }
  }
  while (!stored) // indtil de indtastede data er gemt
  {
  if ( y == 2) //Hvis left er valgt tidligere
    {
      Temp1 = x; // Gem udregnet værdi i left knap
      lcd.clear();
      lcd.print("Value: ");
      lcd.print(x);
      lcd.setCursor(0,1);
      lcd.print("Stored in Left");
      stored = true; // Bryd stored løkke
      delay (1000);
      lcd.clear();
    }
  if ( y == 3) //Hvis up er valgt tidligere
    {
      Temp2 = x; // Gem udregnet værdi i up knap
      lcd.clear();
      lcd.print("Value: ");
      lcd.print(x);
      lcd.setCursor(0,1);
      lcd.print("Stored in Up");
      stored = true; // Bryd stored løkke
      delay (1000);
      lcd.clear();
    }
  if ( y == 4) //Hvis down er valgt tidligere
    {
      Temp3 = x; // Gem udregnet værdi i down knap
      lcd.clear();
      lcd.print("Value: ");
      lcd.print(x);
      lcd.setCursor(0,1);
      lcd.print("Stored in Down");
      stored = true; // Bryd stored løkke
      delay (1000);
      lcd.clear();
    }
  if ( y == 5) //Hvis right er valgt tidligere
    {
      Temp4 = x; // Gem udregnet værdi i right knap
      lcd.clear();
      lcd.print("Value: ");
      lcd.print(x);
      lcd.setCursor(0,1);
      lcd.print("Stored in Right");
      stored = true; // Bryd stored løkke
      delay (1000);
      lcd.clear();
    }
  }
  // Print alle presets til display
  lcd.setCursor(0,0);
  lcd.print("L:");
  lcd.print(Temp1, 1);
  lcd.setCursor(8,0);
  lcd.print(" U:");
  lcd.print(Temp2, 1);
  lcd.setCursor(0,1);
  lcd.print("D:");
  lcd.print(Temp3, 1);
  lcd.setCursor(8,1);
  lcd.print(" R:");
  lcd.print(Temp4, 1);
  delay(5000);
  lcd.clear();
}
Hver af de 4 knapper har så mulighed for at "huske" hver deres egen temperatur og man kan herefter nemt vælge hvilken temperatur man vil have:

Kode: Vælg alt

void SetTarget() //Vælg hvilken forudindstillet temperatur der skal være target
{
 if (KeyPress==2)
 {
  TempTarget = Temp1;
 }
  if (KeyPress==3)
 {
  TempTarget = Temp2;
 }
  if (KeyPress==4)
 {
  TempTarget = Temp3;
 }
  if (KeyPress==5)
 {
  TempTarget = Temp4;  
 }

}
Det er muligt at sætte de 3 andre knappers temperatur mens den 4. knaps temperatur er valgt, systemet går dog i "selvsving" og ignorerer/fryser alle funktioner mens det er i programmeringsmode, men det er så kortvarigt at jeg ikke mente det betød noget.
Buy a man a beer and he wastes an hour. Teach a man to brew and he wastes a lifetime.
http://bryggeri.landly.dk
http://www.facebook.com/bryggerilandly
http://beersmithrecipes.com/listrecipes/2810/nimbus39
Lillelund
Indlæg: 62
Tilmeldt: 6. nov 2014, 20:13

Re: arduino temperaturstyring

Indlæg af Lillelund »

Hej Rasmusa og Nimbus

der er helt sikkert noget at sætte sig ind i :-).

igår crashede min private computer, igang med arbejdscomputeren, den nægtede at kommunikere med min UNO, den blev ved med at stå som USB2.0 serial, og ville ikke instalere driver fra Arduino biblioteket.
nå frem med en DUE, den skulle lige oprettes men så var der hul igennem, så skulle der downloades biblioteker jeg havde jo fået en ide til hvordan det kan gøres, men hver gang jeg prøvede at Verify eller Uploade, fik jeg fejlmeddelelser.
efter lang tid fandt jeg ud af at en DUE ikke vil samarbejde med et I2C LCD pga. et eller andet langhåret noget, nå men der var altså en der lige viste hvad man skulle rette i et par filer i <LiquidCrystal_I2C.h> library, nu kunne jeg Verify coden og uploade til min DUE.
LCD virker stadig ikke men jeg har fået afprøvet det jeg kom i tanke om, det virker fint i praksis men det er langt fra ligeså raffineret som hvad i er kommet med, og det går tilbage til de defaults der er skrevet i setup hvis strømmen forsvinder.
det er baseret på 4 Threshold, 2 setpunkter og hysterese for hver, samt en buttonstatechange detection med tæller og en masse if if


// read the pushbutton input pin:
buttonState1 = digitalRead(buttonPin1);
// compare the buttonState to its previous state
if (buttonState1 != lastButtonState1) {
// if the state has changed, increment the counter
if (buttonState1 == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter1++;
Serial.print("number of button1 pushes: ");
Serial.println(buttonPushCounter1);
}
}
lastButtonState1 = buttonState1;

// read the pushbutton input pin:
buttonState2 = digitalRead(buttonPin2);
// compare the buttonState to its previous state
if (buttonState2 != lastButtonState2) {
// if the state has changed, increment the counter
if (buttonState2 == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter2++;
Serial.print("number of button2 pushes: ");
Serial.println(buttonPushCounter2);
}
}
lastButtonState2 = buttonState2;

// read the pushbutton input pin:
buttonState3 = digitalRead(buttonPin3);
// compare the buttonState to its previous state
if (buttonState3 != lastButtonState3) {
// if the state has changed, increment the counter
if (buttonState3 == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter3++;
Serial.print("number of button3 pushes: ");
Serial.println(buttonPushCounter3);
}
}
lastButtonState3 = buttonState3;

// function for setting threshold 1
if (buttonPushCounter1 == 1) {
if (buttonPushCounter2 == 1){
threshold1= threshold1 + 1;
}}
if (buttonPushCounter1 == 1) {
if (buttonPushCounter3 == 1){
threshold1 = threshold1 - 1;
}}
// function for setting threshold 2
if (buttonPushCounter1 == 2) {
if (buttonPushCounter2 == 1){
threshold2= threshold2 + 1;
}}
if (buttonPushCounter1 == 2) {
if (buttonPushCounter3 == 1){
threshold2 = threshold2 - 1;
}}
// function for setting threshold 3
if (buttonPushCounter1 == 3) {
if (buttonPushCounter2 == 1){
threshold3= threshold3 + 1;
}}
if (buttonPushCounter1 == 3) {
if (buttonPushCounter3 == 1){
threshold3 = threshold3 - 1;
}}
// function for setting threshold 4
if (buttonPushCounter1 == 4) {
if (buttonPushCounter2 == 1){
threshold4= threshold4 + 1;
}}
if (buttonPushCounter1 == 4) {
if (buttonPushCounter3 == 1){
threshold4 = threshold4 - 1;
}}

if (buttonPushCounter1 >= 5){
buttonPushCounter1 = 0;
}
if (buttonPushCounter2 == 1){
buttonPushCounter2=0;
}
if (buttonPushCounter3 == 1){
buttonPushCounter3=0;
}

det er den simple men tunge måde at lave det på.

jeg skal ihvertefald have nærstuderet jeres løsninger da der er nogle nye funktioner jeg ikke har set før.

@Nimbus, kan den måde du har lavet meny på bruges på displays uden knapper eller er det kun på den type du har linket til?

ps. hvordan indsætter i IDE kode så det kører i sit eget vindue?

Tak for hjælpen. Søren
Brugeravatar
wolf
Indlæg: 205
Tilmeldt: 2. jul 2011, 16:39
Geografisk sted: Ans By
Kontakt:

Re: arduino temperaturstyring

Indlæg af wolf »

Jeg har også frigivet et bibliotek, der har cirka samme funktion med knapper. Den sørger for debouncing, har mulighed for repeat, og bruger en analog indgang til multiple knapper. Og så er det så nemt som følgende i programmets hovedsløjfe:

Kode: Vælg alt

int key_press = my_button;
Ved at vælge modstandene rigtigt opnås maksimal støjimmunitet på knapperne. Biblioteket indeholder en eksempelfil, hvor der er en tabel med modstande i forhold til antallet af knapper.

Biblioteket kan hentes her: https://github.com/olewolf/Analog_Buttons,
Årtusinders traditioner for ølbrygning har påvirket selv vores kommunikation: Det er årsagen til, at der i så mange sprog ikke findes et ord for "ikke længere tørstig".
Truntebryg
Indlæg: 5319
Tilmeldt: 15. nov 2008, 09:30

Re: arduino temperaturstyring

Indlæg af Truntebryg »

Nu spørger jeg nok lidt dumt ... men det virker meget bøvlet at bruge AD indgange til on/off funktion...??

Er det fordi der mangle digitale styre indgage elle hyr ?
Brugeravatar
wolf
Indlæg: 205
Tilmeldt: 2. jul 2011, 16:39
Geografisk sted: Ans By
Kontakt:

Re: arduino temperaturstyring

Indlæg af wolf »

Truntebryg skrev:Er det fordi der mangle digitale styre indgage elle hyr ?
Ja, fordelen ved at bruge AD-indgange til on/off-knapper er, at alle knapperne bliver koblet til én indgang. Man kan hurtigt løbe tør for indgange og udgange, hvis man f.eks. bruger en LCD.

(I mit seneste projekt baseret på en ATmega328 (Arduino-processoren) skulle jeg styre en steppermotor, et LCD, to blæsere, en temperaturføler, en luftfugtighedsmåler, et varmelegeme, en luftfugter, betjene en menu vha. trykknapper, have en serielport til en radio... der bliver pludselig kamp om benene på processoren.)
Årtusinders traditioner for ølbrygning har påvirket selv vores kommunikation: Det er årsagen til, at der i så mange sprog ikke findes et ord for "ikke længere tørstig".
Besvar

Tilbage til "Microprocessor styring til ølbrygning"