Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
KPIT_MBED_worksheet/Topic5/Worksheet.md
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
131 lines (96 sloc)
3.42 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# In our First Task we are going to make use of the Simulator to read from a Sensor | |
## Simulator: Starting Point | |
~~~c | |
#include "mbed.h" | |
#include "mbed_events.h" | |
#include "Sht31.h" | |
// An EventQueue is a very useful construct in Mbed OS, it allows you to schedule events | |
// and to defer from one context to another (e.g. from ISR to normal thread) without | |
// writing your own state machines, and while maintaining context. | |
// https://os.mbed.com/docs/v5.6/tutorials/the-eventqueue-api.html | |
EventQueue queue; | |
DigitalOut led1(LED1); | |
DigitalOut led2(LED2); | |
InterruptIn btn(BUTTON1); | |
//Setup the Sensor | |
Sht31 sht31(I2C_SDA, I2C_SCL); | |
void blink_led() { | |
led1 = !led1; | |
float temp = sht31.readTemperature (); | |
float humidity = sht31.readHumidity(); | |
printf("Temp %.2f Humidity %.2f\n", temp, humidity); | |
} | |
// This does not run in an ISR, so it's safe to use `printf` or other blocking calls | |
void btn_handler() { | |
printf("Button Pressed\n"); | |
led2 = !led2; | |
} | |
int main() { | |
// Schedule an event to run every second | |
queue.call_every(1000, &blink_led); | |
// Normally code in the `fall` handler runs in an ISR, | |
// but you can directly defer it to the thread that runs the queue | |
btn.rise(queue.event(&btn_handler)); | |
// Because the simulator does not support multiple threads, | |
// we have to call dispatch_forever from the main thread. | |
// Typically you'd run this on a separate thread within Mbed's RTOS. | |
queue.dispatch_forever(); | |
} | |
~~~ | |
## Simulator Task: | |
- Get the Sensor to read and print the temperature value when the button is pressed | |
- Store the Periodic Readings in Global Variables (no threads so no need to lock) | |
- Create a new event that runs every 0.5 Seconds | |
- Check the Temperature reading, and do something if it is above 30C | |
- Check the Temperature reading, and get an LED to blink if it is below 5C (you will need to trigger a new event) | |
# Using the On Board Accelerometer: | |
The Discovery board has an On board accelerometer. | |
- https://os.mbed.com/users/grantphillips/code/LIS3DSH/docs/tip/classLIS3DSH.html | |
To get this working we first need to install the relevant Libaries to platform IO | |
- In the Homepage | |
- Libaries window | |
- Search and Install the relevant Libary | |
## Accelerometr: Starting point | |
~~~c | |
#include "mbed.h" | |
#include "mbed_events.h" | |
#include "LIS3DSH.h" | |
//Leds for Debugging | |
DigitalOut led1(LED1); | |
DigitalOut led2(LED2); | |
//Hopefully Serial | |
Serial uart(PC_6,PC_7); | |
//Setup Accelerometr | |
LIS3DSH acc(PA_7, PA_6, PA_5, PE_3); | |
//Thread for our event loop | |
Thread eventThread; | |
//Event Loop itself | |
EventQueue theQueue(32 * EVENTS_EVENT_SIZE); | |
//Function to read the values | |
void readValues(){ | |
led2 = !led2; | |
int16_t X, Y, Z; | |
acc.ReadData(&X, &Y, &Z); //read X, Y, Z values | |
uart.printf("X: %d Y: %d Z: %d", X, Y, Z); | |
} | |
int main(){ | |
//Hopefully | |
uart.baud(9600); | |
uart.printf("Testing\n"); | |
//And setup event Queue | |
eventThread.start(callback(&theQueue, &EventQueue::dispatch_forever)); | |
theQueue.call_every(1000, &readValues); | |
while(1){ | |
//Standard Blinking, Let me know things are alive | |
led1 = !led1; | |
wait(1.0); | |
} | |
} | |
~~~ | |
# TASK | |
- Using the Previous task as a Guide | |
- Take a reading every 0.25 Seconds | |
- Store the readings in a relevant object | |
- Check the Values of the X and Y Axis every second | |
- Light the Relevant LED's to show which way the board is facing | |
- Print a Debug message Every Second. | |