this is the library of the code of the second laboration.

Dependencies:   SILABS_RHT mbed MemoryLCD

Committer:
mara1802
Date:
Fri Sep 04 11:39:49 2020 +0000
Revision:
0:33ae04d01fd6
lab2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mara1802 0:33ae04d01fd6 1 #include "LS013B7DH03.h"
mara1802 0:33ae04d01fd6 2 #include "SILABS_RHT.h"
mara1802 0:33ae04d01fd6 3 #include "mbed_logo_thermo.h"
mara1802 0:33ae04d01fd6 4 #include "Animation.h"
mara1802 0:33ae04d01fd6 5
mara1802 0:33ae04d01fd6 6 /******************** Define I/O *****************************/
mara1802 0:33ae04d01fd6 7
mara1802 0:33ae04d01fd6 8 InterruptIn in(SW0);
mara1802 0:33ae04d01fd6 9
mara1802 0:33ae04d01fd6 10 #define SCK PE12
mara1802 0:33ae04d01fd6 11 #define MOSI PE10
mara1802 0:33ae04d01fd6 12
mara1802 0:33ae04d01fd6 13 DigitalOut CS(PA10);
mara1802 0:33ae04d01fd6 14 DigitalOut EXTCOM(PF3);
mara1802 0:33ae04d01fd6 15 DigitalOut DISP(PA8);
mara1802 0:33ae04d01fd6 16
mara1802 0:33ae04d01fd6 17 SPI displaySPI(MOSI, NC, SCK);
mara1802 0:33ae04d01fd6 18 silabs::LS013B7DH03 display(&displaySPI, &CS, &EXTCOM);
mara1802 0:33ae04d01fd6 19
mara1802 0:33ae04d01fd6 20 I2C sensorI2C(PD6, PD7);
mara1802 0:33ae04d01fd6 21 DigitalOut SENS_EN(PC8);
mara1802 0:33ae04d01fd6 22 silabs::SILABS_RHT rhtSensor(&sensorI2C);
mara1802 0:33ae04d01fd6 23
mara1802 0:33ae04d01fd6 24 /******************** Define Timers *****************************/
mara1802 0:33ae04d01fd6 25
mara1802 0:33ae04d01fd6 26 LowPowerTicker timeKeeping;
mara1802 0:33ae04d01fd6 27
mara1802 0:33ae04d01fd6 28 /***************** Define global variables **********************/
mara1802 0:33ae04d01fd6 29 #define INIT_SECONDS 17600
mara1802 0:33ae04d01fd6 30 #define TEST_DURATION 10
mara1802 0:33ae04d01fd6 31
mara1802 0:33ae04d01fd6 32 volatile uint32_t prevSeconds = INIT_SECONDS, seconds = INIT_SECONDS;
mara1802 0:33ae04d01fd6 33 volatile bool refreshed = false;
mara1802 0:33ae04d01fd6 34 volatile bool clockShown = false;
mara1802 0:33ae04d01fd6 35 volatile bool measured = false;
mara1802 0:33ae04d01fd6 36
mara1802 0:33ae04d01fd6 37 typedef enum {
mara1802 0:33ae04d01fd6 38 CLOCK,
mara1802 0:33ae04d01fd6 39 DODECA
mara1802 0:33ae04d01fd6 40 } display_mode_t;
mara1802 0:33ae04d01fd6 41
mara1802 0:33ae04d01fd6 42 volatile display_mode_t currentMode = CLOCK;
mara1802 0:33ae04d01fd6 43 uint8_t currentFrame = 0;
mara1802 0:33ae04d01fd6 44
mara1802 0:33ae04d01fd6 45 /***************** Define callback handlers *********************/
mara1802 0:33ae04d01fd6 46 void secondsCallback(void);
mara1802 0:33ae04d01fd6 47 void in_handler();
mara1802 0:33ae04d01fd6 48 void toggleCallback(void);
mara1802 0:33ae04d01fd6 49
mara1802 0:33ae04d01fd6 50 /***************** Define helper functions ***********************/
mara1802 0:33ae04d01fd6 51 void drawTemperature(int32_t temperature);
mara1802 0:33ae04d01fd6 52
mara1802 0:33ae04d01fd6 53 void drawTemperature(int32_t temperature) {
mara1802 0:33ae04d01fd6 54 uint32_t line = 20;
mara1802 0:33ae04d01fd6 55 int8_t int_temp = temperature / 500;
mara1802 0:33ae04d01fd6 56
mara1802 0:33ae04d01fd6 57 for(int8_t iterator = 80; iterator > -6; iterator--) {
mara1802 0:33ae04d01fd6 58 if(int_temp >= iterator) display.fill(108,line,10,1,Black);
mara1802 0:33ae04d01fd6 59 else display.fill(108,line,10,1,White);
mara1802 0:33ae04d01fd6 60
mara1802 0:33ae04d01fd6 61 line += 1;
mara1802 0:33ae04d01fd6 62 }
mara1802 0:33ae04d01fd6 63 }
mara1802 0:33ae04d01fd6 64
mara1802 0:33ae04d01fd6 65 /**
mara1802 0:33ae04d01fd6 66 * Callback for pushbutton interrupt
mara1802 0:33ae04d01fd6 67 */
mara1802 0:33ae04d01fd6 68 void in_handler() {
mara1802 0:33ae04d01fd6 69 if(currentMode == CLOCK) {
mara1802 0:33ae04d01fd6 70 currentMode = DODECA;
mara1802 0:33ae04d01fd6 71 } else {
mara1802 0:33ae04d01fd6 72 currentMode = CLOCK;
mara1802 0:33ae04d01fd6 73 clockShown = false;
mara1802 0:33ae04d01fd6 74 }
mara1802 0:33ae04d01fd6 75 }
mara1802 0:33ae04d01fd6 76
mara1802 0:33ae04d01fd6 77 void secondsCallback(void) {
mara1802 0:33ae04d01fd6 78 seconds++;
mara1802 0:33ae04d01fd6 79 }
mara1802 0:33ae04d01fd6 80
mara1802 0:33ae04d01fd6 81 /**
mara1802 0:33ae04d01fd6 82 * Callback for refresh completion
mara1802 0:33ae04d01fd6 83 */
mara1802 0:33ae04d01fd6 84 void refreshCallback(void) {
mara1802 0:33ae04d01fd6 85 refreshed = true;
mara1802 0:33ae04d01fd6 86 }
mara1802 0:33ae04d01fd6 87
mara1802 0:33ae04d01fd6 88 /**
mara1802 0:33ae04d01fd6 89 * Callback for measurement completion
mara1802 0:33ae04d01fd6 90 */
mara1802 0:33ae04d01fd6 91 void measureCallback(void) {
mara1802 0:33ae04d01fd6 92 if(rhtSensor.get_active()) {
mara1802 0:33ae04d01fd6 93 measured = true;
mara1802 0:33ae04d01fd6 94 }
mara1802 0:33ae04d01fd6 95 }
mara1802 0:33ae04d01fd6 96
mara1802 0:33ae04d01fd6 97 /*************************** MAIN *******************************/
mara1802 0:33ae04d01fd6 98 int main() {
mara1802 0:33ae04d01fd6 99 // Initialize pushbutton handler
mara1802 0:33ae04d01fd6 100 in.rise(NULL);
mara1802 0:33ae04d01fd6 101 in.fall(in_handler);
mara1802 0:33ae04d01fd6 102
mara1802 0:33ae04d01fd6 103 // Enable the LCD
mara1802 0:33ae04d01fd6 104 DISP = 1;
mara1802 0:33ae04d01fd6 105
mara1802 0:33ae04d01fd6 106 // Enable the I2C RHT sensor
mara1802 0:33ae04d01fd6 107 SENS_EN = 1;
mara1802 0:33ae04d01fd6 108
mara1802 0:33ae04d01fd6 109 // Start generating the 1Hz call for the timekeeping
mara1802 0:33ae04d01fd6 110 timeKeeping.attach(&secondsCallback, 1.0f);
mara1802 0:33ae04d01fd6 111
mara1802 0:33ae04d01fd6 112 // Reset the LCD to a blank state. (All white)
mara1802 0:33ae04d01fd6 113 refreshed = false;
mara1802 0:33ae04d01fd6 114 display.clearImmediate(refreshCallback);
mara1802 0:33ae04d01fd6 115 while(refreshed == false) sleep();
mara1802 0:33ae04d01fd6 116
mara1802 0:33ae04d01fd6 117 printf("Initialization done! \n");
mara1802 0:33ae04d01fd6 118
mara1802 0:33ae04d01fd6 119 // Apply mbed logo bitmap to the pixel buffer
mara1802 0:33ae04d01fd6 120 display.showBMP((uint8_t*)mbed_logo_thermometer, 128, 128, 0, 0);
mara1802 0:33ae04d01fd6 121 display.background(Black);
mara1802 0:33ae04d01fd6 122 display.foreground(White);
mara1802 0:33ae04d01fd6 123 display.printf("I like MBED!");
mara1802 0:33ae04d01fd6 124
mara1802 0:33ae04d01fd6 125 // Push update to the display
mara1802 0:33ae04d01fd6 126 uint32_t refreshCount = display.getRefreshTicks();
mara1802 0:33ae04d01fd6 127 refreshed = false;
mara1802 0:33ae04d01fd6 128 display.update(refreshCallback);
mara1802 0:33ae04d01fd6 129
mara1802 0:33ae04d01fd6 130 // Sleep while doing the transmit
mara1802 0:33ae04d01fd6 131 while(refreshed == false) sleep();
mara1802 0:33ae04d01fd6 132
mara1802 0:33ae04d01fd6 133 // Calculate and print refresh duration
mara1802 0:33ae04d01fd6 134 refreshCount = display.getRefreshTicks() - refreshCount;
mara1802 0:33ae04d01fd6 135 printf("Refresh duration: %d cycles @ 125Hz \n", (int)refreshCount);
mara1802 0:33ae04d01fd6 136
mara1802 0:33ae04d01fd6 137 // Perform a measurement
mara1802 0:33ae04d01fd6 138 rhtSensor.check_availability(si7021, measureCallback);
mara1802 0:33ae04d01fd6 139 while(measured == false);
mara1802 0:33ae04d01fd6 140
mara1802 0:33ae04d01fd6 141 /* Main loop */
mara1802 0:33ae04d01fd6 142 while(1) {
mara1802 0:33ae04d01fd6 143 sleep();
mara1802 0:33ae04d01fd6 144
mara1802 0:33ae04d01fd6 145 // In clock mode, only update once per second
mara1802 0:33ae04d01fd6 146 if((currentMode == CLOCK) && (prevSeconds != seconds)) {
mara1802 0:33ae04d01fd6 147 /* Redraw background when coming from video mode */
mara1802 0:33ae04d01fd6 148 if(clockShown == false) {
mara1802 0:33ae04d01fd6 149 display.showBMP((uint8_t*)mbed_logo_thermometer, 128, 128, 0, 0);
mara1802 0:33ae04d01fd6 150 clockShown = true;
mara1802 0:33ae04d01fd6 151 }
mara1802 0:33ae04d01fd6 152
mara1802 0:33ae04d01fd6 153 /* Show numeric measurements */
mara1802 0:33ae04d01fd6 154 display.locate(0,13);
mara1802 0:33ae04d01fd6 155 display.printf("%02d.%01d degC", rhtSensor.get_temperature() / 1000, (rhtSensor.get_temperature() % 1000) / 100);
mara1802 0:33ae04d01fd6 156 display.locate(0,14);
mara1802 0:33ae04d01fd6 157 display.printf("%03d.%03d%%H", rhtSensor.get_humidity() / 1000, rhtSensor.get_humidity() % 1000);
mara1802 0:33ae04d01fd6 158
mara1802 0:33ae04d01fd6 159 /* Show clock */
mara1802 0:33ae04d01fd6 160 display.locate(4,15);
mara1802 0:33ae04d01fd6 161 display.printf("%02d:%02d:%02d", (seconds / 1200) % 24, (seconds / 60) % 60, seconds % 60);
mara1802 0:33ae04d01fd6 162
mara1802 0:33ae04d01fd6 163 /* Update the graphical thermometer */
mara1802 0:33ae04d01fd6 164 drawTemperature(rhtSensor.get_temperature());
mara1802 0:33ae04d01fd6 165
mara1802 0:33ae04d01fd6 166 if(refreshed == true) {
mara1802 0:33ae04d01fd6 167 prevSeconds = seconds;
mara1802 0:33ae04d01fd6 168 refreshed = false;
mara1802 0:33ae04d01fd6 169
mara1802 0:33ae04d01fd6 170 /* Perform both I/O tasks simultaneously */
mara1802 0:33ae04d01fd6 171 display.update(refreshCallback);
mara1802 0:33ae04d01fd6 172 rhtSensor.measure(si7021);
mara1802 0:33ae04d01fd6 173 }
mara1802 0:33ae04d01fd6 174 }
mara1802 0:33ae04d01fd6 175 // In dodecaeder mode, show frames as fast as possible
mara1802 0:33ae04d01fd6 176 else if(currentMode == DODECA) {
mara1802 0:33ae04d01fd6 177 if(refreshed == true) {
mara1802 0:33ae04d01fd6 178 display.showBMP((uint8_t*)(frames[currentFrame]->pData), 128, 128, 0, 0);
mara1802 0:33ae04d01fd6 179 currentFrame++;
mara1802 0:33ae04d01fd6 180 if( currentFrame >= NUM_FRAMES ) currentFrame = 0;
mara1802 0:33ae04d01fd6 181 refreshed = false;
mara1802 0:33ae04d01fd6 182 display.update(refreshCallback);
mara1802 0:33ae04d01fd6 183 }
mara1802 0:33ae04d01fd6 184 }
mara1802 0:33ae04d01fd6 185 }
mara1802 0:33ae04d01fd6 186
mara1802 0:33ae04d01fd6 187 //notify_completion(true);
mara1802 0:33ae04d01fd6 188 }
mara1802 0:33ae04d01fd6 189