Guest User

Untitled

a guest
Nov 20th, 2025
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.40 KB | Source Code | 0 0
  1. #include <Wire.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
  4. //#include <WiFi.h>
  5. #include <FastLED.h>
  6.  
  7. //unsigned long currentMillis = 0;
  8. //unsigned long lastSyncMillis = 0;
  9. //const unsigned long syncInterval = 3600000; // 1 ora in millisecondi
  10.  
  11. //const char* ssid = "FRITZ!Box 7530 DP";
  12. //const char* password = "ciaocaterina1@";
  13. //const char* ntpServer = "pool.ntp.org";
  14.  
  15.  
  16.  
  17. #define BUTTON_PIN 0 // BOOT button
  18. #define LONG_PRESS_TIME 1500 // ms
  19. #define TIMEOUT_SELECTION 10000 // ms
  20.  
  21. #define SCREEN_WIDTH 128
  22. #define SCREEN_HEIGHT 32
  23. #define OLED_RESET -1
  24. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  25.  
  26. #define LED_PIN 5
  27. #define NUM_LEDS 4
  28. #define BRIGHTNESS 64
  29. #define LED_TYPE WS2812B
  30. #define COLOR_ORDER RGB
  31.  
  32. CRGB leds[NUM_LEDS];
  33.  
  34.  
  35. const int NumLang = 4;
  36. const int NumMsg = 38;
  37. const int NumHour = 24;
  38. const int NumMin = 60;
  39. const int NumSec = 60;
  40. const char* nomiLingue[] = { "Italiano", "English", "Espanol", "Francais"};
  41. int LinguaSelezionata = 1;
  42.  
  43.  
  44.  
  45.  
  46. enum MsgType {
  47. MSG_START,
  48. MSG_SELLANG,
  49. MSG_INSTRUCTIONS,
  50. MSG_INITHOURS,
  51. MSG_INITHOUR,
  52. MSG_FINHOURS,
  53. MSG_FINHOUR,
  54. MSG_MIN5,
  55. MSG_MIN10,
  56. MSG_MIN15,
  57. MSG_MIN20,
  58. MSG_MIN25,
  59. MSG_MIN30,
  60. MSG_MIN35,
  61. MSG_MIN40,
  62. MSG_MIN45,
  63. MSG_MIN50,
  64. MSG_MIN55,
  65. MSG_HOUR1,
  66. MSG_HOUR2,
  67. MSG_HOUR3,
  68. MSG_HOUR4,
  69. MSG_HOUR5,
  70. MSG_HOUR6,
  71. MSG_HOUR7,
  72. MSG_HOUR8,
  73. MSG_HOUR9,
  74. MSG_HOUR10,
  75. MSG_HOUR11,
  76. MSG_HOUR12AM,
  77. MSG_HOUR12PM,
  78. MSG_HOURPRECISE,
  79. MSG_HOURAM,
  80. MSG_HOURPM,
  81. MSG_TIMEUPD,
  82. MSG_WIFIERR,
  83. MSG_WIFIOK,
  84. MSG_WIFICONN,
  85. };
  86.  
  87. const char* MESSAGES[NumMsg][NumLang] = {
  88. {"Avvio programma", "Starting program", "Iniciar programa", "Demarrage du programme"},
  89. {"Selezionata lingua: ", "Selected language: ", "Idioma seleccionado: ", "Langue sélectionnee: "},
  90. {"premi per cambiare, tieni premuto per conferma", "press to change, hold to confirm", "pulsa para cambiar, mantén pulsado para confirmar", "appuyez pour changer, maintenez enfoncé pour confirmer"},
  91. {"SONO LE ", "IT IS ", "SON LAS ", "IL EST "},
  92. {"E' L'", "IT IS ", "ES LA ", "IL EST "},
  93. {"", "", "", " HEURES"},
  94. {"", "", "", " HEURE"},
  95. {"E CINQUE", "FIVE PAST ", "Y CINCO", "ET CINQ"},
  96. {"E DIECI", "TEN PAST ", "Y DIEZ", "DIX"},
  97. {"E UN QUARTO", "QUARTER PAST ", "Y CUARTO", "ET QUART"},
  98. {"E VENTI", "TWENTY PAST ", "Y VEINTE", "VINGT"},
  99. {"E VENTICINQUE", "TWENTYFIVE PAST ", "Y VEINTICINCO", "VINGT-CINQ"},
  100. {"E TRENTA", "HALF PAST ", "Y MEDIA", "ET DEMIE"},
  101. {"E TRENTACINQUE", "TWENTYFIVE TO ", "MENOS VEINTICINCO", "MOINS VINGT-CINQ"},
  102. {"MENO VENTI", "TWENTY TO ", "MENOS VEINTE", "MOINS VINGT"},
  103. {"MENO UN QUARTO", "A QUARTER TO ", "MENOS CUARTO", "MOINS LE QUART"},
  104. {"MENO DIECI", "TEN TO ", "MENOS DIEZ", "MOINS DIX"},
  105. {"MENO CINQUE", "FIVE TO ", "MENOS CINCO", "MOINS CINQ"},
  106. {"UNA", "ONE", "UNA", "UNE"},
  107. {"DUE", "TWO", "DOS", "DEUX"},
  108. {"TRE", "THREE", "TRES", "TROIS"},
  109. {"QUATTRO", "FOUR", "CUATRO", "QUATRE"},
  110. {"CINQUE", "FIVE", "CINCO", "CINQ"},
  111. {"SEI", "SIX", "SEIS", "SIX"},
  112. {"SETTE", "SEVEN", "SIETE", "SIETE"},
  113. {"OTTO", "EIGHT", "OCHO", "HUITS"},
  114. {"NOVE", "NINE", "NUEVE", "NEUF"},
  115. {"DIECI", "TEN", "DIEZ", "DIX"},
  116. {"UNDICI", "ELEVEN", "ONCE", "ONZE"},
  117. {"DODICI", "TWELVE", "DOCE", "MIDI"},
  118. {"DODICI", "TWELVE", "DOCE", "MINUIT"},
  119. {"", " O'CLOCK", "", ""},
  120. {" ", "AM", "AM", "AM"},
  121. {" ", "PM", "PM", "PM"},
  122. {"Orario sincronizzato", "Time syncronized", "Tiempo sincronizado", "Heure sincronizee"},
  123. {"Impossibile connettere a rete: ", "Impossible connection to network: ", "Imposible conectarse a la red: ", "Impossible de se connecter au réseau: "},
  124. {"Connesso a rete: ", "Connected to network: ", "Conectado a la red: ", "Connecté au réseau: "},
  125. {"Connessione WiFi in corso:", "WiFi connection in progress:", "Conexión WiFi en curso:", "Connexion WiFi en cours:"},
  126. };
  127.  
  128.  
  129. int minuti = -1;
  130. int ore = -1;
  131. int secondi = 0;
  132. static int ultimiminutiStamp = -1;
  133. static int ultimaOraStamp = -1;
  134. static int ultimipalliniStamp = -1;
  135.  
  136.  
  137.  
  138. void setup() {
  139. Serial.begin(9600);
  140. Wire.begin();
  141. if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  142. Serial.println("Errore display");
  143. }
  144. display.clearDisplay();
  145. display.setTextSize(1);
  146. display.setTextColor(SSD1306_WHITE);
  147.  
  148.  
  149. LinguaSelezionata = selezionaLingua();
  150. display.clearDisplay();
  151. display.setCursor(0, 0);
  152. display.println(MESSAGES[MSG_SELLANG][LinguaSelezionata]);
  153. display.print(nomiLingue[LinguaSelezionata]);
  154. display.display();
  155. delay(1500);
  156.  
  157.  
  158. display.clearDisplay();
  159. display.setCursor(0, 0);
  160. display.print(MESSAGES[MSG_START][LinguaSelezionata]);
  161. display.setCursor(0,16);
  162. display.setTextSize(2);
  163. display.print("QLOCKTWO");
  164.  
  165.  
  166. display.display();
  167. delay(2000);
  168. display.setTextSize(1);
  169. display.clearDisplay();
  170. display.display();
  171.  
  172. /*
  173. WiFi.mode(WIFI_STA);
  174. WiFi.begin(ssid, password);
  175.  
  176. unsigned long startAttemptTime = millis();
  177. while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 20000) {
  178. ConnessioneWifi();
  179. }
  180. if (WiFi.status() != WL_CONNECTED) {
  181. ErroreWifi();
  182. }
  183. else{
  184. WiFiConnesso();
  185. }
  186. */
  187.  
  188. FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  189. FastLED.setBrightness(BRIGHTNESS);
  190. FastLED.clear();
  191. FastLED.show();
  192.  
  193. /*
  194. configTime(0, 0, ntpServer);
  195. setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 1);
  196. tzset();
  197. lastSyncMillis = millis();
  198. */
  199.  
  200. ore = selezionaOre();
  201. minuti = selezionaMin();
  202. secondi = selezionaSec();
  203.  
  204. display.clearDisplay();
  205. display.display();
  206. }
  207.  
  208.  
  209. void loop() {
  210. /*
  211. currentMillis = millis();
  212. if (millis() - lastSyncMillis > syncInterval) {
  213. configTime(0, 0, ntpServer);
  214. tzset();
  215. lastSyncMillis = millis();
  216. display.clearDisplay();
  217. display.setCursor(0, 0);
  218. display.println(MESSAGES[MSG_TIMEUPD][LinguaSelezionata]);
  219. display.display();
  220. }
  221. */
  222.  
  223. struct tm timeinfo;
  224. //if (getLocalTime(&timeinfo)) {
  225. // secondi = timeinfo.tm_sec;
  226. // minuti = timeinfo.tm_min;
  227. // ore = timeinfo.tm_hour;
  228.  
  229. display.fillRect(0,0,112,8,SSD1306_BLACK);
  230. char orario[9];
  231. sprintf(orario, "%02d:%02d:%02d", ore, minuti, secondi);
  232.  
  233. display.setCursor(0,0);
  234. display.print(orario);
  235. display.display();
  236.  
  237. int oreDaStamp = ore;
  238. if (LinguaSelezionata == 0){
  239. if(minuti > 39){if (ore != 24) { oreDaStamp++; } else {oreDaStamp = 1;}}//passaggio ora successiva (MENO xx)
  240. }
  241. else {
  242. if(minuti > 34){if (ore != 24) { oreDaStamp++; } else {oreDaStamp = 1;}}//passaggio ora successiva (MENO xx)
  243. }
  244. if(ore > 11) {
  245. display.setCursor(112,0);
  246. display.print(MESSAGES[MSG_HOURPM][LinguaSelezionata]);
  247. display.display();
  248. }
  249. else {
  250. display.setCursor(112,0);
  251. display.print(MESSAGES[MSG_HOURAM][LinguaSelezionata]);
  252. display.display();
  253. }
  254.  
  255. int minutiDaStamp;
  256. minutiDaStamp = minuti - (minuti % 5);
  257.  
  258.  
  259.  
  260. if(LinguaSelezionata == 1) goto minuti; //se ENG vado ai minuti per stampare prima loro
  261.  
  262.  
  263. // /‾‾‾\ |‾‾\ |‾‾‾
  264. // | | |__/ |---
  265. // \___/ | \ |___
  266. ore:
  267. if(ultimaOraStamp != oreDaStamp){
  268. ultimaOraStamp = oreDaStamp;
  269. if(LinguaSelezionata == 1){
  270. display.fillRect(0,16,SCREEN_WIDTH,8,SSD1306_BLACK);
  271. display.setCursor(0,16);
  272. }
  273. else {
  274. display.fillRect(0,8,SCREEN_WIDTH,8,SSD1306_BLACK);
  275. display.setCursor(0,8);
  276. if(oreDaStamp != 1 && oreDaStamp != 13){
  277. display.print(MESSAGES[MSG_INITHOURS][LinguaSelezionata]);
  278. display.display();
  279. }
  280. else {
  281. display.setCursor(0,8);
  282. display.print(MESSAGES[MSG_INITHOUR][LinguaSelezionata]);
  283. display.display();
  284. }
  285. }
  286.  
  287. switch (oreDaStamp % 12) {
  288. case 0:
  289. if(oreDaStamp == 12) {
  290. display.print(MESSAGES[MSG_HOUR12AM][LinguaSelezionata]);
  291. break;
  292. }
  293. if(oreDaStamp == 24) {
  294. display.print(MESSAGES[MSG_HOUR12PM][LinguaSelezionata]);
  295. break;
  296. }
  297. case 1:
  298. display.print(MESSAGES[MSG_HOUR1][LinguaSelezionata]);
  299. break;
  300. case 2:
  301. display.print(MESSAGES[MSG_HOUR2][LinguaSelezionata]);
  302. break;
  303. case 3:
  304. display.print(MESSAGES[MSG_HOUR3][LinguaSelezionata]);
  305. break;
  306. case 4:
  307. display.print(MESSAGES[MSG_HOUR4][LinguaSelezionata]);
  308. break;
  309. case 5:
  310. display.print(MESSAGES[MSG_HOUR5][LinguaSelezionata]);
  311. break;
  312. case 6:
  313. display.print(MESSAGES[MSG_HOUR6][LinguaSelezionata]);
  314. break;
  315. case 7:
  316. display.print(MESSAGES[MSG_HOUR7][LinguaSelezionata]);
  317. break;
  318. case 8:
  319. display.print(MESSAGES[MSG_HOUR8][LinguaSelezionata]);
  320. break;
  321. case 9:
  322. display.print(MESSAGES[MSG_HOUR9][LinguaSelezionata]);
  323. break;
  324. case 10:
  325. display.print(MESSAGES[MSG_HOUR10][LinguaSelezionata]);
  326. break;
  327. case 11:
  328. display.print(MESSAGES[MSG_HOUR11][LinguaSelezionata]);
  329. break;
  330. }
  331.  
  332.  
  333. if(LinguaSelezionata != 3) {
  334. if(minutiDaStamp == 0) {
  335. display.print(MESSAGES[MSG_HOURPRECISE][LinguaSelezionata]);
  336. display.display();
  337. }
  338. else {
  339. display.display();
  340. }
  341. }
  342. else {
  343. if(oreDaStamp == 0 || oreDaStamp == 12){
  344. display.display();
  345. }
  346. if(oreDaStamp == 1 || oreDaStamp == 13){
  347. display.print(MESSAGES[MSG_FINHOUR][LinguaSelezionata]);
  348. display.display();
  349. }
  350. if(oreDaStamp != 0 && oreDaStamp != 1 && oreDaStamp != 12 && oreDaStamp != 13) {
  351. display.print(MESSAGES[MSG_FINHOURS][LinguaSelezionata]);
  352. display.display();
  353. }
  354.  
  355. }
  356.  
  357. if(LinguaSelezionata == 1) goto pallini;
  358.  
  359. }
  360.  
  361. // |\ /| | |\ | | | ‾‾|‾‾ |
  362. // | \/ | | | \ | | | | |
  363. // | | | | \| \__/ | |
  364. minuti:
  365. if(ultimiminutiStamp != minutiDaStamp){
  366. ultimiminutiStamp = minutiDaStamp;
  367. if(LinguaSelezionata == 1){
  368. display.fillRect(0,8,SCREEN_WIDTH,8,SSD1306_BLACK); //cancello riga 2
  369. display.setCursor(0,8);
  370. if(oreDaStamp != 1 && oreDaStamp != 13){
  371. display.print(MESSAGES[MSG_INITHOURS][LinguaSelezionata]);
  372. display.display();
  373. }
  374. else {
  375. display.print(MESSAGES[MSG_INITHOUR][LinguaSelezionata]);
  376. display.display();
  377. }
  378. }
  379. else {
  380. display.fillRect(0,16,SCREEN_WIDTH,8,SSD1306_BLACK); //cancello riga 3
  381. display.setCursor(0,16);
  382. }
  383.  
  384. switch (minutiDaStamp) {
  385. case 0:
  386. break;
  387. case 5:
  388. display.print(MESSAGES[MSG_MIN5][LinguaSelezionata]);
  389. display.display();
  390. break;
  391. case 10:
  392. display.print(MESSAGES[MSG_MIN10][LinguaSelezionata]);
  393. display.display();
  394. break;
  395. case 15:
  396. display.print(MESSAGES[MSG_MIN15][LinguaSelezionata]);
  397. display.display();
  398. break;
  399. case 20:
  400. display.print(MESSAGES[MSG_MIN20][LinguaSelezionata]);
  401. display.display();
  402. break;
  403. case 25:
  404. display.print(MESSAGES[MSG_MIN25][LinguaSelezionata]);
  405. display.display();
  406. break;
  407. case 30:
  408. display.print(MESSAGES[MSG_MIN30][LinguaSelezionata]);
  409. display.display();
  410. break;
  411. case 35:
  412. display.print(MESSAGES[MSG_MIN35][LinguaSelezionata]);
  413. display.display();
  414. break;
  415. case 40:
  416. display.print(MESSAGES[MSG_MIN40][LinguaSelezionata]);
  417. display.display();
  418. break;
  419. case 45:
  420. display.print(MESSAGES[MSG_MIN45][LinguaSelezionata]);
  421. display.display();
  422. break;
  423. case 50:
  424. display.print(MESSAGES[MSG_MIN50][LinguaSelezionata]);
  425. display.display();
  426. break;
  427. case 55:
  428. display.print(MESSAGES[MSG_MIN55][LinguaSelezionata]);
  429. display.display();
  430. break;
  431. }
  432. }
  433. if(LinguaSelezionata == 1) goto ore;
  434.  
  435. // |‾‾‾\ /\ | | | |\ | |
  436. // |___/ /--\ | | | | \ | |
  437. // | / \ |___ |___ | | \| |
  438. pallini:
  439. int lastDigit = minuti % 10;
  440. int numPallini = 0;
  441.  
  442. if (lastDigit == 1 || lastDigit == 6) {
  443. numPallini = 1;
  444. } else if (lastDigit == 2 || lastDigit == 7) {
  445. numPallini = 2;
  446. } else if (lastDigit == 3 || lastDigit == 8) {
  447. numPallini = 3;
  448. } else if (lastDigit == 4 || lastDigit == 9) {
  449. numPallini = 4;
  450. }
  451.  
  452. if(ultimipalliniStamp != numPallini) {
  453. ultimipalliniStamp = numPallini;
  454. display.setCursor(0,24);
  455. display.fillRect(0, 24, SCREEN_WIDTH, 8,SSD1306_BLACK); //cancello riga 4
  456. display.display();
  457. FastLED.clear();
  458. FastLED.show();
  459.  
  460. for (int i = 0; i < numPallini; i++) {
  461. display.print(".");
  462. display.display();
  463. for (int b = 0; b <= BRIGHTNESS; b += 2) {
  464. leds[i] = CRGB(b, b, b);
  465. FastLED.show();
  466. delay(50);
  467. }
  468. }
  469. }
  470. //}
  471.  
  472. secondi ++;
  473. if(secondi == 60) {minuti ++; secondi=0;}
  474. if(minuti == 60) {ore++; minuti=0;}
  475. if(ore == 24) {ore = 0;}
  476. delay(1000);
  477. }
  478.  
  479. int selezioneLinguaConPulsante(int valoreIniziale, int maxValore) {
  480. pinMode(BUTTON_PIN, INPUT_PULLUP);
  481. int valore = valoreIniziale;
  482. unsigned long pressStart = 0;
  483. bool confermato = false;
  484.  
  485.  
  486. display.clearDisplay();
  487. display.setCursor(0, 0);
  488. display.println("LANGUAGE: ");
  489. display.print(MESSAGES[MSG_INSTRUCTIONS][1]);
  490. display.display();
  491.  
  492.  
  493. while (!confermato) {
  494. if (digitalRead(BUTTON_PIN) == LOW) {
  495. pressStart = millis();
  496. while (digitalRead(BUTTON_PIN) == LOW) {
  497. if (millis() - pressStart > LONG_PRESS_TIME) {
  498. confermato = true;
  499. break;
  500. }
  501. }
  502. if (!confermato) {
  503. valore = (valore + 1) % (maxValore + 1);
  504. display.fillRect(0,24,SCREEN_WIDTH,8,SSD1306_BLACK);
  505. display.setCursor(0, 24);
  506. display.print(nomiLingue[valore]);
  507. display.display();
  508. delay(300); // debounce
  509. }
  510. }
  511. }
  512. return valore;
  513. }
  514.  
  515.  
  516. int selezioneTimeConPulsante(int valoreIniziale, int maxValore) {
  517. pinMode(BUTTON_PIN, INPUT_PULLUP);
  518. int valore = valoreIniziale;
  519. unsigned long pressStart = 0;
  520. bool confermato = false;
  521.  
  522.  
  523. display.clearDisplay();
  524. display.setCursor(0, 0);
  525. display.println("Valore: ");
  526. display.print(valore);
  527. display.display();
  528.  
  529.  
  530. while (!confermato) {
  531. if (digitalRead(BUTTON_PIN) == LOW) {
  532. pressStart = millis();
  533. while (digitalRead(BUTTON_PIN) == LOW) {
  534. if (millis() - pressStart > LONG_PRESS_TIME) {
  535. confermato = true;
  536. break;
  537. }
  538. }
  539. if (!confermato) {
  540. valore = (valore + 1) % (maxValore + 1);
  541. display.fillRect(0,24,SCREEN_WIDTH,8,SSD1306_BLACK);
  542. display.setCursor(0, 24);
  543. display.print(valore);
  544. display.display();
  545. delay(300); // debounce
  546. }
  547. }
  548. }
  549. return valore;
  550. }
  551.  
  552.  
  553. int selezionaLingua() {
  554. return selezioneLinguaConPulsante(0, NumLang - 1);
  555. }
  556.  
  557. int selezionaOre() {
  558. return selezioneTimeConPulsante(0, NumHour-1);
  559. }
  560.  
  561. int selezionaMin() {
  562. return selezioneTimeConPulsante(0, NumMin-1);
  563. }
  564.  
  565. int selezionaSec() {
  566. return selezioneTimeConPulsante(0, NumSec-1);
  567. }
  568.  
  569. /*
  570. void ErroreWifi(void) {
  571. display.clearDisplay();
  572. display.setCursor(0,0);
  573. display.println(MESSAGES[MSG_WIFIERR][LinguaSelezionata]); //Messaggio su display OLED
  574. display.println(ssid);
  575. display.display();
  576. delay(2000);
  577. }
  578.  
  579. void WiFiConnesso(void) {
  580. display.clearDisplay();
  581. display.setCursor(0,0);
  582. display.println(MESSAGES[MSG_WIFIOK][LinguaSelezionata]); //Messaggio su display OLED
  583. display.println(ssid);
  584. display.display();
  585. delay(2000);
  586. }
  587.  
  588. void ConnessioneWifi(void) {
  589. display.setCursor(0, 0);
  590. display.println(MESSAGES[MSG_WIFICONN][LinguaSelezionata]);
  591. display.println(ssid);
  592. display.display();
  593. }
  594. */
Advertisement
Add Comment
Please, Sign In to add comment