Go Down

Topic: 28buj-48 problem, Whit Heat Cabinet Project (Read 52 times) previous topic - next topic

k-friis

Hi

I have a problem with my code.
I can't get my stepper motor to rotate ONLY at a fixed temperature. for example, when the temperature is 20 degrees, it must turn one way and at 24 degrees it must turn the other way.
It works in the code now, but it rotates constantly. It should ONLY run once until further temperature is reached. Anyone have a good idea for solving this problem?

My code:


#include <DHT.h>                       // sensor Bibliotek
#include <DHT_U.h>
#include <LiquidCrystal.h>             // LCD Bibliotek
#include <Stepper.h>
#define STEPS 2038                     // Stepper Motor, 2038 steps muligt hver vej
#define DHTPIN 6                       // DHT 22  (AM2302) - bruger pin 6
#define DHTTYPE DHT22                  // Definerer typen

LiquidCrystal lcd(13, 12, 8, 7, 4, 2); // Definere brug af Ben på Mikrocontroler OBS: Brug ikke PWM Out, da de skal bruges!

int relay_Pin = 3;                     // Set up af relæ "Pin" Varme enhed.
int SetTemp = 23;                      // Set punkt af temp
int TempMin = 20;                      // Temp der slukker blæseren
int TempMax = 25;                      // Temp der starter blæseren

DHT dht(DHTPIN, DHTTYPE);

//Variabler
boolean a=LOW,b=HIGH;             // En boolsk variabel eller boolean er en variabel som kun kan antage to værdier.
float h;                                      // Læring af fugtigheds værdi
float t;                                      // Læring af temperatur værdi
int Pin = 3;
float hum;                                // Læring af fugtigheds værdi
float temp;                               // Læring af temperatur værdi
const byte fan = 6;                     // Definerer konstant
unsigned long timer = millis();         // Timer i milli sec (Denne funktion returnerer antallet af millisekunder, som den aktuelle skitse har kørt siden sidste nulstilling.)
Stepper stepper(STEPS, 5, 10, 9, 11);   // a-5, b-11, c-10, d-9,


void setup() {
  pinMode(fan, OUTPUT);                 // Setup køre logning af temperatur og fugtighed
  pinMode (relay_Pin, OUTPUT);
  Serial.begin(9600);                   // "baud rate" Serial Monitor med en datahastighed på 9600 bit pr. Sekund. via USB

                                       
  dht.begin();
  Serial.print(" Luftfugtighed ");        // Printer resultat til Monitor
  Serial.print(" %\t");                  // Luftfugtighed udlæses i %
  Serial.print(" Temperatur ");           // Printer Resultat til Monitor
  Serial.print(" %\t");                  //
  Serial.println(" Celcius");            // Temperatur udlæses i Celcius
 
    {
  lcd.begin(16, 2);                     // Print opstart besked til LCD
  lcd.setCursor (3,0);                  // Sætter cursor på øverste linje
  lcd.print("GN-Resound");
  lcd.setCursor(1,0);                   
  lcd.setCursor (0,1);                  // Sætter curser på nederste linje
  lcd.print("  By K.N.Friis");          // Mellemrummet er for placering på LCD, kan ændres ved "setCursor"
  lcd.setCursor(0,1);
  delay(5000);                          // Pause i x antal milli sec
  lcd.clear();                          // Clear LCD, ellers overskriver "GN-Resound" øverste linje
    }
}

void loop() {

  if (millis() - timer > 3000) {         // Opdaterin af udskrift/logning hver 3 sec
    hum = dht.readHumidity();            // Læs Fugtighed
    temp = dht.readTemperature();        // Læs Temperatur
    Serial.print("Luftfugtighed ");       // Printer fugtighed til monitor / LCD
    Serial.print(hum);                   
    lcd.setCursor(0,0);                  // Sætter cursor på øverste linje
    lcd.print("Fugt:    ");              // Printer fugt % til LCD
    lcd.print(hum);                     
    lcd.print(" %");
    Serial.print(" Temperatur ");        // Printer temperatur til monitor / LCD
    Serial.print(temp);                 
    Serial.println(" Celcius");
    lcd.setCursor(0,1);                 // Sætter curser på nederste linje
    lcd.print("Temp:    ");             // Sætter curser på nederste linje, mellemrummet udgør placering på skærm
    lcd.print(temp);
    lcd.println(" C");                  // Printer til LCD, ( C ) for celsius     
    timer = millis();                   // Timer er sat i milli sec
   }
   
 
    if (t >= 23  ){                         // Hvis temperaturen overstiger 25 gr. så drejer motor/hjulet i åben position
    stepper.setSpeed(6);                // Sætter hastighed
    stepper.step(500);                  // Step til højre, slusen er åben
    delay(5000);
    }
   
    if (t <= 20 ){                           // Hvis temperaturen er under 20 gr. Så drejer motor/hjulet i lukke position.
    stepper.setSpeed(6);                // Sætter hastighed
    stepper.step(-500);                 // Step til venstre; slusen er lukket
    delay(5000);                          // Pause
   
  }

             
  if (t> 20 ){                           // Hvis temp er under x-tal skal relæ gå ON
  digitalWrite(relay_Pin, LOW);
  a=HIGH;                                // Er defineret under boolean
  b=LOW;
  }
 
   
  if (t<= 24 ){                          // Hvis temp er over x-tal skal relæ gå OFF
  digitalWrite(relay_Pin, HIGH);
  a=LOW;                                 // Er defineret under boolean
  b=HIGH;
}
}

sherzaad

....It should ONLY run once until further temperature is reached. Anyone have a good idea for solving this problem?

create a variable and use it as a flag. so in your code, something like this maybe:

    if (t >= 23  && overtemp==0){                         // Hvis temperaturen overstiger 25 gr. så drejer motor/hjulet i åben position
    stepper.setSpeed(6);                // Sætter hastighed
    stepper.step(500);                  // Step til højre, slusen er åben
    delay(5000);
    overtemp=1;
    undertemp=0;
    }
   
    if (t <= 20 && undertemp==0){                           // Hvis temperaturen er under 20 gr. Så drejer motor/hjulet i lukke position.
    stepper.setSpeed(6);                // Sætter hastighed
    stepper.step(-500);                 // Step til venstre; slusen er lukket
    delay(5000);                          // Pause
    undertemp=1;
    overtemp=0;
  }

hope that helps...

k-friis

Hi

Thanks for the response.
I'm okay with the code itself, regarding the code in the loop. Most of all I have problems with, which variables to use as a flag, As you write.


can you help me with them? :)

And thanks again.


sherzaad

Hi

Thanks for the response.
I'm okay with the code itself, regarding the code in the loop. Most of all I have problems with, which variables to use as a flag, As you write.


can you help me with them? :)

And thanks again.


Was the adjustment I made to you code not clear?  You just need to declare 'undertemp' and 'overtemp' (as uint8_t if you want) and trial running the code with the suggested modification....

k-friis

I've tried it. and I've also tried to make variable. as undertemp and overtemp.
and it responds in the same way as before.


That's why I wrote if you could help.

Ken_F

I'm not sure if this is the problem but, aren't the comments reversed?

  if (t> 20 ){                           // Hvis temp er under x-tal skal relæ gå ON  <== t over 20 not under
  digitalWrite(relay_Pin, LOW);
  a=HIGH;                                // Er defineret under boolean
  b=LOW;
  }
 
   
  if (t<= 24 ){                          // Hvis temp er over x-tal skal relæ gå OFF <== t under 24 not over
  digitalWrite(relay_Pin, HIGH);
  a=LOW;                                 // Er defineret under boolean
  b=HIGH;
}
}

Go Up