Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2021:cghenea:stonks [2021/06/02 19:02]
eren.murat
pm:prj2021:cghenea:stonks [2021/06/04 19:41] (current)
eren.murat
Line 25: Line 25:
  
 ====== Software Design ====== ====== Software Design ======
-Folosesc biblioteca ​MAX7219_Dot_Matrix.h care are+Mediul de dezvoltare folosit este Arduino IDE, cu configurarile necesare pentru NodeMCU. Pentru afisare am inclus bibiloteca ​MAX7219_Dot_Matrix.h care contine un alfabet pentru traducerea caracterelor intr-o stare a led-urilor. Biblioteca bitBangedSPI.h implementeaza protocolul SPI si este folosita in cadrul MAX7219_DotMatrix.h pentru a permite conectarea in serie (topologie daisy chain) a mai multor drivere MAX7219. 
 + 
 +Initializez un display format din chips drivere care au CS conectat pe GPIO2. 
 +<​code>​ 
 +    MAX7219_Dot_Matrix display (chips, 2);  
 +</​code>​ 
 + 
 +Stabilirea conexiunii reprezinta un proces simplu, acesta fiind unul dintre motivele pentru care am ales sa folosesc NodeMCU, in detrimentul unui combo Arduino Uno si ESP8266. 
 +<​code>​ 
 +    WiFi.mode(WIFI_STA);​ 
 +    WiFiMulti.addAP("​SSID",​ "​password"​);​ 
 +</​code>​ 
 + 
 +Este timpul sa trecem la loop, unde se intampla magia! La fiecare iteratie, verific intai starea conexiunii. 
 +<​code>​ 
 +void loop(){ 
 +    if ((WiFiMulti.run() == WL_CONNECTED)) { 
 +        // creez un client pentru care trimit cererile 
 +        std::​unique_ptr<​BearSSL::​WiFiClientSecure>​client(new BearSSL::​WiFiClientSecure);​ 
 +        // do more stuff 
 +    } 
 +
 +</​code>​ 
 + 
 +Pentru a ma asigura ca utilizatorul primeste informatii relevante, iar in acelasi timp numarul de cereri ramane rezonabil, am decis sa reimprospatez datele o data la un minut. De aceea, la fiecare loop verific daca au trecut 60 secunde de la ultima cerere: 
 +<​code>​ 
 +    if (currentMillis - previousMillis >= interval) { 
 +        // execut o cerere pentru fiecare ticker din portofoliu 
 +        for (int i = 0; i < NUM_TICKERS;​ ++i) { 
 +            String request = "​https://​finnhub.io/​api/​v1/​quote?​symbol="​ + tickers[i] + "&​token="​ + apiToken; 
 +            if (https.begin(*client,​ request)) { 
 +                // primesc raspunsul, verifica daca este valid si trec la parsare 
 +                // ... 
 +                String payload = https.getString();​ 
 +                DynamicJsonDocument doc(1024);​ 
 +                DeserializationError error = deserializeJson(doc,​ payload); 
 +                // ... 
 +            } 
 +            https.end();​ 
 +        } 
 +    } 
 +</​code>​ 
 + 
 +DynamicJsonDocument este un buffer folosit in cadrul versiunii 6 de ArduinoJSON pe care il initializez cu capacitatea fixa de 1024 octeti. Functia [[https://​arduinojson.org/​v6/​api/​json/​deserializejson/​|deserializeJson]] parseaza inputul JSON si scrie rezultatul in buffer, intorcand eventual o eroare. 
 + 
 +La finalul fiecarui loop, afisez textul si il shiftez spre stanga. Acest proces se intampla la un interval de 40 milisecunde prin functia updateDisplay(). 
 +<​code>​ 
 +void updateDisplay() { 
 +    display.sendSmooth (message, messageOffset);​ 
 + 
 +    if (messageOffset++ >= (int) (strlen (message) * 8)) { 
 +        messageOffset = - chips * 8; 
 +    }    
 +}  
 +</​code>​ 
  
 ====== Rezultate Obtinute ====== ====== Rezultate Obtinute ======
-{{ :​pm:​prj2021:​cghenea:​stonks_res2.jpg?​nolink&​300 |}}+//Stonks// se comporta exact cum ma asteptam si imi ofera doar datele esentiale, cu precizie si usurinta. Mi-am propus sa creez un dispozitiv rapid, compact si independent de computer. Am reusit toate acestea cu un NodeMCU, un breadboard care ii ofera integritate structurala si o sursa de alimentare pe breadboard cu doua intrari (DC si USB) pentru a putea aseza device-ul oriunde. La inceputul dezvoltarii,​ l-am proiectat sa functioneze cu 5 drivere MAX7219, acest lucru traducandu-se intr-o rezolutie de 8x40. Din pacate, nu am prevazut incercarile esuate de a lega driverele si am ramas in prezent cu un display de 8x24. Astfel, citirea informatiile devine putin mai dificila, dar conceptul este acelasi si i se poate observa utilitatea in continuare. 
 + 
 +{{ :​pm:​prj2021:​cghenea:​stonks_res1.jpg?​nolink&​600 |}} 
 +{{ :​pm:​prj2021:​cghenea:​stonks_res2.jpg?​nolink&​600 |}}
  
 ====== Concluzii ====== ====== Concluzii ======
 +In concluzie, doresc sa prezint planul de imbunatatire si extindere a //Stonks//. Voi construi un website prin care sa pot controla ticker-ele din portofoliu, trimitand comenzi de add si remove. In plus, voi oferi un nivel nou de utilitate prin posibilitatea afisarii orei si a datelor meteorologice. Toate acestea vor veni intr-o carcasa custom si //Stonks// va fi gata pentru a-si lua locul pe birou!
  
 ====== Download ====== ====== Download ======
Line 36: Line 95:
  
 ====== Bibliografie/​Resurse ====== ====== Bibliografie/​Resurse ======
-<​note>​https://​www.gammon.com.au/​forum/?​id=11516</​note>​+<​note>​ 
 +https://​www.gammon.com.au/​forum/?​id=11516 
 + 
 +https://​arduinojson.org/​v6/​doc/​ 
 + 
 +https://​finnhub.io/​ 
 +</​note>​
  
 ====== Demo ====== ====== Demo ======
pm/prj2021/cghenea/stonks.1622649773.txt.gz · Last modified: 2021/06/02 19:02 by eren.murat
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0