#include <NMEAGPS.h>
#include <GPSport.h>
#include <U8x8lib.h>
#include <Adafruit_NeoPixel.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include "Adafruit_VEML6070.h"
#include <BH1750.h>
#define PIN 12
#define NUMPIXELS 8
int delayval = 50;
static NMEAGPS gps;
static gps_fix fix;
Adafruit_BME680 bme;
BH1750 lightMeter;
Adafruit_VEML6070 uv = Adafruit_VEML6070();
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin();
gpsPort.begin(9600);
bme.begin();
lightMeter.begin();
uv.begin(VEML6070_1_T);
//Serial.begin(9600);
u8x8.begin();
u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.clearDisplay();
delay(10);
u8x8.drawString(4,3,"LocAware");
u8x8.drawString(3,4,"by PyreMage");
u8x8.drawString(6,5,"v4.0");
delay(1500);
u8x8.clearDisplay();
u8x8.drawString(0,0," Acquiring Fix");
u8x8.inverse();
u8x8.drawString(0, 1, "T");//Temp
u8x8.drawString(8, 1, "P");//Pressure
u8x8.drawString(0, 2, "H");//Humidity
u8x8.drawString(8, 2, "P");//Pressure
u8x8.drawString(0, 3, "L");//Lux
u8x8.drawString(8, 3, "UVI");//UV index
u8x8.drawString(0, 4, "CO");//CO Gas
u8x8.drawString(8, 4, "AQI");//AQI
u8x8.drawString(0, 5, "Sp");//Speed
u8x8.drawString(11, 5, "Hd");//Heading
u8x8.drawString(0, 6, "A");//Altitude
u8x8.drawString(0, 7, "F");//Fix
u8x8.drawString(3, 7, "T");//Tracking
u8x8.drawString(6, 7, "A");//Acquired
u8x8.drawString(10, 7, "U");//UTC Time
u8x8.noInverse();
/*
Neopixels definition
0=Temp
1=Pressure
2=Humidity
4=Lux
3=GPS Fix
5=UVI
6=CO
7=AQI
*/
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
for(int i=0;i<NUMPIXELS;i++){
pixels.setPixelColor(i, pixels.Color(0,255,0));
pixels.show();
delay(delayval);}
for(int i=0;i<NUMPIXELS;i++){
pixels.setPixelColor(i, pixels.Color(0,0,0));
pixels.show();
delay(delayval);}
}
void loop() {
uint16_t lux = lightMeter.readLightLevel();
char tmpchar[4];
int bmetmp=(bme.readTemperature() * 9/5 + 32-10);
dtostrf((bme.readTemperature() * 9/5 + 32-10), 3, 2, tmpchar);
if (bmetmp>100){pixels.setPixelColor(1, pixels.Color(255,0,0));//red
pixels.show();}else
if (bmetmp>90 && bmetmp<99){pixels.setPixelColor(0, pixels.Color(255,125,0));//orange
pixels.show();}else
if (bmetmp>80 && bmetmp<89){pixels.setPixelColor(0, pixels.Color(255,255,0));//yellow
pixels.show();}else
if (bmetmp>70 && bmetmp<79){pixels.setPixelColor(0, pixels.Color(0,255,125));//turquiose
pixels.show();}else
if (bmetmp>60 && bmetmp<69){pixels.setPixelColor(0, pixels.Color(0,255,0));//green
pixels.show();}else
if (bmetmp<59){pixels.setPixelColor(0, pixels.Color(0,0,255));//blue
pixels.show();}else
if (bmetmp<1){pixels.setPixelColor(0, pixels.Color(0,0,0));pixels.show();}//off
u8x8.drawString(1, 1, tmpchar);
u8x8.drawString(6, 1, "F");
delay(10);
char prschar[4];
dtostrf((bme.readPressure()/3365.3*1+.15), 3, 2, prschar);
u8x8.drawString(9, 1, prschar);
u8x8.drawString(14, 1, "Hg");
char prs2char[4];
dtostrf(bme.readPressure()*.01+12, 4, 2, prs2char);
int bmeprs=(bme.readPressure()*.01+12);
dtostrf((bme.readTemperature() * 9/5 + 32-10), 3, 2, tmpchar);
if (bmeprs>1020){pixels.setPixelColor(1, pixels.Color(255,125,0));//orange
pixels.show();}else
if (bmeprs>1010 && bmeprs<1019){pixels.setPixelColor(1, pixels.Color(0,255,0));//green
pixels.show();}else
if (bmeprs>1000 && bmeprs<1009){pixels.setPixelColor(1, pixels.Color(0,255,125));//turquiose
pixels.show();}else
if (bmeprs>990 && bmeprs<9999){pixels.setPixelColor(1, pixels.Color(255,125,0));//orange
pixels.show();}else
if (bmeprs>970 && bmeprs<989){pixels.setPixelColor(1, pixels.Color(255,255,0));//yellow
pixels.show();}else
if (bmeprs<969){pixels.setPixelColor(1, pixels.Color(255,0,0));//red
pixels.show();}else
if (bmeprs<1){pixels.setPixelColor(1, pixels.Color(0,0,0));pixels.show();}//off
u8x8.drawString(9, 2, prs2char);
//u8x8.drawString(14, 1, "mB");
char humchar[4];
int bmehum=(bme.readHumidity()+14.5);
dtostrf(bme.readHumidity()+14.5, 3, 2, humchar);
if (bmehum>100){pixels.setPixelColor(2, pixels.Color(255,0,0));//red
pixels.show();}else
if (bmehum>90 && bmehum<99){pixels.setPixelColor(2, pixels.Color(255,125,0));//orange
pixels.show();}else
if (bmehum>80 && bmehum<89){pixels.setPixelColor(2, pixels.Color(255,255,0));//yellow
pixels.show();}else
if (bmehum>70 && bmehum<79){pixels.setPixelColor(2, pixels.Color(0,0,255));//blue
pixels.show();}else
if (bmehum>60 && bmehum<69){pixels.setPixelColor(2, pixels.Color(0,255,125));//turquiose
pixels.show();}else
if (bmehum<59){pixels.setPixelColor(2, pixels.Color(0,255,0));//green
pixels.show();}else
if (bmehum<1){pixels.setPixelColor(2, pixels.Color(0,0,0));pixels.show();}//off
u8x8.drawString(1, 2, humchar);
u8x8.drawString(6, 2, "%");
char luxchar[5];
dtostrf(lux, 5, 0, luxchar);
//Serial.println(luxchar);
if (lux>34001){pixels.setPixelColor(4, pixels.Color(255,0,0));//red
pixels.show();}else
if (lux>20001 && lux<34000){pixels.setPixelColor(4, pixels.Color(255,125,0));//orange
pixels.show();}else
if (lux>10001 && lux<20000){pixels.setPixelColor(4, pixels.Color(255,255,0));//yellow
pixels.show();}else
if (lux>5001 && lux<10000){pixels.setPixelColor(4, pixels.Color(0,0,255));//blue
pixels.show();}else
if (lux>2000 && lux<5000){pixels.setPixelColor(4, pixels.Color(0,255,125));//turquiose
pixels.show();}else
if (lux<2000){pixels.setPixelColor(4, pixels.Color(0,255,0));//green
pixels.show();}else
if (lux<1){pixels.setPixelColor(4, pixels.Color(0,0,0));pixels.show();}//off
u8x8.drawString(1, 3, " ");
u8x8.drawString(1, 3, luxchar);
char uvchar[4];
uv.readUV();
if (uv.readUV()>2055) {u8x8.drawString(11, 3, " ");u8x8.drawString(11, 3, "Extre");
pixels.setPixelColor(5, pixels.Color(255,0,0));//red
pixels.show();}else
if (uv.readUV()>1494 && uv.readUV()<2054) {u8x8.drawString(11, 3, " ");u8x8.drawString(11, 3, "VHigh");
pixels.setPixelColor(5, pixels.Color(255,125,0));//orange
pixels.show();}else
if (uv.readUV()>1121 && uv.readUV()<1493) {u8x8.drawString(11, 3, " ");u8x8.drawString(11, 3, "High");
pixels.setPixelColor(5, pixels.Color(255,255,0));//yellow
pixels.show();}else
if (uv.readUV()>561 && uv.readUV()<1120) {u8x8.drawString(11, 3, " ");u8x8.drawString(11, 3, "Moder");
pixels.setPixelColor(5, pixels.Color(0,0,255));//blue
pixels.show();}else
if (uv.readUV()<560) {u8x8.drawString(11, 3, " ");u8x8.drawString(11, 3, "Low");
pixels.setPixelColor(5, pixels.Color(0,255,0));//green
pixels.show();}else
if (uv.readUV()<1){pixels.setPixelColor(5, pixels.Color(0,0,0));pixels.show();}//off
char vocchar[5];
dtostrf(bme.gas_resistance, 5, 0, vocchar);
if (bme.gas_resistance>140901) {u8x8.drawString(11, 4, " ");u8x8.drawString(11, 4, "Good");
pixels.setPixelColor(7, pixels.Color(0,255,0));//green
pixels.show();}else
if (bme.gas_resistance>75001 && bme.gas_resistance<140900) {u8x8.drawString(11, 4, " ");u8x8.drawString(11, 4, "Moder");
pixels.setPixelColor(7, pixels.Color(0,255,125));//turquiose
pixels.show();}else
if (bme.gas_resistance>37400 && bme.gas_resistance<75000) {u8x8.drawString(11, 4, " ");u8x8.drawString(11, 4, "USG");
pixels.setPixelColor(7, pixels.Color(0,0,255));//blue
pixels.show();}else
if (bme.gas_resistance>18770 && bme.gas_resistance<37399) {u8x8.drawString(11, 4, " ");u8x8.drawString(11, 4, "Unhlt");
pixels.setPixelColor(7, pixels.Color(255,0,255));//magenta
pixels.show();}else
if (bme.gas_resistance>9001 && bme.gas_resistance<18771) {u8x8.drawString(11, 4, " ");u8x8.drawString(11, 4, "VUnhl");
pixels.setPixelColor(7, pixels.Color(225,125,0));//orange
pixels.show();}else
if (bme.gas_resistance>8371 && bme.gas_resistance<9000) {u8x8.drawString(11, 4, " ");u8x8.drawString(11, 4, "Hazar");
pixels.setPixelColor(7, pixels.Color(255,0,0));//red
pixels.show();}else
if (bme.gas_resistance<8370) {u8x8.drawString(11, 4, " ");u8x8.drawString(11, 4, "Vacat");
pixels.setPixelColor(7, pixels.Color(255,0,0));//red
pixels.show();}else
if (bme.gas_resistance<1){pixels.setPixelColor(7, pixels.Color(0,0,0));pixels.show();}//off
char gaschar[4];
int reading = analogRead(A0);
dtostrf(reading, 3, 0, gaschar);
u8x8.drawString(2, 4, gaschar);
u8x8.drawString(5, 4, "PPM");
//Serial.println(reading);
if (reading>1000){pixels.setPixelColor(6, pixels.Color(255,0,0));pixels.show();}//red
if (reading>501 && reading<999){pixels.setPixelColor(6, pixels.Color(225,125,0));pixels.show();}else//orange
if (reading>151 && reading<500){pixels.setPixelColor(6, pixels.Color(255,255,0));pixels.show();}else//yellow
if (reading>71 && reading<150){pixels.setPixelColor(6, pixels.Color(0,0,255));pixels.show();}else//blue
if (reading>1 && reading<70){pixels.setPixelColor(6, pixels.Color(0,255,0));pixels.show();}else//green
if (reading<1){pixels.setPixelColor(6, pixels.Color(0,0,0));pixels.show();}//off
GPSloop();
}
static void GPSloop()
{
pixels.setPixelColor(3, pixels.Color(255,0,0));pixels.show();//red
while (gps.available( gpsPort )) {
pixels.setPixelColor(3, pixels.Color(0,255,0));pixels.show();//green
GetGPS();
}
}
static void GetGPS()
{
fix = gps.read();
int totalSatellites, trackedSatellites;
totalSatellites = gps.sat_count;
for (uint8_t w = 0; w < totalSatellites; w++) {
if (gps.satellites[w].tracked) {
trackedSatellites++;
}
}
enum {BufSizeTracked = 3}; //Space for 2 characters + NULL
char trackedchar[BufSizeTracked];
snprintf (trackedchar, BufSizeTracked, "%d", trackedSatellites);
u8x8.drawString(4, 7, " ");
u8x8.drawString(4, 7, trackedchar);
enum {BufSizeTotal = 3};
char availchar[BufSizeTotal];
snprintf (availchar, BufSizeTotal, "%d", totalSatellites);
u8x8.drawString(7, 7, " ");
u8x8.drawString(8, 7, availchar);
if (fix.valid.time) {
enum {BufSizeTime = 3};
int hour = fix.dateTime.hours;
int minute = fix.dateTime.minutes;
char hourchar[BufSizeTime];
char minutechar[BufSizeTime];
snprintf (hourchar, BufSizeTime, "%d", hour);
snprintf (minutechar, BufSizeTime, "%d", minute);
if ( hour < 10 )
{
snprintf (hourchar, BufSizeTime, "%02d", hour);
}
if ( minute < 10 )
{
snprintf (minutechar, BufSizeTime, "%02d", minute);
}
u8x8.drawString(11, 7, hourchar);
u8x8.drawString(13, 7, ":");
u8x8.drawString(14, 7, minutechar);
}
char latchar[7]; // Buffer big enough for 4-character float
dtostrf(fix.latitude(), 3, 4, latchar);
u8x8.drawString(0, 0, " ");
u8x8.drawString(0, 0, latchar);
char longchar[7];
dtostrf(fix.longitude(), 3, 4, longchar);
u8x8.drawString(8, 0, longchar);
char altchar[5]; // Buffer big enough for 4-character float
dtostrf((fix.altitude()*3.28084), 3, 2, altchar);
u8x8.drawString(1, 6, " ");
u8x8.drawString(1, 6, altchar);
u8x8.drawString(7, 6, "ft");
char headchar[3];
dtostrf (fix.heading(), 3, 0, headchar);
if (headchar<10){u8x8.drawString(12, 5, "00");u8x8.drawString(14, 5, headchar);}else
if (headchar<99){u8x8.drawString(12, 5, "0");u8x8.drawString(13, 5, headchar);}else
u8x8.drawString(12, 5, headchar);
char spdchar[4];
dtostrf((fix.speed_kph()*0.621371), 2, 2, spdchar);
u8x8.drawString(2, 5, spdchar);
u8x8.drawString(7, 5, "Mph");
char satchar2[3];
dtostrf(fix.satellites, 2, 0, satchar2);
u8x8.drawString(1, 7, " ");
u8x8.drawString(1, 7, satchar2);
}
Comments