This code emulates a washing machine.

Committer:
EDISON_NGUNJIRI
Date:
Thu May 19 15:57:58 2022 +0000
Revision:
0:d91a71b2ef96
Version1 washing emulator

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EDISON_NGUNJIRI 0:d91a71b2ef96 1 /* mbed Microcontroller Library
EDISON_NGUNJIRI 0:d91a71b2ef96 2 * Copyright (c) 2019 ARM Limited
EDISON_NGUNJIRI 0:d91a71b2ef96 3 * SPDX-License-Identifier: Apache-2.0
EDISON_NGUNJIRI 0:d91a71b2ef96 4 */
EDISON_NGUNJIRI 0:d91a71b2ef96 5 #include "mbed.h"
EDISON_NGUNJIRI 0:d91a71b2ef96 6 #include "stdint.h"
EDISON_NGUNJIRI 0:d91a71b2ef96 7 #include "stdio.h"
EDISON_NGUNJIRI 0:d91a71b2ef96 8 #include <algorithm>
EDISON_NGUNJIRI 0:d91a71b2ef96 9 #include <string.h>
EDISON_NGUNJIRI 0:d91a71b2ef96 10 #include <stdlib.h>
EDISON_NGUNJIRI 0:d91a71b2ef96 11
EDISON_NGUNJIRI 0:d91a71b2ef96 12 #define MAX_COUNTER 5 /* This is in seconds*/
EDISON_NGUNJIRI 0:d91a71b2ef96 13
EDISON_NGUNJIRI 0:d91a71b2ef96 14 /*Machine state describes whether the machine is ON or OFF
EDISON_NGUNJIRI 0:d91a71b2ef96 15 Port_Param can be @ mode_Select_Pot
EDISON_NGUNJIRI 0:d91a71b2ef96 16 water_mode_Pot
EDISON_NGUNJIRI 0:d91a71b2ef96 17 Load_size_Port
EDISON_NGUNJIRI 0:d91a71b2ef96 18 */
EDISON_NGUNJIRI 0:d91a71b2ef96 19
EDISON_NGUNJIRI 0:d91a71b2ef96 20 typedef struct Washing_Machine {
EDISON_NGUNJIRI 0:d91a71b2ef96 21 int Machine_State;
EDISON_NGUNJIRI 0:d91a71b2ef96 22 int Port_Param;
EDISON_NGUNJIRI 0:d91a71b2ef96 23 int count_down;
EDISON_NGUNJIRI 0:d91a71b2ef96 24 float Temperature;
EDISON_NGUNJIRI 0:d91a71b2ef96 25 char Pot1_mode[20];
EDISON_NGUNJIRI 0:d91a71b2ef96 26 char Pot2_water[20];
EDISON_NGUNJIRI 0:d91a71b2ef96 27 char Pot3_Load[20];
EDISON_NGUNJIRI 0:d91a71b2ef96 28 char Temp[20];
EDISON_NGUNJIRI 0:d91a71b2ef96 29 } Washing_MachineTypedef;
EDISON_NGUNJIRI 0:d91a71b2ef96 30
EDISON_NGUNJIRI 0:d91a71b2ef96 31 typedef enum Pot_Select {
EDISON_NGUNJIRI 0:d91a71b2ef96 32 mode_Select_Pot = 1,
EDISON_NGUNJIRI 0:d91a71b2ef96 33 water_mode_Pot,
EDISON_NGUNJIRI 0:d91a71b2ef96 34 Load_size_Port,
EDISON_NGUNJIRI 0:d91a71b2ef96 35 } Pot_Select;
EDISON_NGUNJIRI 0:d91a71b2ef96 36
EDISON_NGUNJIRI 0:d91a71b2ef96 37 typedef enum M_Status { OFF = 0, ON, RUN } M_Status;
EDISON_NGUNJIRI 0:d91a71b2ef96 38
EDISON_NGUNJIRI 0:d91a71b2ef96 39 Washing_MachineTypedef Machine = {0};
EDISON_NGUNJIRI 0:d91a71b2ef96 40 /* "n" "p" "d" "h" "c" "s" "l"*/
EDISON_NGUNJIRI 0:d91a71b2ef96 41 int HexLabel[]={0x15,0x67,0x3D,0x17,0x4E,0x5B,0x0E};
EDISON_NGUNJIRI 0:d91a71b2ef96 42 int PotValue1, PotValue2, PotValue3;
EDISON_NGUNJIRI 0:d91a71b2ef96 43 BusOut SegDis(PC_7,PA_12,PB_1,PB_15,PB_14,PB_12,PA_11);//change PC_7 to PB_11
EDISON_NGUNJIRI 0:d91a71b2ef96 44 Ticker TIMER; /*Declare a Timer for Timing Duration*/
EDISON_NGUNJIRI 0:d91a71b2ef96 45 DigitalOut Buzzer(PA_15); /*Buzzer connected to PA_15*/
EDISON_NGUNJIRI 0:d91a71b2ef96 46 DigitalOut Red_Led(PC_0); /*RED LED to signify machine in stop mode*/
EDISON_NGUNJIRI 0:d91a71b2ef96 47 DigitalOut Green_Led(PC_1); /*Green LED to signify machine in running mode*/
EDISON_NGUNJIRI 0:d91a71b2ef96 48 DigitalOut Yellow_Led(PC_2); /*Green LED to signify machine in Setup Mode mode*/
EDISON_NGUNJIRI 0:d91a71b2ef96 49 InterruptIn POWER_ON(PC_10); /*Pin to power On the machine connecte to pin PC_10*/
EDISON_NGUNJIRI 0:d91a71b2ef96 50 InterruptIn POWER_OFF(PC_11); /*Pin to power OFF the machine connecte to pin PC_11*/
EDISON_NGUNJIRI 0:d91a71b2ef96 51 InterruptIn Start_Sequence( PA_0); /*Pin to start the machine sequence connected to pin PC_11*/
EDISON_NGUNJIRI 0:d91a71b2ef96 52 AnalogIn Pot1_mode_Select(PA_5); /*To select @ Normal, Permanent or Delicate*/
EDISON_NGUNJIRI 0:d91a71b2ef96 53 AnalogIn Pot2_water_mode(PA_6); /*To select @ Warm water or Cool water*/
EDISON_NGUNJIRI 0:d91a71b2ef96 54 AnalogIn Pot3_Load_size(PA_7); /* To select the size of the load, which can small or large*/
EDISON_NGUNJIRI 0:d91a71b2ef96 55 AnalogIn LM35(PC_3); /*Analogue Pin for reading LM35*/
EDISON_NGUNJIRI 0:d91a71b2ef96 56
EDISON_NGUNJIRI 0:d91a71b2ef96 57 void TimerCount_Down()
EDISON_NGUNJIRI 0:d91a71b2ef96 58 {
EDISON_NGUNJIRI 0:d91a71b2ef96 59 Machine.count_down--;
EDISON_NGUNJIRI 0:d91a71b2ef96 60 }
EDISON_NGUNJIRI 0:d91a71b2ef96 61 void Application()
EDISON_NGUNJIRI 0:d91a71b2ef96 62 {
EDISON_NGUNJIRI 0:d91a71b2ef96 63 if (Machine.Port_Param > 3)
EDISON_NGUNJIRI 0:d91a71b2ef96 64 {
EDISON_NGUNJIRI 0:d91a71b2ef96 65 Machine.Port_Param = 1;
EDISON_NGUNJIRI 0:d91a71b2ef96 66 }
EDISON_NGUNJIRI 0:d91a71b2ef96 67 if (Machine.Port_Param == mode_Select_Pot)
EDISON_NGUNJIRI 0:d91a71b2ef96 68 {
EDISON_NGUNJIRI 0:d91a71b2ef96 69 PotValue1 = Pot1_mode_Select.read_u16();
EDISON_NGUNJIRI 0:d91a71b2ef96 70 if (PotValue1 < 21845)
EDISON_NGUNJIRI 0:d91a71b2ef96 71 {
EDISON_NGUNJIRI 0:d91a71b2ef96 72 sprintf(Machine.Pot1_mode, "%s", "NORMAL");
EDISON_NGUNJIRI 0:d91a71b2ef96 73 SegDis.write(HexLabel[0]);
EDISON_NGUNJIRI 0:d91a71b2ef96 74
EDISON_NGUNJIRI 0:d91a71b2ef96 75 }
EDISON_NGUNJIRI 0:d91a71b2ef96 76 if (PotValue1 >= 21845 && PotValue1 < 43690)
EDISON_NGUNJIRI 0:d91a71b2ef96 77 {
EDISON_NGUNJIRI 0:d91a71b2ef96 78 sprintf(Machine.Pot1_mode, "%s", "PERMANENT");
EDISON_NGUNJIRI 0:d91a71b2ef96 79 SegDis.write(HexLabel[1]);
EDISON_NGUNJIRI 0:d91a71b2ef96 80
EDISON_NGUNJIRI 0:d91a71b2ef96 81 }
EDISON_NGUNJIRI 0:d91a71b2ef96 82 if (PotValue1 >= 43690)
EDISON_NGUNJIRI 0:d91a71b2ef96 83 {
EDISON_NGUNJIRI 0:d91a71b2ef96 84 sprintf(Machine.Pot1_mode, "%s", "DELICATE");
EDISON_NGUNJIRI 0:d91a71b2ef96 85 SegDis.write(HexLabel[2]);
EDISON_NGUNJIRI 0:d91a71b2ef96 86
EDISON_NGUNJIRI 0:d91a71b2ef96 87 }
EDISON_NGUNJIRI 0:d91a71b2ef96 88 }
EDISON_NGUNJIRI 0:d91a71b2ef96 89 if (Machine.Port_Param == water_mode_Pot)
EDISON_NGUNJIRI 0:d91a71b2ef96 90 {
EDISON_NGUNJIRI 0:d91a71b2ef96 91 PotValue2 = Pot2_water_mode.read_u16();
EDISON_NGUNJIRI 0:d91a71b2ef96 92 if (PotValue2 < 32768)
EDISON_NGUNJIRI 0:d91a71b2ef96 93 {
EDISON_NGUNJIRI 0:d91a71b2ef96 94 sprintf(Machine.Pot2_water, "%s", "WARM");
EDISON_NGUNJIRI 0:d91a71b2ef96 95 SegDis.write(HexLabel[3]);
EDISON_NGUNJIRI 0:d91a71b2ef96 96
EDISON_NGUNJIRI 0:d91a71b2ef96 97 }
EDISON_NGUNJIRI 0:d91a71b2ef96 98 if (PotValue2 >= 21845)
EDISON_NGUNJIRI 0:d91a71b2ef96 99 {
EDISON_NGUNJIRI 0:d91a71b2ef96 100 sprintf(Machine.Pot2_water, "%s", "COLD");
EDISON_NGUNJIRI 0:d91a71b2ef96 101 SegDis.write(HexLabel[4]);
EDISON_NGUNJIRI 0:d91a71b2ef96 102
EDISON_NGUNJIRI 0:d91a71b2ef96 103 }
EDISON_NGUNJIRI 0:d91a71b2ef96 104 }
EDISON_NGUNJIRI 0:d91a71b2ef96 105 if (Machine.Port_Param == Load_size_Port)
EDISON_NGUNJIRI 0:d91a71b2ef96 106 {
EDISON_NGUNJIRI 0:d91a71b2ef96 107 PotValue3 = Pot3_Load_size.read_u16();
EDISON_NGUNJIRI 0:d91a71b2ef96 108 if (PotValue3 < 32768)
EDISON_NGUNJIRI 0:d91a71b2ef96 109 {
EDISON_NGUNJIRI 0:d91a71b2ef96 110 sprintf(Machine.Pot3_Load, "%s", "SMALL");
EDISON_NGUNJIRI 0:d91a71b2ef96 111 SegDis.write(HexLabel[5]);
EDISON_NGUNJIRI 0:d91a71b2ef96 112
EDISON_NGUNJIRI 0:d91a71b2ef96 113 }
EDISON_NGUNJIRI 0:d91a71b2ef96 114 if (PotValue3 >= 32768)
EDISON_NGUNJIRI 0:d91a71b2ef96 115 {
EDISON_NGUNJIRI 0:d91a71b2ef96 116 sprintf(Machine.Pot3_Load, "%s", "LARGE");
EDISON_NGUNJIRI 0:d91a71b2ef96 117 SegDis.write(HexLabel[6]);
EDISON_NGUNJIRI 0:d91a71b2ef96 118
EDISON_NGUNJIRI 0:d91a71b2ef96 119 }
EDISON_NGUNJIRI 0:d91a71b2ef96 120 }
EDISON_NGUNJIRI 0:d91a71b2ef96 121 }
EDISON_NGUNJIRI 0:d91a71b2ef96 122 void Power_On_function()
EDISON_NGUNJIRI 0:d91a71b2ef96 123 {
EDISON_NGUNJIRI 0:d91a71b2ef96 124
EDISON_NGUNJIRI 0:d91a71b2ef96 125 Machine.Machine_State = ON;
EDISON_NGUNJIRI 0:d91a71b2ef96 126 Machine.Port_Param++;
EDISON_NGUNJIRI 0:d91a71b2ef96 127 }
EDISON_NGUNJIRI 0:d91a71b2ef96 128 void Power_Off_Machine()
EDISON_NGUNJIRI 0:d91a71b2ef96 129 {
EDISON_NGUNJIRI 0:d91a71b2ef96 130 Machine.Machine_State = OFF;
EDISON_NGUNJIRI 0:d91a71b2ef96 131 }
EDISON_NGUNJIRI 0:d91a71b2ef96 132 void Run_Machine()
EDISON_NGUNJIRI 0:d91a71b2ef96 133 {
EDISON_NGUNJIRI 0:d91a71b2ef96 134 Machine.count_down = MAX_COUNTER; /*Initialize the counter to MAX seconds*/
EDISON_NGUNJIRI 0:d91a71b2ef96 135 TIMER.attach(&TimerCount_Down,1.0);
EDISON_NGUNJIRI 0:d91a71b2ef96 136 Machine.Machine_State = RUN;
EDISON_NGUNJIRI 0:d91a71b2ef96 137 }
EDISON_NGUNJIRI 0:d91a71b2ef96 138 void LM35_Temperature()
EDISON_NGUNJIRI 0:d91a71b2ef96 139 {
EDISON_NGUNJIRI 0:d91a71b2ef96 140 Machine.Temperature = ((LM35.read() * 3276.0) / 10.0);
EDISON_NGUNJIRI 0:d91a71b2ef96 141 sprintf(Machine.Temp, "%f", Machine.Temperature);
EDISON_NGUNJIRI 0:d91a71b2ef96 142 printf("TEMP= %.2f\n\r", Machine.Temperature);
EDISON_NGUNJIRI 0:d91a71b2ef96 143 }
EDISON_NGUNJIRI 0:d91a71b2ef96 144 int main()
EDISON_NGUNJIRI 0:d91a71b2ef96 145 {
EDISON_NGUNJIRI 0:d91a71b2ef96 146 POWER_ON.mode(PullUp); /*Activete pull up for power on button*/
EDISON_NGUNJIRI 0:d91a71b2ef96 147 POWER_OFF.mode(PullUp); /*Activete pull up for power off button*/
EDISON_NGUNJIRI 0:d91a71b2ef96 148 Start_Sequence.mode(PullUp); /*Activete pull up for run sequence button*/
EDISON_NGUNJIRI 0:d91a71b2ef96 149 POWER_ON.fall(&Power_On_function); /*Power ON the system*/
EDISON_NGUNJIRI 0:d91a71b2ef96 150 POWER_OFF.fall(&Power_Off_Machine); /*Power OFF the system*/
EDISON_NGUNJIRI 0:d91a71b2ef96 151 Start_Sequence.fall(&Run_Machine); /*start Sequence of the system*/
EDISON_NGUNJIRI 0:d91a71b2ef96 152 while (true)
EDISON_NGUNJIRI 0:d91a71b2ef96 153 {
EDISON_NGUNJIRI 0:d91a71b2ef96 154
EDISON_NGUNJIRI 0:d91a71b2ef96 155 switch (Machine.Machine_State)
EDISON_NGUNJIRI 0:d91a71b2ef96 156 {
EDISON_NGUNJIRI 0:d91a71b2ef96 157 case OFF:
EDISON_NGUNJIRI 0:d91a71b2ef96 158 SegDis.write(0x00);
EDISON_NGUNJIRI 0:d91a71b2ef96 159 Red_Led = 1;
EDISON_NGUNJIRI 0:d91a71b2ef96 160 Yellow_Led = 0;
EDISON_NGUNJIRI 0:d91a71b2ef96 161 Green_Led = 0;
EDISON_NGUNJIRI 0:d91a71b2ef96 162 break;
EDISON_NGUNJIRI 0:d91a71b2ef96 163 case ON:
EDISON_NGUNJIRI 0:d91a71b2ef96 164 Buzzer = 0;
EDISON_NGUNJIRI 0:d91a71b2ef96 165 Yellow_Led = 1;
EDISON_NGUNJIRI 0:d91a71b2ef96 166 Red_Led = 0;
EDISON_NGUNJIRI 0:d91a71b2ef96 167 Green_Led = 0;
EDISON_NGUNJIRI 0:d91a71b2ef96 168 Application();
EDISON_NGUNJIRI 0:d91a71b2ef96 169 LM35_Temperature();
EDISON_NGUNJIRI 0:d91a71b2ef96 170 //printf("Pot1_mode=%s,Pot2_water=%s,Pot3_Load=%s\n\r",Machine.Pot1_mode, Machine.Pot2_water, Machine.Pot3_Load);
EDISON_NGUNJIRI 0:d91a71b2ef96 171 break;
EDISON_NGUNJIRI 0:d91a71b2ef96 172 case RUN:
EDISON_NGUNJIRI 0:d91a71b2ef96 173 Red_Led = 0;
EDISON_NGUNJIRI 0:d91a71b2ef96 174 Green_Led = 1;
EDISON_NGUNJIRI 0:d91a71b2ef96 175 Yellow_Led = 0;
EDISON_NGUNJIRI 0:d91a71b2ef96 176 if (Machine.count_down == 0)
EDISON_NGUNJIRI 0:d91a71b2ef96 177 {
EDISON_NGUNJIRI 0:d91a71b2ef96 178 TIMER.detach();
EDISON_NGUNJIRI 0:d91a71b2ef96 179 Buzzer = 1;
EDISON_NGUNJIRI 0:d91a71b2ef96 180 Machine.Machine_State = ON;
EDISON_NGUNJIRI 0:d91a71b2ef96 181 SegDis.write(0x00);
EDISON_NGUNJIRI 0:d91a71b2ef96 182 wait_us(1000000);
EDISON_NGUNJIRI 0:d91a71b2ef96 183 Buzzer = 0;
EDISON_NGUNJIRI 0:d91a71b2ef96 184 }
EDISON_NGUNJIRI 0:d91a71b2ef96 185 else
EDISON_NGUNJIRI 0:d91a71b2ef96 186 {
EDISON_NGUNJIRI 0:d91a71b2ef96 187 printf("%d s\n\r", Machine.count_down);
EDISON_NGUNJIRI 0:d91a71b2ef96 188 }
EDISON_NGUNJIRI 0:d91a71b2ef96 189
EDISON_NGUNJIRI 0:d91a71b2ef96 190 break;
EDISON_NGUNJIRI 0:d91a71b2ef96 191 }
EDISON_NGUNJIRI 0:d91a71b2ef96 192 wait_us(100000);
EDISON_NGUNJIRI 0:d91a71b2ef96 193 }
EDISON_NGUNJIRI 0:d91a71b2ef96 194 }