PowerTGS440

Project_Dzialka_v0.3

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