Sensor Data - first assignment CO838
Dependencies: mbed C12832 FXOS8700Q LM75B eCompass_FPU_Lib
Sensor Data - Project developed by Jean-Paul Saysana (jls44)
First assignment for the Internet of Things and Mobile Devices CO838 module
University of Kent (2016-2017)
Functionalities:
- Temperature Sensor
- Compass
- Music box
- Potentiometer that changes LED colours
Libraries used: C12832, eCompass_FPU_Lib, FXOS8700Q, LM75B
Diff: src/SensorData.cpp
- Revision:
- 0:4b83b332b327
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/SensorData.cpp Fri Feb 24 11:25:05 2017 +0000 @@ -0,0 +1,264 @@ +/* Developed by Jean-Paul Saysana - jls44 - MSc Student in Computer Security */ +/* Internet of Things and Mobile Devices - CO838 University of Kent */ +/* Class SensorData which is the main Object of this project */ +/* It contains every objects and sensor of this project and combine it together*/ + +#include "SensorData.h" + +/* Instantiate UP, DOWN, BACK(SW2), ENTER(SW3) buttons. */ +InterruptIn up(A2); +InterruptIn down(A3); +InterruptIn enter(D4); +InterruptIn pause(SW2); +InterruptIn back(SW3); + +/* Instantiate the potentiometer and the serial host to communicate with a computer. */ +AnalogIn pot (A1); +Serial host(USBTX, USBRX); + +/* Initialize the object lcd, speaker, compass and led */ +SensorData::SensorData() : lcd(D11, D13, D12, D7, D10), speaker(D6), + compass(FXOS8700CQ_SLAVE_ADDR1), led(D5, D8, D9) { + /* Setting every value to default, the position of the selector at 0 */ + pos = 0; + /* Point temperature */ + epage = TEMPERATURE; + /* setting the wait time to 0.7s by default */ + delay = 0.7; + /* if quit == 3, end the program */ + quit = 0; + /* pause variable set to false */ + pause_sensor = false; +} + +/* Init the interruption commmand */ +void SensorData::InitCommand() { + up.rise(callback(this, &SensorData::Up)); + down.rise(callback(this, &SensorData::Down)); + enter.rise(callback(this, &SensorData::Enter)); + pause.rise(callback(this, &SensorData::Pause)); + back.rise(callback(this, &SensorData::Back)); +} + +/* Method that start the SensorData */ +void SensorData::Start() { + /* Display the welcome animation when user start the mbed card. */ + lcd.Welcome(); + /* Initialize the buttons(interruptions) */ + InitCommand(); + /* Display the menu selection */ + MenuSelection(); + /* Loop indefinetly until user quit the program. */ + while(quit < 3) { + /* Main loop checking the position of the user */ + MainLoop(); + /* Waiting delay time for user display */ + wait(delay); + } + lcd.PrintQuit(); +} + +/* Change LED color depending on the degree of the potentiometer */ +void SensorData::ChangeLED() { + if ((float)pot < 0.20f) { + return led.SwitchOffAll(); + } + else if ((float)pot > 0.80f) { + return led.SwitchOn(LED::BLUE); + } + else if ((float)pot > 0.60f) { + return led.SwitchOn(LED::GREEN); + } + else if ((float)pot > 0.40f) { + return led.SwitchOn(LED::RED); + } +} + +/* Main loop that check the page of the player */ +void SensorData::MainLoop() { + switch (epage) { +/* if the player clicked on "Current temperature", it displays the temperature */ + case ENTER_TEMP: + if (!pause_sensor) { + DisplayTemperature(); + } + break; +/* if the player clicked on "Compass", it displays the compass */ + case ENTER_COMPASS: + if (!pause_sensor) { + DisplayCompass(); + } + break; + default: + break; + } + /* Checking */ + ChangeLED(); +} + +/* Display the temperature in the LCD screen */ +void SensorData::DisplayTemperature() { + lcd.Clear(); + /* Get the temperature unit. If it's in fahrenheit, unit character is 'F' + Otherwise, it's set to 'C'. */ + char t_unit = (ts.IsFahrenheit() == true ? 'F' : 'C'); + /* Print in the LCD screen. */ + lcd.PrintDelay(delay); + lcd.PrintTemperature(ts.GetTemperature(), t_unit); + /* Report temperature over USB Serial link*/ + host.printf("Temperature is %.2f %c \r\n", ts.GetTemperature(), t_unit); +} + +/* Display compass */ +void SensorData::DisplayCompass() { + lcd.Clear(); + /* Get compass angle */ + float angle = compass.GetCompass(); + /* If the angle is below or between certains values. */ + /* the dir variable will store the direction. */ + std::string dir = ""; + if (angle > 45 && angle <= 135) { dir = "East"; } + else if (angle > 135 && angle <= 225) { dir = "South"; } + else if (angle > 225 && angle <= 315) { dir = "West"; } + else { dir = "North"; } + lcd.PrintDelay(delay); + lcd.PrintCompass(angle, dir); + host.printf("Compass angle = %.2f - Direction = %s \r\n", compass.GetCompass(), dir.c_str()); +} + +/* Interruption with enter button */ +void SensorData::Enter() { + // set quit variable at 0 + quit = 0; + /* play sound, enter to the page, switch mode for the temperature. */ + speaker.Fire(); + switch (epage) { + case TEMPERATURE: + epage = ENTER_TEMP; + break; + case COMPASS: + epage = ENTER_COMPASS; + break; + case MUSIC: + speaker.PlayMusic(); + break; + case ENTER_TEMP: + ts.SwitchMode(); + break; + case ENTER_COMPASS: + break; + default: + break; + } +} + +void SensorData::SwitchPause() { + pause_sensor = (pause_sensor == false ? true : false); +} + +/* Press back, show back menu selection */ +void SensorData::Pause() { + speaker.Fire(); + switch (epage) { + case ENTER_COMPASS: + SwitchPause(); + break; + case ENTER_TEMP: + SwitchPause(); + break; + default: + break; + } +} + +/* Press back, show back menu selection */ +void SensorData::Back() { + pause_sensor = false; + speaker.Fire(); + switch (epage) { + case ENTER_COMPASS: + epage = COMPASS; + break; + case ENTER_TEMP: + epage = TEMPERATURE; + break; + default: + ++quit; + break; + } + MenuSelection(); +} + +/* Press up button, change delay if entered somewhere else change selector position */ +void SensorData::Up() { + // set variable quit at 0 + quit = 0; + switch (epage) { + case ENTER_TEMP: + if (delay < 2) { + delay += 0.1f; + } + break; + case ENTER_COMPASS: + if (delay < 2) { + delay += 0.1f; + } + break; + default: + if (pos > 0) { + --pos; + ChangePosition(); + } + break; + } +} + +/* press down and change position*/ +void SensorData::Down() { + // set variable quit at 0 + quit = 0; + switch (epage) { + case ENTER_TEMP: + if (delay > 0.4f) { + delay -= 0.1f; + } + break; + case ENTER_COMPASS: + if (delay > 0.4f) { + delay -= 0.1f; + } + break; + default: + if (pos < MUSIC) { + ++pos; + ChangePosition(); + } + break; + } +} + +/* change epage position */ +void SensorData::ChangePosition() { + switch (pos) { + case TEMPERATURE: + epage = TEMPERATURE; + break; + case COMPASS: + epage = COMPASS; + break; + case MUSIC: + epage = MUSIC; + break; + default: + break; + } + MenuSelection(); + speaker.Move(); +} + +/* Print menu selection */ +void SensorData::MenuSelection() { + wait(0.1); + lcd.Clear(); + lcd.PrintMenu(pos); +}