PowerTGS440

Project_Dzialka_v0.6

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