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 MCP23017 mbed-rtos WattBob_TextLCD
main.cpp
- Committer:
- Steaar
- Date:
- 2018-03-27
- Revision:
- 4:72c487215487
- Parent:
- 3:d888509e77b8
- Child:
- 5:e62e0e3084fc
File content as of revision 4:72c487215487:
#include "mbed.h"
#include "rtos.h"
#include "MCP23017.h"
#include "WattBob_TextLCD.h"
#define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT)
#define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT)
MCP23017 *par_port; // pointer to 16-bit parallel I/O object
WattBob_TextLCD *lcd; // pointer to 2*16 chacater LCD object
AnalogIn accel(p15); // Analog
AnalogIn brake(p16);
float speed = 0;
float aveSpeed;
float acc = 0;
float br = 0;
float dif;
float distance = 0;
Timer tim, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;// integrate with wait?
long int t;
int r;
int indicount = 0;
DigitalOut sideLights(LED1); // mbed out
DigitalOut lIndicator(LED2);
DigitalOut rIndicator(LED3);
DigitalOut engLight(LED4);
DigitalOut brakeLights(p6); // redbox out
DigitalOut fluxCapacitor(p7);
DigitalIn lightSwitch(p8); // switches
DigitalIn lIndicate(p9);
DigitalIn rIndicate(p10);
DigitalIn engine(p5);
Serial pc(USBTX, USBRX); // serial tx, rx
Thread sp;
Thread task1;
Thread task2;
Thread task3;
Thread task4;
Thread task5;
Thread task6;
Thread task7;
Thread task8;
Thread task9;
Thread task10;
typedef struct { // mail
float m_speed;
float m_acc;
float m_br;
uint32_t counter; // A counter value
} mail_t;
Mail<mail_t, 100> mail_box;
void acceleration() //run at 20hz // 1. read brake and accelerator 10
{
while (1) {
acc = accel.read()*3.3;
br = brake.read()*3.3;
Thread::wait(500-r);
}
}
void getSpeed() // 20Hz calculation for speed & distance
{
while (1) {
dif = acc - br;
t = tim.read();
speed = speed + (dif*t*3.6);
if (speed < 0) {
speed = 0;
}
distance = speed*t + (0.5*dif*(t*t))/1000;
Thread::wait(100);
}
}
void ignition() // 2. Read engine on/off show LED 2
{
while (1) {
if (engine == 1) {
engLight = 1;
}
Thread::wait(500-r);
}
}
void speedo() // 3. Average last n speed readings 5
{
while (1) {
for (int i = 0; i<3; i++) {
aveSpeed = speed + aveSpeed;
}
speed = speed/4;
Thread::wait(200);
}
}
void braking() // 4. Brake indicated by LED 2
{
while (1) {
if ( br>0) {
brakeLights = 1;
}
Thread::wait(500);
}
}
void greatScott() // 5. if speed > 88 LED on 1
{
while (1) {
if (speed > 140) {
fluxCapacitor = 1;
}
Thread::wait(1000);
}
}
void LCD() // 6. display odometer and speed 2
{
while (1) {
t = tim.read();
distance = speed * (t/3600);
lcd->locate(0,0);
lcd->printf("KM:%0.1f",distance);
lcd->locate(1,0);
lcd->printf("KMPH:%0.1f",speed);
Thread::wait(500);
}
}
void send_thread (void) // 7. Send speed, acc, brake to MAILq 0.2
{
uint32_t i = 0;
while (true) {
i++; // fake data update
mail_t *mail = mail_box.alloc();
mail->m_speed = speed;
mail->m_acc = acc;
mail->m_br = br;
mail->counter = i;
mail_box.put(mail);
osEvent evt = mail_box.get();
if (evt.status == osEventMail) {
mail_t *mail = (mail_t*)evt.value.p;
printf("\nSpeed: %.1f \n\r" , mail->m_speed);
printf("Acceleration: %.2f \n\r" , mail->m_acc);
printf("Braking: %.1f \n\r", mail->m_br);
mail_box.free(mail);
}
Thread::wait(5000);
}
}
void toSerial() // 8. MAIL q to serial PC 0.05
{
while (1) {
osEvent evt = mail_box.get();
mail_t *mail = (mail_t*)evt.value.p;
pc.printf("\nSpeed: %.2f \n\r", mail->m_speed);
pc.printf("Acceleration: %.2f \n\r", mail->m_acc);
pc.printf("Braking: %.2f \n\r", mail->m_br);
Thread::wait(20000);
}
}
void lights() // 9. set side lights 1
{
while (1) {
if (lightSwitch == 1) {
sideLights = 1;
} else {
sideLights = 0;
}
Thread::wait(1000);
}
}
void indicators() // 10. flash indicators 0.5
{
while (1) {
if ((lIndicate == 1) && (rIndicate == 1)) { // If both switch on
lIndicator = !lIndicator; // both LED at 2Hz
rIndicator = !rIndicator;
wait(0.5);
}
else if ((lIndicate == 1) && (rIndicate == 0)) { // if left switch on
lIndicator = !lIndicator; // left LED at 1Hz
wait(1);
}
else if ((lIndicate == 0) && (rIndicate == 1)) { // if right switch on
rIndicator = !rIndicator; // right LED at 1Hz
wait(1);
}
Thread::wait(2000);
}
}
int main()
{
par_port = new MCP23017(p9, p10, 0x40); // initialise 16-bit I/O chip
lcd = new WattBob_TextLCD(par_port); // initialise 2*26 char display
par_port->write_bit(1,BL_BIT); // turn LCD backlight ON
sp.start(getSpeed); //20
task1.start(acceleration); //10
task2.start(ignition); //2
task3.start(speedo); //5
task4.start(braking); //2
task5.start(greatScott); //1
task6.start(LCD); //2
task7.start(callback(send_thread)); //0.2
task8.start(toSerial); //0.05
task9.start(lights); //1
task10.start(indicators); //0.5
}