PowerTGS440

Project_Dzialka_v0.8

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