28buj-48 problem, Whit Heat Cabinet Project

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;
}
}

k-friis:
....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...

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? :slight_smile:

And thanks again.

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? :slight_smile:

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....

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.

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;
}
}