This shows you the differences between two versions of the page.
pm:prj2021:cghenea:stonks [2021/05/25 23:54] eren.murat |
pm:prj2021:cghenea:stonks [2021/06/04 19:41] (current) eren.murat |
||
---|---|---|---|
Line 10: | Line 10: | ||
====== Descriere Generala ====== | ====== Descriere Generala ====== | ||
- | Se cicleaza prin companiile aflate in portofoliu, iar la un interval de timp este inițiat un http request către API pentru noul simbol, care răspunde cu informațiile cerute într-un JSON. Acest JSON este parsat pe NodeMCU, iar datele sunt pasate prin driverele MAX7219 conectate in serie display-ului sub formă de bytes. | + | Se cicleaza prin companiile aflate in portofoliu, iar la un interval de timp este inițiat un http request către API pentru noul simbol, care răspunde cu informațiile cerute într-un JSON. Acest JSON este parsat pe NodeMCU, iar datele sunt pasate prin driverele MAX7219 conectate in serie si ajung la matricea LED. |
- | {{ :pm:prj2021:cghenea:stonks_schema_bloc.png?nolink |}} | + | |
====== Hardware Design ====== | ====== Hardware Design ====== | ||
Line 23: | Line 22: | ||
Schema electrica: | Schema electrica: | ||
- | {{ :pm:prj2021:cghenea:stonks_schema_electrica.png?nolink |}} | + | {{ :pm:prj2021:cghenea:stonks_schema_electrica.png?nolink&700 |}} |
====== Software Design ====== | ====== Software Design ====== | ||
+ | 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 ====== | ||
+ | //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 96: | ||
====== Bibliografie/Resurse ====== | ====== Bibliografie/Resurse ====== | ||
<note> | <note> | ||
+ | https://www.gammon.com.au/forum/?id=11516 | ||
+ | https://arduinojson.org/v6/doc/ | ||
+ | |||
+ | https://finnhub.io/ | ||
</note> | </note> | ||
+ | |||
+ | ====== Demo ====== | ||
+ | <note>https://www.youtube.com/watch?v=-q5PAhELp_Y</note> | ||
+ | |||
+ | |||
+ | |||
+ | |||