#include <LiquidCrystal.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
int STOCKTIMER = 2000; //plus 8.77 seconds for http.get
String table[] = {"SPY","TSLA","PYPL","MSFT","GOOG","INTC","AMZN","AMD","BTC-USD"};
String payload = "";
LiquidCrystal lcd(12,14,27,26,25,33);
Servo servo_1;
Servo servo_2;
byte upward[] = {
B00100,
B01110,
B11111,
B00000,
B00100,
B01110,
B11111,
B00000
};
byte downward[] = {
B00000,
B11111,
B01110,
B00100,
B00000,
B11111,
B01110,
B00100
};
void connect(){
WiFi.begin(ssid, password);
lcd.print("Connecting to ");
lcd.setCursor(0,1);
lcd.print("Network ...");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
}
lcd.clear();
lcd.print("Connected");
servo_1.write(0);
servo_2.write(0);
delay(800);
servo_2.write(180);
servo_1.write(180);
delay(800);
servo_1.write(0);
servo_2.write(0);
digitalWrite(22, HIGH);
delay(1500);
digitalWrite(22, LOW);
digitalWrite(23, HIGH);
delay(1500);
digitalWrite(23, LOW);
lcd.clear();
lcd.print("Fetching data");
}
bool display(String stock_name){
if(WiFi.status()== WL_CONNECTED){
String serverName = "https://finnhub.io/api/v1/quote?symbol="+stock_name+"&token=cb6fpl2ad3i70tu66ec0";
HTTPClient http;
WiFiClient clientt;
http.begin(serverName);
int httpResponseCode = http.GET();
if (httpResponseCode>0) {
payload = http.getString();
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, payload);
float previousPrice = doc[String("pc")];
float currentPrice = doc[String("c")];
float diff = max(previousPrice,currentPrice) - min(previousPrice,currentPrice);
int diff_ind = 0;
if(max(previousPrice,currentPrice) == previousPrice){diff_ind = -1;}else diff_ind = 1;
lcd.clear();
digitalWrite(22, LOW);
digitalWrite(23, LOW);
servo_1.write(0);
servo_2.write(0);
lcd.setCursor(4,0);
lcd.print(stock_name);
lcd.setCursor(13,0);
if(diff_ind < 0){lcd.print(" \x04");}else lcd.print(" \x03");
lcd.setCursor(0,1);
lcd.print(currentPrice);
lcd.setCursor(9,1);
if(diff_ind < 0){
lcd.print("-");
lcd.print(diff);
digitalWrite(22, HIGH);
}else {
lcd.print(diff);
digitalWrite(23, HIGH);
}
float differenceInPrice = ((currentPrice-previousPrice)/previousPrice)*100.0;
if (differenceInPrice < 0){differenceInPrice *= -1;}
int big = (int)differenceInPrice;
float small = differenceInPrice - big;
servo_1.write(small * 180);
servo_2.write(big * 22.5);
if(big >= 6){
for(int i=0;i<6;i++){
tone(32,500);
delay(500);
noTone(32);
delay(500);
}
}
int time = millis();
while(millis() <= time + STOCKTIMER){
if(digitalRead(18) == LOW){return 1;}
if(digitalRead(19) == LOW){return 0;}
}
delay(STOCKTIMER);
}
else {
lcd.clear();
lcd.print("Error code: ");
lcd.println(httpResponseCode);
}
http.end();
return 0;}
else {
lcd.clear();
lcd.print("WiFi Disconnected");
return 0;
}
}
bool better_display(String stock_name){
bool n;
do{n = display(stock_name);}while(digitalRead(21) == HIGH);
return n;
}
void setup() {
Serial.begin(115200);
lcd.createChar(3, upward);
lcd.createChar(4, downward);
lcd.begin(16,2);
servo_1.attach(13); //big servo
servo_2.attach(5); //small servo
pinMode(22, OUTPUT); //red bulb
pinMode(23, OUTPUT); //green bulb
pinMode(21, INPUT_PULLUP); //loop switch
pinMode(18, INPUT); //previous button
pinMode(19, INPUT); //next button
pinMode(32, OUTPUT); //speaker
connect();
}
void loop() {
for(int i = 0; i < sizeof(table) / sizeof(table[0]); i++){
if(better_display(table[i])){i -= 2;}
}
}