#include <BH1750.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include "RTClib.h"
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <SdFat.h>
RTC_DS1307 rtc;
BH1750 lightMeter(0x23);
Adafruit_BME680 bme;
#define SEALEVELPRESSURE_HPA (1013.25)
String var, command;
char first, second, third, c_array[5];
int address = 0;
float temp, humid, press, gas, lux;
SdFs sd;
FsFile myFile;
float newData[20];
const uint8_t SD_CS_PIN = A3;
bool select = false;
String list;
const uint8_t SOFT_MISO_PIN = 12;
const uint8_t SOFT_MOSI_PIN = 11;
const uint8_t SOFT_SCK_PIN = 13;
//SoftSpiDriver<SOFT_MISO_PIN, SOFT_MOSI_PIN, SOFT_SCK_PIN> softSpi;
//#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SD_SCK_MHZ(0), &softSpi)
bool interup = false;
int btn1 = 2;
int btn2 = 3;
int btn3 = 4;
int lastButtonState1 = LOW;
int lastButtonState2 = LOW;
int lastButtonState3 = LOW;
int menuVal = 0;
String menu[] = {"temp","press","humid","gas","lux"};
int val1,val2,val3;
int timeHour,timeMin,timeSec;
float data[200];
// TFT pins
#define TFT_CS 10
#define TFT_RST 6
#define TFT_DC 7
// create an instance of the ST7735 library
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
pinMode(btn3, INPUT);
attachInterrupt(digitalPinToInterrupt(btn1), intUp, RISING);
attachInterrupt(digitalPinToInterrupt(btn2), intDown, RISING);
attachInterrupt(digitalPinToInterrupt(btn3), intSelect, RISING);
/*
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
*/
}
void loop() {
// put your main code here, to run repeatedly:
sortData();
}
void runCommand()
{
if (first == char(63)){addressQuery();}
else if (((first- '0') == address) && (second == 'A') && (isAlphaNumeric(third) == true)){changeAddress();}
else if (((first- '0') == address ) && (second == 'M')){startMeasurement();}
else if (((first- '0') == address ) && (second == 'D') && (isAlphaNumeric(third) == true)){sendData();}
else if (((first- '0') == address ) && (second == 'R') && (isAlphaNumeric(third) == true)){continuousMeasurements();}
}
void addressQuery()
{
delay(500);
Serial.println("Sensor Address: ");
delay(500);
Serial.println(address);
delay(500);
}
void changeAddress()
{
address = third -'0';
delay(500);
Serial.println("New Sensor Address: ");
delay(500);
Serial.println(address);
delay(500);
}
void startMeasurement()
{
int time = millis();
temp = bme.temperature;
press = (bme.pressure / 100.0);
humid = bme.humidity;
gas = (bme.gas_resistance / 1000.0);
lux = lightMeter.readLightLevel();
if (! bme.performReading())
{
Serial1.println("Failed to perform reading :(");
return;
}
time = millis() - time;
sprintf(c_array, "000%d5", time/1000);
delay(500);
Serial1.println(c_array);
delay(500);
saveData(temp,'+',0);saveData(press,'+',1);saveData(humid,'+',2);saveData(gas,'+',3);saveData(lux,'!',4);
}
void sendData()
{
if (third == '1')
{
//char BME[30];
//sprintf(BME, "0+%d+%d+%d+%d", temp, press, humid, gas);
delay(500);
Serial1.println("0+");
delay(500);
Serial1.println(temp);
delay(500);
Serial1.println("+");
delay(500);
Serial1.println(press);
delay(500);
Serial1.println("+");
delay(500);
Serial1.println(humid);
delay(500);
Serial1.println("+");
delay(500);
Serial1.println(gas);
// Serial1.println(BME);
delay(500);
}
else if (third == '2')
{
delay(500);
Serial1.println("0+");
delay(500);
Serial1.println(lux);
delay(500);
}
}
void continuousMeasurements()
{
while (interup == false)
{
temp = bme.temperature;
press = (bme.pressure / 100.0);
humid = bme.humidity;
gas = (bme.gas_resistance / 1000.0);
lux = lightMeter.readLightLevel();
if (! bme.performReading())
{
Serial1.println("Failed to perform reading :(");
return;
}
delay(500);
Serial1.println("0+");
delay(500);
Serial1.println(temp);
delay(500);
Serial1.println("+");
delay(500);
Serial1.println(press);
delay(500);
Serial1.println("+");
delay(500);
Serial1.println(humid);
delay(500);
Serial1.println("+");
delay(500);
Serial1.println(gas);
delay(500);
Serial1.println("0+");
delay(500);
Serial1.println(lux);
delay(500);
saveData(temp,'+',0);saveData(press,'+',1);saveData(humid,'+',2);saveData(gas,'+',3);saveData(lux,'!',4);
}
}
void saveData(float data, char mark, int type)
{
myFile.open("test.txt", O_RDWR);
// if the file opened okay, write to it:
// Write to the file
myFile.println(type);
myFile.println("_");
myFile.println(data);
myFile.println("-");
if (mark == '!')
{
timeData();
}
myFile.println(mark);
myFile.close();
// Display the time on TFT LCD
}
void timeData()
{
myFile.println("");
if (timeHour < 10) {
myFile.print("0");
}
myFile.print(timeHour);
myFile.print(':');
if (timeMin < 10) {
myFile.print("0");
}
myFile.print(timeMin);
myFile.print(':');
if (timeSec < 10) {
myFile.print("0");
}
myFile.print(timeSec);
}
void readData()
{
myFile.open("test.txt", O_RDWR);
Serial.println("data.txt:");
String list = myFile.readStringUntil('!');
Serial.println(list);
myFile.close();
}
void menuDisplay()
{
tft.initR(INITR_GREENTAB); // Initialize TFT display
tft.fillScreen(ST7735_BLACK); // Fill the screen with black color
tft.setTextSize(1); // Normal 1:1 pixel scale
tft.setTextColor(ST7735_WHITE); // Draw white text
tft.setCursor(0, 0); // Start at top-left corner
tft.setTextWrap(true); // Enable text wrapping
tft.println(menu[menuVal]); // Print the menu item
tft.setCursor(0, tft.getCursorY() + 10); // Move the cursor down by 10 pixels
}
void graphData()
{
int i = 0;
bool graphDrawn = false;
int c_width = tft.width()/2;
int c_height = tft.height()/2;
tft.fillScreen(ST7735_BLACK); // Use ST7735_BLACK for filling the screen
tft.fillRect(5, tft.height() - 4, tft.width(), tft.height() - 5, ST7735_WHITE); // Use ST7735_WHITE for filling the rectangle
tft.fillRect(4, 1 , 5, c_height, tft.height()-1);
for (int j= 10; j < tft.width()/5; j+=5)
{
tft.drawFastVLine(j, 1 , c_height-1, ST7735_WHITE); // Use ST7735_WHITE for drawing lines
}
for (int j= 5; j < tft.height()/5; j+=5)
{
tft.drawFastHLine(5, j , tft.width()-5, ST7735_WHITE); // Use ST7735_WHITE for drawing lines
}
float maxVal = newData[0];
float minVal = newData[0];
for (int i = 0; i < sizeof(newData); i++) {
if (newData[i] > maxVal) {
maxVal = newData[i];
}
if (newData[i] < minVal) {
minVal = newData[i];
}
}
float scale,scale1;
for (int i = 1; i < sizeof(newData); i++) {
scale = ((newData[i-1]-minVal)*tft.height())/(maxVal-minVal);
scale1 = ((newData[i]-minVal)*tft.height())/(maxVal-minVal);
tft.drawLine(i*5, scale , (i+1)*5, scale1, ST7735_WHITE); // Use ST7735_WHITE for drawing lines
}
}
void intUp()
{
if(menuVal == 4){menuVal =0;}
else {menuVal += 1;}
menuDisplay();
}
void intDown()
{
if(menuVal == 0){menuVal =4;}
else {menuVal += -1;}
menuDisplay();
}
void intSelect()
{
select = true;
}
void sortData()
{
delay(500);
int i = 0;
list = "1";
data[i] += list.toFloat();
i += 1;
list = "_";
data[i] += list.toFloat();
i += 1;
list = "10.5";
data[i] += list.toFloat();
i += 1;
list = "1";
data[i] += list.toFloat();
i += 1;
list = "_";
data[i] += list.toFloat();
i += 1;
list = "22.5";
data[i] += list.toFloat();
i += 1;
list = "2";
data[i] += list.toFloat();
i += 1;
list = "_";
data[i] += list.toFloat();
i += 1;
list = "5.5";
data[i] += list.toFloat();
i += 1;
list = "1";
data[i] += list.toFloat();
i += 1;
list = "_";
data[i] += list.toFloat();
i += 1;
list = "33.5";
data[i] += list.toFloat();
for (int i = 0; i < sizeof(data); i++)
{
if (data[i] == (menuVal + 1))
{
newData[i] += data[i+2];
Serial.println(newData[i]);
delay(500);
}
}
}
/*
myFile.open("test.txt", O_RDWR);
Serial.println("data.txt:");
String list = myFile.readStringUntil('!');
Serial.println(list);
myFile.close();
*/