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:
- 5:e62e0e3084fc
- Parent:
- 4:72c487215487
- Child:
- 6:a026e0651ad5
File content as of revision 5:e62e0e3084fc:
#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;
float kmph;
float aveSpeed;
float acc;
float br;
float distance = 0;
Timer tim, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;// integrate with wait?
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 engine(p5); // switches
DigitalIn lightSwitch(p8);
DigitalIn lIndicate(p11);
DigitalIn rIndicate(p12);
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;
Semaphore ac(1);
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() // 1. read brake and accelerator 10
{
while (1) {
//ac.wait();
acc = accel.read()*3.3;
br = brake.read()*3.3;
//ac.release();
Thread::wait(100);
}
}
void getSpeed() // 20Hz calculation for speed & distance
{
while (1) {
speed = (acc - br)*16.835;
if (speed < 0) {
speed = 0;
}
kmph = speed*3.6;
distance = distance + (speed*0.05)/1000;
Thread::wait(50);
}
}
void ignition() // 2. Read engine on/off show LED 2
{
while (1) {
if (engine.read() > 0) {
engLight = 1;
}
else{
engLight = 0;
}
Thread::wait(500);
}
}
void speedo() // 3. Average last n speed readings 5
{
while (1) {
for (int i = 0; i<3; i++) {
aveSpeed = speed + aveSpeed;
}
aveSpeed = speed/4;
Thread::wait(200);
}
}
void braking() // 4. Brake indicated by LED 2
{
while (1) {
if ( br > 0) {
brakeLights = 1;
}
else{
brakeLights = 0;
}
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) {
lcd->locate(0,0);
lcd->printf("KM:%0.1f",distance);
lcd->locate(1,0);
lcd->printf("KMPH:%.1f",kmph);
lcd->locate(0,8);
//ac.wait();
//lcd->printf("a:%0.1f",dif);
lcd->locate(1,8);
//ac.release();
//lcd->printf("b:%d",engine.read());
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 .setPriority();
// 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
}