LCC 04 April V1
unknown
c_cpp
4 years ago
11 kB
8
Indexable
#include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip
#include <SPI.h>
#include <HTTPClient.h>
/*
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPLCJUUTVGm"
#define BLYNK_DEVICE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "uTyPBxDwUc1BFFz3RQwQbLOVXK7PWXGx"
*/
#include <WiFi.h>
#include <WiFiClient.h>
//#include <BlynkSimpleEsp32.h>
//char auth[] = "uTyPBxDwUc1BFFz3RQwQbLOVXK7PWXGx";//this is where your token from Blynk
#include "twilio.hpp"
// Values from Twilio (find them on the dashboard)
static const char *account_sid = "ACbda8054aef93310774f7ef47b4f19c02";
static const char *auth_token = "114532f90b58eb88a8945943480a4733";
// Phone number should start with "+<countrycode>"
static const char *from_number = "+18567334846";
// You choose!
// Phone number should start with "+<countrycode>"
//static const char *to_number = "+918692864044";
static const char *to_number = "+919768026868";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Anonymous";//your wifi network
char pass[] = "0 Zxq@1234";//your password
String server = "http://maker.ifttt.com";
String eventName = "esp32ToWeb";
String IFTTT_Key = "e396Rc2__Q1EM-gZJlbHn";
String IFTTTUrl="http://maker.ifttt.com/trigger/temp_data/with/key/e272MXJrh4_et5KUm56LmYHjJrNRtj9BjxUT5u6Njr7";
TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
const int analogInPin = 33; //change this if you want to use another analog pin--works on this model of esp32
float area_1 = 0.0004908; //these are the areas taken carefully from the 3D printed venturi 2M before constriction
float area_2 = 0.0001179;// this is area within the venturi
float rho = 1.225; //Demsity of air in kg/m3;
float dt = 0;
int logCount = 0;
float timerBreath;
float secondsBreath;
float minuteTotal;
int newBreath = 0;
float TimerNow = 0.0;
int totalBreath = 0;
float massFlow = 0;
float volFlow = 0;
float maxFlow = 0.0;
float volumeTotal = 0;
float sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)
float voltage = 0.0;
float Pa = 0.0;
float fev1 = 0.0;
float vol[30]; //this is the total volume that stored with time...
float volSec[30];//this is the the liter/sec messured
int snatch = 0;
int fundex = 0;
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
minuteTotal = millis();
/*Blynk.begin(auth, ssid, pass);
delay(5000);
*/
for(int p = 0;p < 30; p++){
vol[p] = 0; //clears out matrix
volSec[p] = 0;
}
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_YELLOW, TFT_BLACK);
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.drawCentreString("BLOW.....",125,55,4);
delay(5000);
}
void loop() {
//Blynk.run();
if((millis()- minuteTotal) > 60000){
minuteTotal = millis();
//Serial.print( "Breaths per minute:");
//Serial.println(totalBreath);
// logfile.print(" ");
//logfile.println(totalBreath);
totalBreath = 0;
}
// read the analog in value:
sensorValue = analogRead(analogInPin);
//Serial.print("max sens value");
//Serial.println(sensorValue);
voltage =( 3.3 * (( sensorValue )/4095));//the usual voltage conversion for 12 bit esp32
Serial.print("CheVoltage "); // For testing only
Serial.println(voltage);
Pa = (190 * voltage/3.3) - 38; //equation from sensor data sheet
Serial.println("pa");
Serial.println(Pa);
if(( Pa > 1) || (fundex >5 && fundex <28)) { //checks to see if your breathing out and if your halfway through a blow
if (newBreath < 1) {
timerBreath = millis();
fev1 = 0.0;
snatch = 0;
fundex = 0;
if(volumeTotal > 100){
totalBreath = totalBreath + 1; //counts breath
//Serial.print("VolumeTotal= ");
//Serial.println(volumeTotal);
}
volumeTotal = 0;
newBreath = 1;
}
if(!(snatch%5)){
vol[fundex] = volumeTotal;
volSec[fundex] = volFlow;
fundex++;
}
snatch++;
// change the analog out value:
//analogWrite(analogOutPin, outputValue);
if((millis() - timerBreath >= 1400) && (fev1 == 0)) fev1 = volumeTotal +400;
massFlow = 1400*sqrt((abs(Pa)*2*rho)/((1/(pow(area_2,2)))-(1/(pow(area_1,2))))); //Bernoulli equation
volFlow = massFlow/rho; //volumetric flow of air
//Serial.print(timerBreath);
//Serial.print(volFlow);
//Serial.print(massFlow);
if(volFlow > maxFlow) maxFlow = volFlow;
volumeTotal = volFlow * (millis() - TimerNow) + volumeTotal;//integrates volumes over units of time to get total volume
// print the results to the Serial Monitor:
//Serial.print("sensor = ");
//Serial.print(sensorValue);
//Serial.print("VolumeTotal= ");
//Serial.print(volumeTotal);
//Serial.print("\t pressure = ");
//Serial.println(Pa);
} else if(newBreath){ //if your done figure out the results
newBreath = 0;
//Serial.print("time for breath");
if(volumeTotal > 200){
secondsBreath = (millis() - timerBreath)/1000;
/* Serial.print("FEV1 ");
Serial.println(fev1);
Serial.print("FVC ");
Serial.print(volumeTotal);
Serial.print("FV1/FVC");
Serial.println(fev1/volumeTotal);
Serial.print("Duration");
Serial.println(timerBreath/1000);
Serial.print("MaxFlow");
Serial.println(maxFlow);*/
while (fev1 != 0){
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.drawCentreString("FEV1",32,20,4);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.drawCentreString("FVC",32,80,4);
tft.setTextColor(TFT_BLACK, TFT_BLACK);
tft.drawString("888888",70,5,7);
tft.setTextColor(0xFBE0, TFT_BLACK); // Orange
tft.drawNumber(fev1,70,5,7);
tft.setTextColor(TFT_BLACK, TFT_BLACK);
tft.drawString("888888",70,70,7);
tft.setTextColor(0xFBE0, TFT_BLACK); // Orange
tft.drawNumber(volumeTotal,70,70,7);
//Serial.println(secondsBreath);
delay(5000);
tft.fillScreen(TFT_BLACK);
printer();
dataDump();
}
//if(Blynk.connected())blynkPrint();
}
for(int p = 0;p < 30; p++){
vol[p] = 0;
volSec[p] = 0;
}
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREENYELLOW, TFT_BLACK);
tft.drawCentreString("BLOW.....",125,55,4);
maxFlow = 0;
}
TimerNow = millis();
delay(20);
}
Twilio *twilio;
void dataDump(){
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.drawCentreString("FEV1:",32,5,4);
tft.drawCentreString("FEVC:",32,27,4);
tft.drawCentreString("DURATION:",67,49,4);
tft.drawCentreString("FEV1/FEVC:",70,71,4);
tft.drawCentreString("MAXFLOW:",63,93,4);
tft.setTextColor(0xFBE0, TFT_BLACK); // Orange
tft.drawNumber(fev1,100,5,4);
tft.drawCentreString(" ml",180,5,4);
tft.drawNumber(volumeTotal,100,27,4);
tft.drawCentreString(" ml",180,27,4);
tft.drawNumber(timerBreath/1000,160,49,4);
tft.drawNumber((fev1/volumeTotal) * 100,160,71,4);
tft.drawNumber(maxFlow,160,93,4);
delay(300);
Serial.begin(115200);
//Serial.print("Connecting to WiFi network ;");
//Serial.print(ssid);
//Serial.println("'...");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Connecting...");
delay(500);
}
// Serial.println("Connected!");
twilio = new Twilio(account_sid, auth_token);
String message1 = "FEV1 value is " ;
message1 += fev1;
String message2 = " ml. FEVC value is " ;
message2 += volumeTotal;
String message3 = " ml.";
String message = message1 + message2 + message3 ;
delay(100);
String response;
bool success = twilio->send_message(to_number, from_number, message, response);
sendDataToSheet();
if (success) {
//Serial.println("Sent message successfully!");
} else {
//Serial.println(response);
}
}
void printer(){ //Draws nice little graph
int x = 1;
for(int p = 0; p< 30; p++){
/* Serial.print("vol");
Serial.println(vol[p]);
Serial.print("volspeed");
Serial.println(volSec[p]); */
int x = map(vol[p],0,5000,0,20);
linearMeter(x,10,p*8,5,10,3,25,1);
}
delay(3000);
}
/*
void blynkPrint(){ //connects to Blynk
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.drawCentreString("BLYNK......",125,55,4);
Blynk.virtualWrite(V1,timerBreath/1000);
Blynk.virtualWrite(V2, fev1/volumeTotal);
Blynk.virtualWrite(V3, volumeTotal);
Blynk.virtualWrite(V4, fev1);
for(int i = 0; i < 20; i++){
Blynk.virtualWrite(V5, vol[i]);
Blynk.virtualWrite(V6, volSec[i]);
delay(500);
}
}
*/
void linearMeter(int val, int x, int y, int w, int h, int g, int n, byte s) //Does the graphing
{
tft.setRotation(0);
// Variable to save "value" text colour from scheme and set default
int colour = TFT_BLUE;
// Draw n colour blocks
for (int b = 1; b <= n; b++) {
if (val > 0 && b <= val) { // Fill in coloured blocks
switch (s) {
case 0: colour = TFT_RED; break; // Fixed colour
case 1: colour = TFT_GREEN; break; // Fixed colour
case 2: colour = TFT_BLUE; break; // Fixed colour
//case 3: colour = rainbowColor(map(b, 0, n, 127, 0)); break; // Blue to red
//case 4: colour = rainbowColor(map(b, 0, n, 63, 0)); break; // Green to red
//case 5: colour = rainbowColor(map(b, 0, n, 0, 63)); break; // Red to green
//case 6: colour = rainbowColor(map(b, 0, n, 0, 159)); break; // Rainbow (red to violet)
}
tft.fillRect(x + b*(w+g), y, w, h, colour);
}
else // Fill in blank segments
{
tft.fillRect(x + b*(w+g), y, w, h, TFT_DARKGREY);
}
}
}
WiFiClientSecure client;
void sendDataToSheet(void)
{
String url = server + "/trigger/" + eventName + "/with/key/" + IFTTT_Key + "?value1=" + String((int)volumeTotal) + "&value2="+String((int)fev1);
Serial.println(url);
//Start to send data to IFTTT
HTTPClient http;
Serial.print("[HTTP] begin...\n");
http.begin(url); //HTTP
Serial.print("[HTTP] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if(httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if(httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}Editor is loading...