![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
This code emulates a washing machine.
main.cpp@0:d91a71b2ef96, 2022-05-19 (annotated)
- Committer:
- EDISON_NGUNJIRI
- Date:
- Thu May 19 15:57:58 2022 +0000
- Revision:
- 0:d91a71b2ef96
Version1 washing emulator
Who changed what in which revision?
User | Revision | Line number | New 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 | } |