PowerTGS440

Project_Dzialka_v0.4

May 17th, 2021
392
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 18.50 KB | None | 0 0
  1. // --------------------------------------------------------------------------------------------------------------------------------- //
  2. //
  3. // Projekt   :   Działka Project 1 - Zegar NANO :-) coś z tym badziewiem w szufladzie trzeba zrobić...
  4. // Autor     :   Tomasz Majcher
  5. //
  6. //
  7. // --------------------------------------------------------------------------------------------------------------------------------- //
  8. //
  9. //  wersja 0.4    :   2x expander
  10. //  wersja 0.3    :   led & key
  11. //  wersja 0.2    :   wyświetlacz TM1637
  12. //  wersja 0.1    :   zegar RTC
  13. //
  14. // --------------------------------------------------------------------------------------------------------------------------------- //
  15.  
  16.  
  17. #include <virtuabotixRTC.h>             // biblioteka zegar RTC  
  18. #include <TM1637Display.h>              // wyświetlacz TM1637
  19. #include "wiring_shift_mod.h"           // wiring
  20. #include "PCF8574.h"                    // expander'y
  21.  
  22.  
  23. #define SerialSpeed 9600                // serial prędkość
  24. #define SERIAL      true                // serial wyświetl tak (true) / nie (false)
  25. #define RTC_SET     false               // aktualizacja manualna zegara RTC
  26.  
  27. // ----------------- expander'y ------------------------------- //
  28.  
  29. #define exp1_adres    0x20
  30. #define exp2_adres    0x27
  31.  
  32. // ----------------- wyswietlacz TM1637 ----------------------- //
  33.  
  34. #define CLK 2
  35. #define DIO 3
  36.  
  37. // ----------------- panel LED & KEY -------------------------- //
  38.  
  39. #define str_pin   4
  40. #define clk_pin   5
  41. #define dat_pin   6
  42. #define CLOCK_TYPE CLOCK_INVERT
  43. #define CLOCK_DELAY_US 1
  44. uint8_t przycisk = 0;
  45.  
  46. const uint8_t LED_adres[] = { 0xC1, 0xC3, 0xC5, 0xC7, 0xC9, 0xCB, 0xCD, 0xCF};                   // adresy LED moduły LED & KEY
  47.  
  48. const uint8_t DIGIT_adres[] = { 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE};                 // adresy DIGIT moduły LED & KEY
  49.  
  50.                                 /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
  51. const uint8_t digits[] =      { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };    // cyfry bez kropki
  52.  
  53.                                 /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
  54. const uint8_t digits_dots[] = { 0xBF, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef };    // cyfry z kropką
  55.  
  56. // ----------------- PRZEKAZNIKI -------------------------- //
  57.  
  58. bool R_Status [8];        // stan logiczny przekaźników
  59.  
  60. // --------------------------------------------------------------------------------------------------------------------------------- //
  61. // --- O B I E K T Y --------------------------------------------------------------------------------------------------------------- //
  62. // --------------------------------------------------------------------------------------------------------------------------------- //
  63.  
  64.  
  65. virtuabotixRTC myRTC(A0, A1, A2);                         // obiekt myRTC
  66. TM1637Display display = TM1637Display(CLK, DIO);          // obiekt DISPLAY
  67. PCF8574 expander1(exp1_adres);                                  // expander 1                            
  68. PCF8574 expander2(exp2_adres);                                  // expander 2
  69.  
  70. // --------------------------------------------------------------------------------------------------------------------------------- //
  71. // --- Zmienne globalne ------------------------------------------------------------------------------------------------------------ //
  72. // --------------------------------------------------------------------------------------------------------------------------------- //
  73.  
  74. struct RTC
  75. {
  76.     uint8_t   godzina = 0;
  77.     uint8_t   minuta  = 0;
  78.     uint8_t   sekunda = 0;
  79.     uint8_t   dzien_tygodnia = 0;
  80.     uint8_t   dzien = 0;
  81.     uint8_t   miesiac = 0;
  82.     uint16_t  rok = 0;
  83. }
  84. zegar;
  85.  
  86.  
  87. unsigned long aktualnyCzas = 0;    
  88.  
  89. unsigned long zapamietanyCzas1 = 0;    // dla millis
  90. unsigned long roznicaCzasu1 = 0;       // dla millis
  91.  
  92. unsigned long zapamietanyCzas2 = 0;    // dla millis
  93. unsigned long roznicaCzasu2 = 0;       // dla millis
  94.  
  95. bool F_sec = false;                    // sekundnik wyświetlacza TM1637 (:)
  96.  
  97. // --------------------------------------------------------------------------------------------------------------------------------- //
  98. // --- Aktualizuj Czas do Strukrury zegar ------------------------------------------------------------------------------------------ //
  99. // --------------------------------------------------------------------------------------------------------------------------------- //
  100.  
  101. void AktualizujCzas()
  102. {
  103.     myRTC.updateTime();                               // pobierz czas z zegara
  104.  
  105.     zegar.godzina         =   myRTC.hours;            // pobierz i zapisz godzinę
  106.     zegar.minuta          =   myRTC.minutes;          // pobierz i zapisz minutę
  107.     zegar.sekunda         =   myRTC.seconds;          // pobierz i zapisz sekundę
  108.     zegar.dzien           =   myRTC.dayofmonth;       // pobierz i zapisz dzień miesiąca
  109.     zegar.dzien_tygodnia  =   myRTC.dayofweek;        // pobierz i zapisz dzień tygodnia
  110.     zegar.miesiac         =   myRTC.month;            // pobierz i zapisz miesiąc
  111.     zegar.rok             =   myRTC.year;             // pobierz i zapisz rok      
  112. }
  113. // --------------------------------------------------------------------------------------------------------------------------------- //
  114. // --- Aktualizuj Czas do Strukrury zegar ------------------------------------------------------------------------------------------ //
  115. // --------------------------------------------------------------------------------------------------------------------------------- //
  116.  
  117. void WyswietlCzas()
  118. {
  119.     int clock;
  120.     byte bufor;
  121.  
  122.     bufor = zegar.godzina / 10;       // (HH / 10)    - podziel, wyznacz część całkowitą (dziesiątki) godziny
  123.     clock = 1000 * bufor;             // (Hh * 1000)  - zapisz Hx:xx
  124.  
  125.     bufor = zegar.godzina % 10;       // (HH % 10)    - reszcza z dzielenia, wyznacz część całkowitą (jedności) godziny
  126.     clock = clock + (bufor * 100);    // (hH * 100)   - zapisz xH:xx
  127.  
  128.     bufor = zegar.minuta / 10;        // (MM / 10)    - podziel, wyznacz część całkowitą (dziesiątki) minuty
  129.     clock = clock + (bufor * 10);     // (Mm * 10)    - zapisz xx:Mx
  130.  
  131.     bufor = zegar.minuta % 10;        // (MM % 10)    - reszcza z dzielenia, wyznacz część całkowitą (jedności) minuty
  132.     clock = clock + (bufor * 1);      // (mM * 1)     - zapisz xx:xM
  133.  
  134.     if (F_sec)                                                           // jeśli flaga jest prawdziwa (true)
  135.     {
  136.         display.showNumberDecEx(clock, 0b11100000, true, 4, 0);          // wyświetl dwukropek między godziną a minutą
  137.         F_sec = false;                                                   // przestaw flagę na fałszywą (false)
  138.     }
  139.     else                                                                 // jeśli flaga jest fałszywa (false)
  140.     {
  141.         display.showNumberDecEx(clock, 0b00000000, true, 4, 0);          // nie wyświetlaj dwukropka między godziną a minutą      
  142.         F_sec = true;                                                    // przestaw flagę na prawdziwą (true)
  143.     }
  144. }
  145.  
  146. // --------------------------------------------------------------------------------------------------------------------------------- //
  147. // --- S E T    R T C -------------------------------------------------------------------------------------------------------------- //
  148. // --------------------------------------------------------------------------------------------------------------------------------- //
  149.  
  150. void setRTC()
  151. {
  152.     myRTC.setDS1302Time(0, 36, 9, 1, 17, 5, 2021);
  153. }
  154.  
  155. // --------------------------------------------------------------------------------------------------------------------------------- //
  156. // --- E X P A N D E R   I N I T    1 ---------------------------------------------------------------------------------------------- //
  157. // --------------------------------------------------------------------------------------------------------------------------------- //
  158.  
  159. void ExpanderInit_1()
  160. {
  161.     expander1.begin();
  162.  
  163.     if (!expander1.begin())
  164.     {
  165.         #if SERIAL
  166.             Serial.print(F("\n[SETUP] [EXPANDER] Nie udało się inicjować ---> EXPANDER 1 : 0x"));
  167.             Serial.print(exp1_adres, HEX);
  168.         #endif
  169.     }
  170.     if (!expander1.isConnected())
  171.     {
  172.         #if SERIAL
  173.             Serial.print(F("\n[SETUP] [EXPANDER] Nie podłączono ---> EXPANDER 1 : 0x"));
  174.             Serial.print(exp1_adres, HEX);
  175.         #endif
  176.     }
  177.     else
  178.     {
  179.         #if SERIAL
  180.             Serial.print(F("\n[SETUP] [EXPANDER] Udane połączenie ---> EXPANDER 1 : 0x"));
  181.             Serial.print(exp1_adres, HEX);
  182.         #endif
  183.     }  
  184. }
  185.  
  186. // --------------------------------------------------------------------------------------------------------------------------------- //
  187. // --- E X P A N D E R   I N I T    2 ---------------------------------------------------------------------------------------------- //
  188. // --------------------------------------------------------------------------------------------------------------------------------- //
  189.  
  190. void ExpanderInit_2()
  191. {
  192.     expander2.begin();
  193.  
  194.     if (!expander2.begin())
  195.     {
  196.         #if SERIAL
  197.             Serial.print(F("\n[SETUP] [EXPANDER] Nie udało się inicjować ---> EXPANDER 2 : 0x"));
  198.             Serial.print(exp2_adres, HEX);
  199.         #endif
  200.     }
  201.     if (!expander2.isConnected())
  202.     {
  203.         #if SERIAL
  204.             Serial.print(F("\n[SETUP] [EXPANDER] Nie podłączono ---> EXPANDER 2 : 0x"));
  205.             Serial.print(exp2_adres, HEX);            
  206.         #endif
  207.     }
  208.     else
  209.     {
  210.         #if SERIAL
  211.             Serial.print(F("\n[SETUP] [EXPANDER] Udane połączenie ---> EXPANDER 2 : 0x"));
  212.             Serial.print(exp2_adres, HEX);
  213.         #endif
  214.     }  
  215. }
  216.  
  217. // --------------------------------------------------------------------------------------------------------------------------------- //
  218. // --- S E T U P ------------------------------------------------------------------------------------------------------------------- //
  219. // --------------------------------------------------------------------------------------------------------------------------------- //
  220.  
  221. void setup()
  222. {
  223.     #if SERIAL
  224.         Serial.begin(SerialSpeed);
  225.         Serial.print(F("[SETUP] [SERIAL] Serial Speed : "));
  226.         Serial.print(SerialSpeed);
  227.     #endif
  228.  
  229.     pinMode(A0,OUTPUT);                   // RTC Clock -> pin CLK
  230.     pinMode(A1,OUTPUT);                   // RTC Clock -> pin DAT
  231.     pinMode(A2,OUTPUT);                   // RTC Clock -> pin RST
  232.  
  233.     display.clear();
  234.     display.setBrightness(7);  
  235.  
  236.     #if RTC_SET
  237.         setRTC();
  238.     #endif
  239.  
  240.     pinMode(str_pin, OUTPUT);              // digital 4 OUT dla strobe (LED & KEY)
  241.     pinMode(clk_pin, OUTPUT);              // digital 3 OUT dla clock (LED & KEY)
  242.     pinMode(dat_pin, OUTPUT);              // digital 2 OIT dla data (LED & KEY)
  243.    
  244.     sendCommand(0x8f);                     // activate LED & KEY
  245.     reset();                               // reset LED & KEY
  246.     flash_LEDKEY();
  247.     flash_LEDKEY();
  248.     flash_LEDKEY();
  249.  
  250.     for(byte i = 0; i < 8; i++)
  251.     {
  252.         RelayTurnOff(i);                   // diody i wyświetlacz dla przekaźników OFF
  253.         R_Status[i] = false;               // status przekaźników FALSE ( OFF )
  254.     }
  255.  
  256.     ExpanderInit_1();                    
  257.     ExpanderInit_2();
  258.  
  259.    
  260. }
  261.  
  262. // --------------------------------------------------------------------------------------------------------------------------------- //
  263. // --- L O O P --------------------------------------------------------------------------------------------------------------------- //
  264. // --------------------------------------------------------------------------------------------------------------------------------- //
  265.  
  266. void loop()
  267. {
  268.  
  269.     aktualnyCzas = millis();                                    
  270.  
  271.     roznicaCzasu1 = aktualnyCzas - zapamietanyCzas1;            
  272.     roznicaCzasu2 = aktualnyCzas - zapamietanyCzas2;    
  273.  
  274.     // --- warunek wykonywany co 1 minutę ------------------------------------------------------- //
  275.  
  276.     if (roznicaCzasu2 >= 60000UL)                                 // wykonuj co minutę
  277.     {                                                            
  278.         AktualizujCzas();                                         // zapisz z zegara do struktury
  279.         zapamietanyCzas2 = aktualnyCzas;                          // resetuj warunek                    
  280.     }          
  281.  
  282.     // --- warunek wykonywany co 1 sekundę ------------------------------------------------------ //
  283.  
  284.     if (roznicaCzasu1 >= 1000UL)                                 // wykonuj co 1 sekundę
  285.     {  
  286.         WyswietlCzas();                                           // wyświetl czas na TM1637        
  287.         zapamietanyCzas1 = aktualnyCzas;                          // resetuj warunek
  288.     }          
  289.  
  290.     // ------------------------------------------------------------------------------------------ //
  291.  
  292.     przycisk = readButtons();
  293.  
  294.     switch (przycisk)
  295.     {
  296.         case      1   :   RelaySwitch(0);   break;
  297.         case      2   :   RelaySwitch(1);   break;
  298.         case      4   :   RelaySwitch(2);   break;
  299.         case      8   :   RelaySwitch(3);   break;
  300.         case     16   :   RelaySwitch(4);   break;
  301.         case     32   :   RelaySwitch(5);   break;
  302.         case     64   :   RelaySwitch(6);   break;
  303.         case    128   :   RelaySwitch(7);   break;
  304.         default       : break;
  305.  
  306.     }
  307.    
  308.     // ------------------------------------------------------------------------------------------ //
  309. }
  310.  
  311. ///////////////////////////////////////////////////////////////////////////////////////////////
  312. //  RelaySwitch
  313. ///////////////////////////////////////////////////////////////////////////////////////////////
  314.  
  315. void RelaySwitch(byte nr)
  316. {
  317.     if ( R_Status[nr])
  318.     {
  319.         RelayTurnOff(nr);
  320.         R_Status[nr] = false;
  321.     }
  322.     else
  323.     if (!R_Status[nr])
  324.     {
  325.         RelayTurnOn(nr);
  326.         R_Status[nr] = true;
  327.     }
  328. }
  329.  
  330. ///////////////////////////////////////////////////////////////////////////////////////////////
  331. //  LED & KEY funckje startu
  332. ///////////////////////////////////////////////////////////////////////////////////////////////
  333.  
  334. void sendCommand(uint8_t value)
  335. {
  336.     digitalWrite(str_pin, LOW);
  337.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, value);
  338.     digitalWrite(str_pin, HIGH);
  339. }
  340.  
  341.  
  342. ///////////////////////////////////////////////////////////////////////////////////////////////
  343. //
  344. ///////////////////////////////////////////////////////////////////////////////////////////////
  345.  
  346. void reset()
  347. {
  348.     sendCommand(0x40);
  349.     digitalWrite(str_pin, LOW);
  350.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0xc0);       // reset od adresu 0
  351.  
  352.     for (uint8_t i = 0; i < 16; i++)                                                 // petla 16x
  353.     {
  354.         shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0x00);   // 8x LED + 8x DIGIT reset
  355.     }
  356.     digitalWrite(str_pin, HIGH);
  357. }
  358.  
  359. ///////////////////////////////////////////////////////////////////////////////////////////////
  360. //
  361. ///////////////////////////////////////////////////////////////////////////////////////////////
  362.  
  363. void flash_LEDKEY()          
  364. {
  365.     for (uint8_t i = 0; i < 16; i++)                                   // zapal diody 1-8 z przerwą 100ms
  366.     {
  367.         if (i < 8) setLed(1, i);                                       // zapal diodę na pozycji i jesli i<8
  368.         else setLed(0, i - 8);                                         // zgas diodę na pozycji i jeśli i>8
  369.         delay(100);
  370.     }
  371. }
  372.  
  373. ///////////////////////////////////////////////////////////////////////////////////////////////
  374. //
  375. ///////////////////////////////////////////////////////////////////////////////////////////////
  376.  
  377. void setLed(uint8_t flaga, uint8_t adres)
  378. {
  379.     pinMode(dat_pin, OUTPUT);                                                              
  380.     sendCommand(0x44);
  381.     digitalWrite(str_pin, LOW);
  382.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, LED_adres[adres]);
  383.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, flaga);
  384.     digitalWrite(str_pin, HIGH);
  385. }
  386.  
  387. ///////////////////////////////////////////////////////////////////////////////////////////////
  388. //
  389. ///////////////////////////////////////////////////////////////////////////////////////////////
  390.  
  391. uint8_t readButtons(void)
  392. {
  393.     uint8_t buttons = 0;
  394.     digitalWrite(str_pin, LOW);
  395.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0x42);
  396.  
  397.     pinMode(dat_pin, INPUT);
  398.  
  399.     for (uint8_t i = 0; i < 4; i++)
  400.     {
  401.         uint8_t v = shiftInMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US) << i;
  402.         buttons |= v;
  403.     }
  404.  
  405.     pinMode(dat_pin, OUTPUT);
  406.     digitalWrite(str_pin, HIGH);  
  407.     delay(200);
  408.     return buttons;
  409. }
  410.  
  411. ///////////////////////////////////////////////////////////////////////////////////////////////
  412. //
  413. ///////////////////////////////////////////////////////////////////////////////////////////////
  414.  
  415. void RelayTurnOff(byte adres)
  416. {
  417.     digitalWrite(str_pin, LOW);                                                                 // pin strobe na OFF
  418.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, DIGIT_adres[adres]);    // ustaw adres
  419.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0x5c);                  // ustaw 0 (0x3f)
  420.     digitalWrite(str_pin, HIGH);      
  421.     setLed(0, adres);    
  422.     expander1.write(adres, LOW);                                                                // wyłącz przekaźnik na expander1
  423. }
  424.  
  425. ///////////////////////////////////////////////////////////////////////////////////////////////
  426. //
  427. ///////////////////////////////////////////////////////////////////////////////////////////////
  428.  
  429. void RelayTurnOn(byte adres)
  430. {
  431.     digitalWrite(str_pin, LOW);                                                                 // pin strobe na OFF
  432.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, DIGIT_adres[adres]);    // ustaw adres
  433.     shiftOutMod(dat_pin, clk_pin, LSBFIRST, CLOCK_TYPE, CLOCK_DELAY_US, 0x63);                  // ustaw 1 (0x3f)
  434.     digitalWrite(str_pin, HIGH);    
  435.     setLed(1, adres);  
  436.     expander1.write(adres, HIGH);                                                               // włącz przekaźnik na expander1
  437. }
Advertisement
Add Comment
Please, Sign In to add comment