Final Project for ECE-4180 Fall 2022. Interface with ENS160 AQI sensor and display the readings on uLCD.
Dependencies: 4DGL-uLCD-SE ENS160_Library mbed PinDetect mbed-rtos
main.cpp
- Committer:
- krishnamvs
- Date:
- 19 months ago
- Revision:
- 11:03f86b377280
- Parent:
- 10:112572fbb168
File content as of revision 11:03f86b377280:
#include "mbed.h"
#include "rtos.h"
#include "uLCD_4DGL.h"
#include "PinDetect.h"
#include "ens160_i2c.h"
ENS160 myENS(p9, p10, ENS160_ADDRESS_HIGH);
uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin;
PinDetect pb(p8);
Mutex mutex;
uint8_t volatile aqi;
uint32_t volatile co2,tvoc;
uint8_t volatile current_screen = 0;
void redrawBG()
{
mutex.lock();
uLCD.color(WHITE);
uLCD.circle(64,64,64,WHITE);
uLCD.filled_circle(64,64,60,BLUE);
mutex.unlock();
}
void getData(void const *args)
{
while(1)
{
aqi = myENS.getAQI();
co2 = myENS.getECO2();
tvoc = myENS.getTVOC();
Thread::wait(100);
}
}
void allScreens()
{
uLCD.text_width(1.75); //4X size text
uLCD.text_height(1.75);
uLCD.locate(6,4);
uLCD.printf("AQI:");
uLCD.printf("%d",aqi);
uLCD.locate(4,7);
uLCD.printf("C02:");
uLCD.printf("%d", co2);
uLCD.printf("ppm");
uLCD.locate(4,10);
uLCD.printf("TVOC:");
uLCD.printf("%d",tvoc);
uLCD.printf("ppb");
}
void AQI()
{
uLCD.text_width(2); //4X size text
uLCD.text_height(2);
uLCD.locate(3,3);
uLCD.printf("AQI\n");
uLCD.locate(4,4);
uLCD.printf("%d",aqi);
}
void CO2()
{
uLCD.text_width(2); //4X size text
uLCD.text_height(2);
uLCD.locate(3,3);
uLCD.printf("C02\n");
uLCD.locate(1,4);
uLCD.printf("%d", co2);
uLCD.printf("ppm");
}
void TVOC()
{
uLCD.text_width(2); //4X size text
uLCD.text_height(2);
uLCD.locate(3,3);
uLCD.printf("TVOC\n");
uLCD.locate(2,4);
uLCD.printf("%d",tvoc);
uLCD.printf("ppb");
}
void updateScreen()
{
mutex.lock();
switch (current_screen)
{
case 0:
allScreens();
break;
case 1:
AQI();
break;
case 2:
TVOC();
break;
case 3:
CO2();
break;
}
mutex.unlock();
}
void pb_hit_callback()
{
current_screen = current_screen + 1;
if (current_screen > 3)
current_screen = 0;
}
int main()
{
pb.mode(PullUp);
wait(.001);
pb.attach_deasserted(&pb_hit_callback);
pb.setSampleFrequency();
Thread t1(getData);
redrawBG();
uint8_t oldScreen = current_screen;
while(1)
{
if (oldScreen != current_screen)
{
oldScreen = current_screen;
redrawBG();
}
updateScreen();
Thread::wait(1000);
}
}
