Tumble Dryer Arduino Code


/* PINS */
#define MOTOR_DIR 5
#define MOTOR_EN  6
#define HEATER_EN    7
#define NTC1     A0
#define NTC2     A1
#define FULL    13
#define BUTTON  12
#define FAIL_X        9
#define OK_X          8
#define OK_PAUSE      4
#define DRY_NOIDEA   10
#define COOL_FILTER   3
#define END_FULL      2

/* Configuration */
int max_temp = 510;
int min_temp = max_temp - 150;


void lightPlay( int spins )
{
       for( int x=0;x
              digitalWrite(OK_X, 0);
              digitalWrite(FAIL_X, 1);

              digitalWrite(DRY_NOIDEA, 1);  digitalWrite(END_FULL, 0);
              delay(100);   
              digitalWrite(END_FULL, 1);digitalWrite(COOL_FILTER, 0);
              delay(100);
              digitalWrite(COOL_FILTER, 1); digitalWrite(DRY_NOIDEA, 0);
              delay(100);

              digitalWrite(OK_X, 1);
              digitalWrite(FAIL_X, 0);


              delay(100);   
              digitalWrite(DRY_NOIDEA, 1);digitalWrite(COOL_FILTER, 0);
              delay(100);
              digitalWrite(COOL_FILTER, 1); digitalWrite(END_FULL, 0);
              delay(100);
       }
}


#define LED_OK      0x10
#define LED_DRYING  (0x1 | LED_OK)
#define LED_COOLING (0x2 | LED_OK)
#define LED_END     (0x4 | LED_OK)
#define LED_PAUSED  (0x8 | LED_OK)

#define LED_FAN        (0x2 | LED_OK)
#define LED_FAN_HEAT   (0x3 | LED_OK)
#define LED_NOIDEA  0x1
#define LED_FILTER  0x2
#define LED_FULL    0x4

void set_led_status( int led_status )
{
       if(  led_status & LED_OK )  {
              digitalWrite(OK_X, 0);
              digitalWrite(FAIL_X, 1);
       }
       else {
              digitalWrite(OK_X, 1);
              digitalWrite(FAIL_X, 0);
       }
       digitalWrite(DRY_NOIDEA, led_status&1 ? 0 : 1);
       digitalWrite(COOL_FILTER, led_status&2 ?0 : 1);
       digitalWrite(END_FULL,led_status&4 ? 0 : 1 );
       digitalWrite(OK_PAUSE, led_status&8 ? 0 : 1);
}



void setup()
{
       Serial.begin(9600);

       pinMode(MOTOR_DIR, OUTPUT); 
       pinMode(MOTOR_EN, OUTPUT); 
       pinMode(HEATER_EN, OUTPUT); 
       pinMode(NTC1, INPUT); 
       pinMode(NTC1, INPUT); 
       pinMode(FULL, INPUT);
       pinMode(BUTTON, INPUT);  

       pinMode(FAIL_X, OUTPUT);
       pinMode(OK_X, OUTPUT);

       pinMode(OK_PAUSE, OUTPUT);
       pinMode(DRY_NOIDEA, OUTPUT);
       pinMode(COOL_FILTER, OUTPUT);
       pinMode(END_FULL, OUTPUT);

       /* All lights off */
       digitalWrite(OK_X, 0);
       digitalWrite(FAIL_X, 1);
       digitalWrite(OK_PAUSE, 1);
       digitalWrite(END_FULL, 1);
       digitalWrite(COOL_FILTER, 1);
       digitalWrite(DRY_NOIDEA, 1);

       Serial.println("Hello");
       lightPlay( 5 );  

}

typedef enum {
  UNDEFINED,
  READY,
  RUN,
  RUN_SPIN_HEAT,
  RUN_SPIN_NO_HEAT,
  FULL_PAUSE,
  REFRESH_SPIN_NO_HEAT,
} STATE;

STATE state = UNDEFINED;

int ntc1;
int ntc2;
int full;
int button_up;
int button_last;
int duration = 0;
 
void enter_ready()
{
    set_led_status( LED_PAUSED );

    digitalWrite(HEATER_EN, 0);
   
    digitalWrite(MOTOR_DIR, 0);   
    digitalWrite(MOTOR_EN, 0 );   
}

void enter_run()
{
   set_led_status( LED_FAN );

    digitalWrite(HEATER_EN, 0);

    digitalWrite(MOTOR_DIR, 0);   
    digitalWrite(MOTOR_EN, 1 );
  
}

void enter_run_spin_heat()
{
    digitalWrite(HEATER_EN, 1);
 
    set_led_status( LED_FAN_HEAT );
}

void enter_run_spin_no_heat()
{
    digitalWrite(HEATER_EN, 0);
 
    set_led_status( LED_FAN );
}

void enter_full_pause()
{
    digitalWrite(HEATER_EN, 0);
   
    digitalWrite(MOTOR_DIR, 0);   
    digitalWrite(MOTOR_EN, 0 );
 
    set_led_status( LED_FULL );
}

void enter_refresh_spin_no_heat()
{
    digitalWrite(HEATER_EN, 0);
   
    digitalWrite(MOTOR_DIR, 0);   
    digitalWrite(MOTOR_EN, 1 );
 
    set_led_status( LED_FAN | LED_END );
}

int do_ready()
{
  if( full ) {
    return FULL_PAUSE;
  }
  if( button_up ) {
    return RUN;
  }
  return state;
}

int do_run()
{
  if( button_up ) {
    return REFRESH_SPIN_NO_HEAT;
  }
  if( duration > 3 ) {
    if( full ) {
      return FULL_PAUSE;
    } 
    else {
      if( ntc1 < max_temp ){
        return RUN_SPIN_HEAT;      
      }else {
       return RUN_SPIN_NO_HEAT;
      } 
    }
  }
  return state;
}

int do_run_spin_heat()
{
  if( full ) {
    return RUN;
  }

  if( button_up ) {
    return REFRESH_SPIN_NO_HEAT;
  }

  if( ntc1 > max_temp ) {
    return RUN_SPIN_NO_HEAT;
  }

  return state;
}

int do_run_spin_no_heat()
{
  if( full ) {
    return RUN;
  }

  if( button_up ) {
    return REFRESH_SPIN_NO_HEAT;
  }

  if( ntc1 < min_temp ) {
     return RUN_SPIN_HEAT;
  }

  return state;
}

int do_full_pause()
{
  if( button_up &amp;&amp; !full ) {
    return RUN;
  }
  return state;
}

int do_refresh_spin_no_heat()
{
  if( button_up ) {
    return READY;
  }
  if( duration > 10*60 ) {
    return READY;  
  }
  return state;
}

void loop()
{
       ntc1    = analogRead( NTC1 );
       ntc2    = analogRead( NTC2 );
       full    = digitalRead( FULL );

  /* Handle State */
  int new_state;
  switch( state )
  {
    case READY:
      new_state = do_ready();
      break;

    case RUN:
      new_state = do_run();
      break
     
    case RUN_SPIN_HEAT:
      new_state = do_run_spin_heat();
      break;

    case RUN_SPIN_NO_HEAT:
      new_state = do_run_spin_no_heat();
      break;

    case FULL_PAUSE:
      new_state = do_full_pause();
      break;

    case REFRESH_SPIN_NO_HEAT:
      new_state = do_refresh_spin_no_heat();
      break;

    case UNDEFINED:
    default:
    new_state = READY;
      break;
  }

  /* Handle State transition */
  if( new_state != state )
  {
    switch( new_state )
    {
      case READY:
        enter_ready();
        break;

      case RUN:
        enter_run();
        break

      case RUN_SPIN_HEAT:
        enter_run_spin_heat();
        break;

      case RUN_SPIN_NO_HEAT:
        enter_run_spin_no_heat();
        break;

      case FULL_PAUSE:
        enter_full_pause();
        break;

      case REFRESH_SPIN_NO_HEAT:
        enter_refresh_spin_no_heat();
        break;

      default:
        break;
    }
    state = new_state;
    duration = 0;
  }

  button_up = 0;
  for(int i=0;i
    int button  = digitalRead( BUTTON );
    button_up |= ( button==0 &amp;&amp; button_last == 1 );
     button_last = button;
      delay(100);    
    if( button_up ) {
     break;
    }
  }


    Serial.print(state);Serial.print("\t");
    Serial.print(ntc1);Serial.print("\t");
    Serial.print(ntc2);Serial.print("\t");
    Serial.print(full);Serial.print("\t");
    Serial.print(button_up);Serial.print("\n");
    duration++;
}

2 comments:

  1. Hello my friend.

    I'm triing to upload your code to a nano but I get error messages. I'm a very very starter in arduino, but I got a very closely match dryer like yours. My control board is dead too, so I want to replace it with arduino. Can you help me please?

    ReplyDelete
  2. I paste here the error code:

    C:\Users\Z570\Documents\Arduino\sketch_oct27a\sketch_oct27b\sketch_oct27b.ino: In function 'void lightPlay(int)':

    sketch_oct27b:24: error: expected ';' before 'digitalWrite'

    digitalWrite(OK_X, 0);

    ^

    sketch_oct27b:24: error: expected ')' before ';' token

    digitalWrite(OK_X, 0);

    ^

    C:\Users\Z570\Documents\Arduino\sketch_oct27a\sketch_oct27b\sketch_oct27b.ino: At global scope:

    sketch_oct27b:44: error: expected declaration before '}' token

    }

    ^

    exit status 1
    expected ';' before 'digitalWrite'

    ReplyDelete