Go Down

Topic: styring af olie kamin ovn (Read 4524 times) previous topic - next topic

Apr 14, 2013, 07:49 pm Last Edit: Apr 14, 2013, 09:57 pm by Coding Badly Reason: 1
hej jeg har brug for lidt hjælp til mit første arduino hack, jeg har et drivhus hvori jeg har en oliekamin som starter og slukker ved at trykke på en trykknap, hvis man holder knappen inde melder den fejl - så derfor skal det være et tryk "on" og derefter "off" altså et såkaldt simulate push button hack, som skal tændes af min arduino med en dallas temp føler og et solid-state relay.

men mit relæ tænder og slukker konstant, og det er her i skal hjælpe en begynder :-) p.f.h. Tak

min kode ser indtil nu sådan ud:

Code: [Select]
#include <OneWire.h>
#include <DallasTemperature.h>

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

// 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);

//set maximum tank temperature
int drivhusMax = 27.00;
//set maximum tank temperature
int drivhusMin = 25.00;

DeviceAddress insideThermometer = { 0x28, 0x34, 0x6d, 0x95, 0x04, 0x0, 0x0, 0x2c };

//variables used for control logic
static bool ovnOn;

//variables to hold temperature values
float temp;

//define pin for pump relay
const int ovn = A1;

void setup(void)
{
 // start serial port
 Serial.begin(9600);
 // Start up the library
 sensors.begin();
 // set the resolution to 10 bit (good enough?)
 sensors.setResolution(insideThermometer, 10);
 //set pins to output
 pinMode (ovn, OUTPUT);
 digitalWrite(ovn, LOW);
}

void printTemperature(DeviceAddress deviceAddress)
{
 float tempC = sensors.getTempC(deviceAddress);
 if (tempC == -127.00) {
   Serial.print("Error getting temperature");
 } else {
   Serial.print("C: ");
   Serial.print(tempC);
   Serial.print(" F: ");
   Serial.print(DallasTemperature::toFahrenheit(tempC));
 }
}

void loop(void)
{
 delay(2000);
 Serial.print("Getting temperatures...\n\r");
 sensors.requestTemperatures();
 
     //assign value to variables
   temp = (sensorValue(insideThermometer));

 Serial.print("Inside temperature is: ");
 printTemperature(insideThermometer);
   Serial.print("\n\r");
       
       
           if ( (drivhusMin < temp ) )
       {      
           digitalWrite (ovn, HIGH);
           delay(250);
           digitalWrite(ovn, LOW);
           ovnOn = true;
                  }
                  else
           {
           if ( (drivhusMax > temp ) )
           digitalWrite (ovn, HIGH);  
           delay(250);
           digitalWrite(ovn, LOW);
           ovnOn = false;
                      }
                     
         Serial.print ("ovn status ");
     Serial.println (ovnOn);
     Serial.println ("");
     Serial.println ("");
       }  

float sensorValue (byte deviceAddress[])
{
 float tempC = sensors.getTempC (deviceAddress);
 float tempF = (DallasTemperature::toFahrenheit(tempC));
 return tempC;
}



Moderator edit: [code] [/code] tags added.

DKMVang

Hej brygmester

Når jeg kigger på din kode virker det til at du vil have ovnen til at tænde når der er 25 grader og slukke når der er 27. Dvs hvis temp er større end 27 skal ovnen slukke.
Du har skrevet det modsatte, hvor ovnen skal slukke hvis den målte temperatur er mindre end 27 grader, derfor vil den stå og tænde og slukke hele tiden. Prøv istedet
Code: [Select]
if ( (drivhusMax < temp ) )
            digitalWrite (ovn, HIGH); 
            delay(250);
            digitalWrite(ovn, LOW);
            ovnOn = false;
                       }

Tror det kan hjælpe lidt på det.

Venlig hilsen
Mads
Lidt arduino haløj på http://dequete.dk

Msquare

Jeg antager at alt det med temperatur måling og LCD udskrift virker. Hele temperatur reguleringen ligger jo her.
Code: [Select]

     if ( (drivhusMin < temp ) )
        {     
            digitalWrite (ovn, HIGH);
            delay(250);
            digitalWrite(ovn, LOW);
            ovnOn = true;
                   }
                   else
            {
            if ( (drivhusMax > temp ) )
            digitalWrite (ovn, HIGH); 
            delay(250);
            digitalWrite(ovn, LOW);
            ovnOn = false;
                       }

Der er rod i logikken med temperatur test og brugen af else. Den eneste gang du ikke "trykker knap" er når temperatur er mindre end min OG større end max. Og det sker næppe ;) Med DKMVangs rettelse vil du så "intet gøre" når temperaturen er både under max og under min - og det var nok heller det du mente... Den kode gør præcis det samme uanset hvad temperaturen er. Den "trykker ovn knap". Hveranden sekund.

Du skal også teste på din ovnOn variable så du ikke "trykker på knappen" hvis du vil have den tændt og den allerede er tændt. Det skal du tilføje udover den rettelse DKMVang påpeger. Det betyder også at du må sikkre dig at når programmet starter at ovnen er slukket, da det er den tilstand du antager. Du bør ændre static bool ovnOn til boolean ovnOn = false for at tydeliggøre dette. static ordet er overflødig (pga Arduinos justering af C++ sproget i IDE'en).

Du skal bare have to enkle if - ingen else. Hvis temperaturen er under min og ovn er slukket så "tryk knap" og noter ny ovn tilstand. Hvis temperatur er over max og ovn er tænd så tryk knap og noter ny tilstand.



DKMVang

Msquare har helt ret, det er nødvendigt at se om kaminen er tændt, den missede jeg lige i farten. Når man tænker på at det er i et drivhus, så er varmen jo nok lidt tid om at fordele sig, og du kan derfor sikkert godt forvente at få flere målinger i træk, hvor temperaturen stadig er over maks temperaturen. Hvis ikke du benytter ovnOn variablen til at tjekke med, vil den stå og slukke og tænde når du når maks temperaturen. det undgår du ved at teste på ovnOn variablen sammen med temperaturen.

Det kan du som Msquare skriver gøre ved at bruge den variabel du allerede har lavet.

     
Code: [Select]

if  (drivhusMin < temp && ovnON==false )
        {     
            digitalWrite (ovn, HIGH);
            delay(250);
            digitalWrite(ovn, LOW);
            ovnOn = true;
                   }

if (drivhusMax > temp && ovnOn==true )
        {
            digitalWrite (ovn, HIGH); 
            delay(250);
            digitalWrite(ovn, LOW);
            ovnOn = false;
                       }


På den måde tænder oven når temperaturen er under drivhusMin og ovnen er slukket, og slukker igen når temperaturen er over drivusmak og ovnen er tændt. Dvs. at hvis du får en måling lige efter du har slukket oven, som stadig giver en temperatur over maks, så tænder oven ikke fordi ovnOn ikke er true!

Håber det giver lidt mening.

Mads
Lidt arduino haløj på http://dequete.dk

Go Up