#include <DHT.h>
#define DHTPIN 7
#define DHTTYPE DHT22
#define DHTPIN1 8
#define DHTTYPE1 DHT22
int motor_right = 2;
int motor_right1 = 3;
int motor_left = 4;
int motor_left1 = 5;
int heater_relay = 6;
int stopButton = 10;
int startButton = 11;
int dehumidifier_fan_relay = 12;
int warning_led = A0;
const int heater_on = 40;
const int heater_off = 50;
const int startTemperature = 40;
enum state_t : uint8_t { STOPPED = 0 , INITIAL_WARMING, MIXING, MOTOR_ON_RIGHT, MOTOR_OFF_RIGHT,
MOTOR_ON_LEFT, MOTOR_OFF_LEFT, OPERATOR_WAIT, SHUTDOWN
} ;
const char *stateText[] = { "STOPPED", "INITIAL_WARMING", "MIXING", "MOTOR_ON_RIGHT",
"MOTOR_OFF_RIGHT", "MOTOR_ON_LEFT", "MOTOR_OFF_LEFT", "OPERATOR_WAIT", "SHUTDOWN"
} ;
state_t state = STOPPED ;
state_t lastState = SHUTDOWN ;
uint32_t inStateAtMs = 0 ;
bool stateChange = true ;
uint32_t mixingStartTime = 0;
char buf[120] ; // print buffer
DHT dht1(DHTPIN1, DHTTYPE1);
DHT dht(DHTPIN, DHTTYPE);
void changeState( state_t newState ) {
lastState = state ;
state = newState ;
inStateAtMs = millis() ;
stateChange = true ;
}
void setup() {
Serial.begin(115200);
Serial.println("Bread Maker") ;
pinMode(warning_led, OUTPUT);
pinMode(dehumidifier_fan_relay, OUTPUT);
pinMode(stopButton, INPUT_PULLUP);
pinMode(startButton, INPUT_PULLUP);
pinMode(motor_right, OUTPUT);
pinMode(motor_right1, OUTPUT);
pinMode(motor_left, OUTPUT);
pinMode(motor_left1, OUTPUT);
pinMode(heater_relay, OUTPUT);
digitalWrite(dehumidifier_fan_relay, HIGH);
digitalWrite(heater_relay, HIGH);
digitalWrite(motor_right, HIGH);
digitalWrite(motor_right1, HIGH);
digitalWrite(motor_left, HIGH);
digitalWrite(motor_left1, HIGH);
dht.begin();
dht1.begin();
}
void loop() {
float humidity = dht.readHumidity();
float temperature = dht1.readTemperature();
static float lastHumidity = 0 ;
static float lastTemperature = 0 ;
// print humidity only if there has been a significant change
if ( fabs( humidity - lastHumidity ) > 0.5 ) {
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println("%");
lastHumidity = humidity ;
}
// print temperature only if there has been a significant change
if ( fabs( temperature - lastTemperature ) > 0.5 ) {
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
lastTemperature = temperature ;
}
// state machine
if ( stateChange ) {
snprintf( buf, sizeof(buf) - 1, "New state: %s (old state %s) \n" , stateText[ state ], stateText[ lastState ] ) ;
Serial.print( buf ) ;
stateChange = false ;
}
// maintain temperature only if system in an active state
if ( state != STOPPED && state != SHUTDOWN && state != INITIAL_WARMING ) {
if ( digitalRead(heater_relay) == LOW && temperature >= heater_off) {
digitalWrite(heater_relay, HIGH);
Serial.println( "Switching heater OFF") ;
}
else if (digitalRead(heater_relay) == HIGH && temperature <= heater_on) {
digitalWrite(heater_relay, LOW);
Serial.println( "Switching heater ON") ;
}
}
// maintain humidity only if system in an active state
if ( state != STOPPED && state != SHUTDOWN ) {
if ( digitalRead( dehumidifier_fan_relay ) == LOW && humidity <= 55 ) {
digitalWrite( dehumidifier_fan_relay, HIGH ) ;
Serial.println( "Switch dehumidifier OFF" ) ;
}
else if ( digitalRead( dehumidifier_fan_relay ) == HIGH && humidity >= 65 ) {
digitalWrite( dehumidifier_fan_relay, LOW ) ;
Serial.println( "Switch dehumidifier ON" ) ;
}
}
switch ( state ) {
case STOPPED : {
if (digitalRead(startButton) == LOW) {
digitalWrite(heater_relay, LOW);
changeState( INITIAL_WARMING ) ;
}
break ;
}
case INITIAL_WARMING : {
if ( temperature > startTemperature ) {
digitalWrite(heater_relay, HIGH);
changeState( MIXING ) ;
}
break ;
}
case MIXING : {
mixingStartTime = millis() ;
digitalWrite(motor_right, LOW);
digitalWrite(motor_right1, LOW);
changeState( MOTOR_ON_RIGHT ) ;
break ;
}
case MOTOR_ON_RIGHT : {
if ( millis() - inStateAtMs > 5000UL ) {
digitalWrite(motor_right, HIGH);
digitalWrite(motor_right1, HIGH);
changeState( MOTOR_OFF_RIGHT ) ;
}
break ;
}
case MOTOR_OFF_RIGHT : {
if ( millis() - inStateAtMs > 2000UL ) {
digitalWrite(motor_left, LOW);
digitalWrite(motor_left1, LOW);
changeState( MOTOR_ON_LEFT ) ;
}
break ;
}
case MOTOR_ON_LEFT : {
if ( millis() - inStateAtMs > 5000UL ) {
digitalWrite(motor_left, HIGH);
digitalWrite(motor_left1, HIGH);
changeState( MOTOR_OFF_LEFT ) ;
}
break ;
}
case MOTOR_OFF_LEFT : {
if ( millis() - inStateAtMs > 2000UL ) {
if ( millis() - mixingStartTime >= 20000UL ) {
digitalWrite(warning_led, HIGH);
changeState( OPERATOR_WAIT ) ;
}
else {
digitalWrite(motor_right, LOW);
digitalWrite(motor_right1, LOW);
changeState( MOTOR_ON_RIGHT ) ;
}
}
break ;
}
case OPERATOR_WAIT : {
if (digitalRead(startButton) == LOW) {
digitalWrite(warning_led, LOW);
changeState( INITIAL_WARMING ) ;
}
if (digitalRead(stopButton) == LOW) {
changeState( SHUTDOWN ) ;
}
break ;
}
case SHUTDOWN : {
digitalWrite(motor_right, HIGH);
digitalWrite(motor_right1, HIGH);
digitalWrite(motor_left, HIGH);
digitalWrite(motor_left1, HIGH);
digitalWrite(heater_relay, HIGH);
digitalWrite(dehumidifier_fan_relay, HIGH);
digitalWrite(warning_led, LOW);
changeState( STOPPED ) ;
break ;
}
}
if (digitalRead(stopButton) == LOW) {
delay( 100 ) ;
changeState( SHUTDOWN ) ;
}
}