Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Diff: main.cpp
- Revision:
- 11:a6eec09b546e
- Parent:
- 10:357b3329620f
- Child:
- 12:5046b7515d5c
diff -r 357b3329620f -r a6eec09b546e main.cpp
--- a/main.cpp Wed Jan 19 07:37:55 2022 +0000
+++ b/main.cpp Thu Jan 20 13:42:30 2022 +0000
@@ -23,6 +23,26 @@
Serial pc(USBTX,USBRX); // UART connection for PC
+struct State { // Struct for state
+ int output; // output value
+ float time; // time in state
+ int nextState[9]; // array of next states
+};
+
+State fsm[11] = {
+ {15,0.5,{0,1,0,0,0,10,0,0,0}}, // Start Temp = 15 Degrees
+ {16,0.5,{1,2,1,1,1,0,1,1,1}}, // 1
+ {17,0.5,{2,3,2,2,2,1,2,2,2}}, //
+ {18,0.5,{3,4,3,3,3,2,3,3,3}}, //
+ {19,0.5,{4,5,4,4,4,3,4,4,4}}, //
+ {20,0.5,{5,6,5,5,5,4,5,5,5}}, //
+ {21,0.5,{6,7,6,6,6,5,6,6,6}}, //
+ {22,0.5,{7,8,7,7,7,6,7,7,7}}, //
+ {23,0.5,{8,9,8,8,8,7,8,8,8}}, //
+ {24,0.5,{9,10,9,9,9,8,9,9,9}}, //
+ {25,0.5,{10,1,10,10,10,9,10,10,10}} //
+};
+
Ticker ticker_menu; // Create Menu ticker object
DigitalOut r_led(LED_RED); // K64F on-board LEDs
@@ -50,6 +70,8 @@
volatile int g_sw2_flag = 0; // flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
volatile int g_menu_timer_flag = 0; // flag - must be volatile as changes within ISR - g_ prefix makes it easier to distinguish it as global
volatile int option = 0; // Menu option selection based on joystick direction
+volatile int g_state = 0; //
+volatile int g_StartTemp = 0; //
void error(); // error function hangs flashing an LED
void init_serial(); // setup serial port
@@ -63,6 +85,7 @@
void OnStartup(); //
void Run(); //
void ConstantMonitoring(); //
+void StartTemp(); //
int main()
{
@@ -82,7 +105,7 @@
lcd.setContrast(0.5); // change set contrast in range 0.0 to 1.0
- OnStartup(); // Call intro screen
+ OnStartup(); // Call intro screen
Run(); // Call main-menu and functions
}
@@ -142,22 +165,22 @@
void OnStartup() // Run some start up display
{
- Buzzer.period(1.0/659.0); // Welcome sounds from Piezo
- Buzzer = 0.5; //
- wait(0.5); //
- Buzzer.period(1.0/494.0); //
- Buzzer = 0.5; //
- wait(0.5); //
- Buzzer.period(1.0/554.0); //
- Buzzer = 0.5; //
- wait(0.5); //
- Buzzer = 0; // Turn off welcome sounds
+ //Buzzer.period(1.0/659.0); // Welcome sounds from Piezo
+ //Buzzer = 0.5; //
+ // wait(0.5); //
+ //Buzzer.period(1.0/494.0); //
+ // Buzzer = 0.5; //
+ // wait(0.5); //
+ //Buzzer.period(1.0/554.0); //
+ // Buzzer = 0.5; //
+ //wait(0.5); //
+ // Buzzer = 0; // Turn off welcome sounds
lcd.clear(); // Clear buffer at start of every loop
lcd.printString("--------------",0,0); // Can directly print strings at specified co-ordinates (must be less than 84 pixels to fit on display)
lcd.printString(" Smart Cold",0,1); // Just a welcome message before auto moving to main menu
lcd.printString(" Storage",0,2); //
lcd.printString(" Monitoring",0,3); //
- lcd.printString("V10 - Jan 2022",0,4); //
+ lcd.printString("V11 - Jan 2022",0,4); //
lcd.printString("--------------",0,5); //
lcd.refresh(); // Need to refresh display after setting pixels or writing strings
wait(5.0); // Leave welcome screen on for designated amount of time
@@ -176,6 +199,7 @@
enum EMenuState // An enum controlling the current state of the display.
{
+ MENUSTATE_StartTemp, //
MENUSTATE_Main, // Defining each menu state to be called upon later
MENUSTATE_Monitor, // Defining each menu state to be called upon later
MENUSTATE_OneOff, // Defining each menu state to be called upon later
@@ -205,9 +229,45 @@
lcd.clear(); // clear buffer at start of every loop
int NewMenuState = MENUSTATTE_Num; // The new menu we want to transition to, if any.
+
switch(MenuState) // Update and Draw whichever menu we're on.
- {
+ {
+ case MENUSTATE_StartTemp: //
+ {
+
+ NumMenuItems = 1; // Dont for get to set this when changing number of items in the menu. We need this to wrap the selection around properly etc.
+ if(SelectedItem >= NumMenuItems) //
+ {
+
+ SelectedItem = 0; // Something has gone wrong, reset selected item.
+ }
+ Direction d = joystick.get_direction();
+
+ StartTemp();
+
+ float g_StartTemp = fsm[g_state].output; // read temperature and print to lcd
+ pc.printf("T = %f K\n",g_state); // Print to serial - allows testing without device attached
+ printf ("Joystick Direction Points = %i\n",d); //
+ printf ("State selected = %i\n", g_StartTemp); //
+ int length = sprintf(buffer," T = %.2f C",g_StartTemp); // print formatted data to buffer - it is important the format specifier ensures the length will fit in the buffer
+ if (length <= 14) // if string will fit on display (assuming printing at x=0)
+ lcd.printString("- Set Target -",0,0); //
+ lcd.printString("---- Temp ----",0,1); //
+ lcd.printString(buffer,0,3); // display on screen
+ lcd.printString("'A' to Select",0,5); //
+ lcd.refresh(); // need to refresh display after setting pixels or writing strings
+ //
+
+ if(bAButtonWasPressed) // If A was pressed then we transition to the selected screen.
+ {
+ if(SelectedItem == 0) // If 0 line is selected, move to detailed menu
+ { // Actually 0 line + 1, see circle draw and selection below
+ NewMenuState = MENUSTATE_Main; //
+ }
+ }
+ }
+ break; //
case MENUSTATE_Main: //
{
@@ -270,6 +330,7 @@
LED01 = 0; // Light LED01 if temperature is over specified - Simulated starting of cold blowers
LED02 = 0; // Light LED02 if temperature is over specified - Simulated starting of cold blowers
LED03 = 0; // Light LED03 if temperature is over specified - Simulated starting of cold blowers
+ printf("WARNING - High Temp!! \n"); //
}
else {
LED01 = 1; // LED01 off if temperature is below specified - Simulated stopping of cold blowers
@@ -283,6 +344,7 @@
LED04 = 0; // Light LED04 if temperature is over specified - Simulated starting of heaters
LED05 = 0; // Light LED05 if temperature is over specified - Simulated starting of heaters
LED06 = 0; // Light LED06 if temperature is over specified - Simulated starting of heaters
+ printf("WARNING - Low Temp!! \n"); //
}
else {
LED04 = 1; // LED04 off if temperature is above specified - Simulated stopping of heaters
@@ -305,7 +367,7 @@
}
}
break;
- case MENUSTATE_OneOff: // Call a one off measuremnt menu following top menu selection
+ case MENUSTATE_OneOff: // Call a one off measurement menu following top menu selection
{
NumMenuItems = 1; // Detail the number of items in Menu - need this to wrap the selection around properly etc.
@@ -399,13 +461,13 @@
SelectedItem = 0; // Reset the selected item.
lcd.clear(); // Clear the display for one frame on state transition.
- } // Could do something else like invert colour etc here.
+ }
else
{
- // If we have not selected to move to a new menu.
- unsigned int SelectionMarkerRadius = 4 ; // Draw a marker circle at end of line to show which is the currently selected item.
- unsigned int SelectionMarkerX = WIDTH - (2 * SelectionMarkerRadius);
+
+ unsigned int SelectionMarkerRadius = 4; // If we have not selected to move to a new menu.
+ unsigned int SelectionMarkerX = WIDTH - (2 * SelectionMarkerRadius); // Draw a marker circle at end of line to show which is the currently selected item.
unsigned int SelectionMarkerY = (HEIGHT / 5) * (SelectedItem + 1); // +1 because of the menu title being on first row
lcd.drawCircle(SelectionMarkerX, SelectionMarkerY, SelectionMarkerRadius, FILL_BLACK); // Fill the circle black so it can be seen easily
@@ -434,5 +496,14 @@
}
}
}
-
+void StartTemp() //
+{
+ Direction d = joystick.get_direction(); //
+
+ joystick.init();
+
+ g_StartTemp = fsm[g_state].output; // set ouput depending on current state
+ wait(fsm[g_state].time); // wait in that state for desired time
+ g_state = fsm[g_state].nextState[d]; // read input and update curent state
+}