Zasilacz awaryjny-UPS

Prezentacje projektów
ODPOWIEDZ
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Zasilacz awaryjny-UPS

Post autor: pimowo » 05 gru 2017, 14:43

Hej,
Chciałbym Wam się pochwalić/pożalić swoim zasilaczem awaryjnym.
Buduję sobie tego cudaka dla Raspberry Pi bo jak wiadomo w tym mikro-komputerku wszystko jest na karcie SD i nagłe zaniki napięcia bardzo często ubijają karty.

Wszystko się zaczęło od tego, że zrobiłem prosty UPS: dwa ogniwa 18650, moduł ładowarki i przetwornicy STEP-UP

Obrazek Obrazek Obrazek

Ale jak to mówią... apetyt rośnie w miarę jedzenia i po wielkich trudach powstało coś takiego:

Obrazek Obrazek Obrazek Obrazek

Zasilacz będzie w obudowie (Kradex Z-109) na szynę DIN ponieważ Raspberry też będzie wisiał na szynie ;)
Jeszcze dość sporo pracy przede mną, ale małymi kroczkami do przodu.

Teraz jestem na etapie walki z kodem:
  1. '---mikrokontroler
  2. $regfile = "m328pdef.dat"
  3.  
  4. '---zewnetrzny kwarc
  5. $crystal = 11059200
  6.  
  7. '---predkosc UART
  8. $baud = 9600
  9.  
  10. '---konfiguracja stosu
  11. $hwstack = 64
  12. $swstack = 64
  13. $framesize = 128
  14.  
  15. '---konfiguracja watchdog
  16. Config Watchdog = 16
  17.  
  18. '---korekta dla ADC
  19. Const Korekta_prad = 0.001
  20. Const Korekta_napiecie = 0.01
  21.  
  22. '---ilosc probek jakie wykonuje ADC
  23. Const Ilosc_probek = 64
  24.  
  25. '---napiecie pustego akumulatora
  26. Const Pusty_akumulator = 2.8
  27.  
  28. '---napiecie w pelni naladowanego akumulatora
  29. Const Pelny_akumulator = 4.2
  30.  
  31. '---bufor UART
  32. Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  33.  
  34. Config Serialin0 = Buffered , Size = 100                    ' buforowoanie UART
  35. Config Serialout0 = Buffered , Size = 100                   ' buforowoanie UART
  36.  
  37. Config Submode = New
  38.  
  39. '---konfiguracja timera
  40. Config Timer0 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  41. Enable Compare0a : On Compare0a Timer0_isr Nosave : Compare0a = 107       '10ms @11MHz
  42.  
  43. '---konfiguracja przetwornika ADC
  44. Config Adc = Single , Prescaler = Auto , Reference = Aref
  45.  
  46. '---wyjscia
  47. Config Portd.2 = Output : Portd.2 = 0 : Ladowarka Alias Portd.2
  48. Config Portd.6 = Output : Portd.6 = 0 : Wyjscie Alias Portd.6
  49.  
  50. '---wejscia
  51. Config Pinb.2 = Input : Portb.2 = 1 : Usb Alias Pinb.2
  52.  
  53. '---ZMIENNE PROGRAMU
  54. '---zmienna programu i jej odpowiednik w eeprom
  55. Dim Opoznienie_wlaczenia As Single , Opoznienie_wlaczenia_ee As Eram Single
  56. Dim Opoznienie_wylaczenia As Single , Opoznienie_wylaczenia_ee As Eram Single
  57. Dim Ladowanie As Single , Ladowanie_ee As Eram Single
  58. Dim Naladowany As Single , Naladowany_ee As Eram Single
  59. Dim Rozladowany As Single , Rozladowany_ee As Eram Single
  60. Dim Zmiana_ekranu As Byte , Zmiana_ekranu_ee As Eram Byte
  61. Dim Led_lcd As Byte , Led_lcd_ee As Eram Byte
  62.  
  63. '---zmienne dla obliczen czasu
  64. Dim 10ms As Byte , 100ms As Byte , 1s As Byte
  65. Dim Sekundy As Byte , Ekran As Byte , Lcd_ups As Byte
  66. Dim Odczekaj As Byte , Stan_urzadzenia As Byte
  67.  
  68. '---ADC
  69. Dim Pomiar_wejscia As Word , Odczyt As Single , Krok As Byte
  70.  
  71. '---obliczenia danych odczytanych przez ADC
  72. Dim V_wej As String * 6 , V_aku As String * 6 , V_wyj As String * 6
  73. Dim Amper As String * 6 , Watt As String * 6
  74. Dim Watt_volt As Single , Watt_amper As Single , Watt_oblicz As Single
  75. Dim Napiecie_aku As Single , Napiecie_wej As Single
  76. Dim Cs As Single , Akumulator As Single
  77.  
  78. '---pojemnosc akumulatora
  79. Dim Pojemnosc_aku As Byte , Pojemnosc As Single , Aku_min_max As Single
  80. Dim Ladowanie_aku As Byte
  81. Dim Aku_poziom As Byte
  82.  
  83. '---status sieci 230V
  84. Dim Siec As Byte
  85.  
  86. '---DS18B20
  87. Dim Odczyt_ds(2) As Byte , T As Integer , T1 As Single , Temp As String * 5
  88.  
  89. '---UART
  90. Dim Znak As Byte , Ile_elementow As Byte
  91. Dim Komenda_uart As String * 30 , Getcommands(10) As String * 30
  92.  
  93. Dim Uart_opoznienie_wylaczenia As String * 3 , Uart_opoznienie_wlaczenia As String * 3
  94. Dim Uart_zmiana_ekranu As String * 3 , Uart_led_lcd As String * 1
  95. Dim Uart_naladowany As String * 3 , Uart_ladowanie As String * 3 , Uart_rozladowany As String * 3
  96.  
  97. '---miganie ikonami
  98. Dim Mig As Bit , Migaj As Byte , Ikona_usb As Byte
  99.  
  100. '---konfiguracja 1-wire
  101. Config 1wire = Portd.3
  102. 1wreset
  103. 1wwrite &HCC
  104. 1wwrite &H44
  105.  
  106. '---konfiguracja i2c
  107. $lib "i2c_twi.lbx"
  108. Config Scl = Portc.5
  109. Config Sda = Portc.4
  110. Config Twi = 400000
  111. I2cinit
  112.  
  113. '---konfiguracja LCD
  114. $lib "bl_Lcd_i2c.lib"
  115.  
  116. Config Lcd = 16x2
  117.  
  118. Const Pcf_d4 = 4
  119. Const Pcf_d5 = 5
  120. Const Pcf_d6 = 6
  121. Const Pcf_d7 = 7
  122. Const Pcf_rs = 0
  123. Const Pcf_rw = 1
  124. Const Pcf_e1 = 2
  125.  
  126. Dim _lcd_e As Byte
  127. Dim Backlight As Byte
  128.  
  129. Backlight_on Alias &H08
  130. Backlight_off Alias &H00
  131. Backlight = Backlight_on
  132. _lcd_e = 128
  133.  
  134. Const Pcf8574_lcd = &H4E
  135.  
  136. Waitms 100 : Cls
  137.  
  138. '---powitanie UART
  139. Sub Powitanie_uart
  140.  
  141.   Print
  142.   Print "=================================================="
  143.   Print "          ***   Pi UPS by @pimowo   ***"
  144.   Print
  145.   Print
  146.   Print " <P> Pomoc"
  147.   Print " <I> Informacje"
  148.   Print "--------------------------------------------------"
  149.  
  150. End Sub
  151.  
  152. '---powitanie LCD
  153. Sub Powitanie_lcd
  154.  
  155.   Locate 1 , 6 : Lcd "Pi UPS"
  156.   Locate 2 , 4 : Lcd "by @pimowo"
  157.  
  158. '---odczekaj i wyczysc ekran
  159.   Wait 4 : Cls
  160.  
  161. End Sub
  162.  
  163. '---deklaracja znakow
  164. Deflcdchar 0 , 14 , 31 , 17 , 17 , 19 , 23 , 31 , 31        'akumulator
  165. Deflcdchar 1 , 32 , 14 , 17 , 31 , 16 , 14 , 4 , 6          
  166. Deflcdchar 2 , 32 , 14 , 1 , 15 , 17 , 15 , 4 , 6          
  167. Deflcdchar 3 , 2 , 4 , 14 , 16 , 14 , 1 , 30 , 32          
  168. Deflcdchar 4 , 4 , 32 , 31 , 2 , 4 , 8 , 31 , 32            
  169. Deflcdchar 5 , 32 , 10 , 10 , 31 , 14 , 4 , 4 , 3           'wtyczka
  170. Deflcdchar 6 , 27 , 31 , 4 , 14 , 21 , 27 , 21 , 14         'malina
  171. Deflcdchar 7 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            'stopien
  172.  
  173. '---odczyt czujnika temperatury
  174. Sub Temperatura
  175.  
  176.   If Err = 0 Then
  177.  
  178.     1wreset
  179.     1wwrite &HCC
  180.     1wwrite &HBE
  181.  
  182.     Odczyt_ds(1) = 1wread(2)
  183.     T = Odczyt_ds(2)
  184.     Shift T , Left , 8
  185.     T = T + Odczyt_ds(1)
  186.     T1 = T * 0.0625
  187.  
  188.     Temp = Fusing(t1 , "##.##")
  189.  
  190.   Else
  191.  
  192.     Temp = "0.0"
  193.  
  194.   End If
  195.  
  196. '---tu DS szykuje nowy odczyt
  197.   1wreset
  198.   1wwrite &HCC
  199.   1wwrite &H44
  200.  
  201. End Sub
  202.  
  203. Sub Pomiary(byval Channel As Byte)
  204.  
  205.   Local Pomiar As Word : Pomiar = 0
  206.  
  207.     For Krok = 1 To Ilosc_probek
  208.  
  209.       Pomiar = Pomiar + Getadc(channel)
  210.  
  211.     Next
  212.  
  213.     Pomiar_wejscia = Pomiar / Ilosc_probek
  214.  
  215.     Select Case Channel
  216.  
  217. '---pomiar pradu na wyjsciu UPS
  218.       Case 0
  219.  
  220.         Odczyt = Pomiar_wejscia * Korekta_prad
  221.  
  222.           If Odczyt < 0.005 Then Odczyt = 0
  223.  
  224.         Amper = Fusing(odczyt , "#.###")
  225.         Watt_amper = Odczyt
  226.  
  227. '---napiecie na wejsciu UPS
  228.       Case 1
  229.  
  230.         Odczyt = Pomiar_wejscia * Korekta_napiecie
  231.  
  232.           If Odczyt < 0.5 Then Odczyt = 0
  233.  
  234.         V_wej = Fusing(odczyt , "#.###")
  235.         Napiecie_wej = Odczyt
  236.  
  237.           If Napiecie_wej >= 1 Then
  238.  
  239. '---wszystko OK
  240.             Siec = 0
  241. '---wlacz podswietlenie LCD
  242.             Backlight = Backlight_on
  243.  
  244.           Else
  245.  
  246. '---brak zasialania sieciowego wiec alarm(1)
  247.             Siec = 1
  248.  
  249. '---jezeli wlaczony automat sterowania LED LCD to steruj podswietleniem
  250.               If Led_lcd = 1 Then
  251.  
  252. '---wylacz podswietlenie LCD
  253.                 Backlight = Backlight_off
  254.  
  255.               Else
  256.  
  257. '---wlacz podswietlenie LCD
  258.                 Backlight = Backlight_on
  259.  
  260.               End If
  261.  
  262.           End If
  263.  
  264. '---napiecie akumulatora
  265.       Case 2
  266.  
  267.         Odczyt = Pomiar_wejscia * Korekta_napiecie
  268.         V_aku = Fusing(odczyt , "#.###")
  269.         Napiecie_aku = Odczyt
  270.  
  271. '---napiecie na wyjsciu UPS
  272.       Case 3
  273.  
  274.         Odczyt = Pomiar_wejscia * Korekta_napiecie
  275.  
  276.           If Odczyt < 0.005 Then Odczyt = 0
  277.  
  278.         V_wyj = Fusing(odczyt , "#.###")
  279.         Watt_volt = Odczyt
  280.  
  281.     End Select
  282.  
  283. End Sub
  284.  
  285. '---procentowa pojemnosc akumulatora
  286. Sub Bateria
  287.  
  288.   Pojemnosc = Napiecie_aku
  289.   Pojemnosc = Pojemnosc - Pusty_akumulator
  290.   Aku_min_max = Pelny_akumulator - Pusty_akumulator
  291.   Pojemnosc = Pojemnosc / Aku_min_max
  292.   Pojemnosc = 100 * Pojemnosc
  293.   Pojemnosc_aku = Pojemnosc
  294.  
  295. End Sub
  296.  
  297. '---moc pobierana z UPS
  298. Sub Moc
  299.  
  300.   Watt_oblicz = Watt_volt * Watt_amper
  301.   Watt = Fusing(watt_oblicz , "#.###")
  302.  
  303. End Sub
  304.  
  305. '---USTAWIENIA POCZATKOWE
  306. '---odczytywanie z eeprom
  307. Opoznienie_wlaczenia = Opoznienie_wlaczenia_ee
  308. Opoznienie_wylaczenia = Opoznienie_wylaczenia_ee
  309. Ladowanie = Ladowanie_ee
  310. Naladowany = Naladowany_ee
  311. Rozladowany = Rozladowany_ee
  312. Zmiana_ekranu = Zmiana_ekranu_ee
  313. Led_lcd = Led_lcd_ee
  314.  
  315. Poczatkowy Alias 0
  316. Czekaj_i_wlacz Alias 2
  317. Wlaczone Alias 4
  318. Czekaj_i_wylacz Alias 10
  319. Wylaczone Alias 15
  320. Rozladowane Alias 20
  321.  
  322. Lcd_ups = 1
  323.  
  324. '---wlaczenie globalnych przerwan
  325. Enable Interrupts
  326. Enable Serial
  327.  
  328. Call Powitanie_uart
  329. Call Powitanie_lcd
  330.  
  331. '---------------
  332. '---PETLA GLOWNA
  333. Do
  334.  
  335.   If 10ms = 1 Then
  336.     10ms = 0
  337.  
  338. '---tryb regulacji ADC
  339.     If Lcd_ups = 0 Then
  340.  
  341.       Incr 100ms
  342.  
  343.       If 100ms = 10 Then
  344.         100ms = 0
  345.  
  346. '---zrob pomiary
  347.         Call Pomiary(0)
  348.         Call Pomiary(1)
  349.         Call Pomiary(2)
  350.         Call Pomiary(3)
  351.  
  352. '---wyswietl pomiary na LCD
  353.         Locate 1 , 1 : Lcd "A:" ; V_wej
  354.         Locate 1 , 10 : Lcd "B:" ; Amper
  355.         Locate 2 , 1 : Lcd "C:" ; V_aku
  356.         Locate 2 , 10 : Lcd "D:" ; V_wyj
  357.  
  358.         Print
  359.         Print " || V wej. pot.A: " ; V_wej ; " | A wyj. pot.B: " ; Amper ; " | V aku. pot.C: " ; V_aku ; " | V wyj. pot.D: " ; V_wyj ; " ||"
  360.  
  361.       End If
  362.  
  363.     End If
  364.  
  365. '---jezeli jest podlaczony kabelek konwertera UART
  366.     If Lcd_ups = 1 Then
  367.  
  368.       If Usb = 0 Then
  369.  
  370.         Locate 2 , 12 : Lcd "USB"
  371.  
  372.       Else
  373.  
  374.         Locate 2 , 12 : Lcd "   "
  375.  
  376.       End If
  377.  
  378.     End If
  379.  
  380. '---odlicz sekunde
  381.     If 1s < 100 Then                                        'x10ms = 1s
  382.  
  383.       Incr 1s
  384.  
  385.     Else
  386.  
  387.       1s = 0
  388.  
  389. '---wykonaj pomiary
  390.       If Lcd_ups = 1 Then
  391.  
  392.         Call Pomiary(0)
  393.         Call Pomiary(1)
  394.         Call Pomiary(2)
  395.         Call Pomiary(3)
  396.         Call Moc
  397.         Call Temperatura
  398.         Call Bateria
  399.  
  400.         Gosub Miganie
  401.  
  402.       End If
  403.  
  404. '---opoznienie wlaczenia/wylaczenia wyjscia UPS'a
  405.       If Odczekaj > 0 Then
  406.  
  407.         Decr Odczekaj
  408.  
  409.         If Odczekaj = 0 Then
  410.  
  411.           Select Case Stan_urzadzenia
  412.  
  413.             Case Czekaj_i_wlacz
  414.  
  415.               Wyjscie = 1
  416.               Stan_urzadzenia = Wlaczone
  417.  
  418.             Case Czekaj_i_wylacz
  419.  
  420.               Wyjscie = 0
  421.               Stan_urzadzenia = Wylaczone
  422.  
  423.           End Select
  424.  
  425.         End If
  426.  
  427.       End If
  428.  
  429.       Select Case Stan_urzadzenia
  430.  
  431.         Case Poczatkowy
  432.  
  433.           If Napiecie_wej >= 1 Then
  434.  
  435.             Odczekaj = Opoznienie_wlaczenia
  436.             Stan_urzadzenia = Czekaj_i_wlacz
  437.  
  438.           End If
  439.  
  440.         Case Wlaczone
  441.  
  442.           Select Case Napiecie_aku
  443.  
  444.             Case Is <= Rozladowany
  445.  
  446.               Wyjscie = 1
  447.               Ladowarka = 1
  448.               Stan_urzadzenia = Rozladowane
  449.               Aku_poziom = 1                                'stan krytyczny akumulatora wiec alarm(1)
  450.  
  451.             Case Is <= Ladowanie
  452.  
  453.               Ladowarka = 1
  454.               Aku_poziom = 0
  455.  
  456.             Case Is >= Naladowany
  457.  
  458.               Ladowarka = 0
  459.               Aku_poziom = 0
  460.  
  461.           End Select
  462.  
  463. '---jezeli nie ma zasilania sieciowego to wylacz ladowarke akumulatora
  464.           If Siec = 1 Then Ladowarka = 0
  465.  
  466. '---jezeli podlaczone urzadzenie zostanie odlaczone (zamkniecie systemu) to odczekaj 1m i wylacz wyjscie
  467. '          If Usb = 1 Then
  468.  
  469. '            Odczekaj = Opoznienie_wylaczenia
  470. '            Stan_urzadzenia = Czekaj_i_wylacz
  471.  
  472. '          End If
  473.  
  474. '        Case Wylaczone
  475.  
  476. '          If Siec = 0 Then Stan_urzadzenia = Poczatkowy
  477.  
  478.       End Select
  479.  
  480. '---wyswietlanie wszystkich danych UPS na LCD
  481.       If Lcd_ups = 1 Then
  482.  
  483.         Incr Sekundy
  484.  
  485. '---przewijanie ekranow LCD
  486.         If Sekundy >= Zmiana_ekranu Then
  487.           Sekundy = 0
  488.  
  489.           Incr Ekran
  490.  
  491.           If Ekran > 7 Then Ekran = 1
  492.  
  493.             Locate 1 , 1 : Lcd Space(16) : Locate 1 , 1
  494.  
  495.               Select Case Ekran
  496.  
  497.                 Case 1 : Lcd "Napi" ; Chr(1) ; "cie wej" ; Chr(3) ; "cie"
  498.                 Case 2 : Lcd "Napi" ; Chr(1) ; "cie baterii"
  499.                 Case 3 : Lcd "Napi" ; Chr(1) ; "cie wyj" ; Chr(3) ; "cie"
  500.                 Case 4 : Lcd "Nat" ; Chr(1) ; Chr(4) ; "enie pr" ; Chr(2) ; "du"
  501.                 Case 5 : Lcd "Moc pobierana"
  502.                 Case 6 : Lcd "Temp. baterii"
  503.                 Case 7 : Lcd "Bateria"
  504.  
  505.               End Select
  506.  
  507.             Locate 2 , 1 : Lcd Space(14) : Locate 2 , 1
  508.  
  509.               Select Case Ekran
  510.  
  511.                 Case 1 : Lcd Chr(5) ; " " ; V_wej ; " V"
  512.                 Case 2 : Lcd Chr(0) ; " " ; V_aku ; " V"
  513.                 Case 3 : Lcd Chr(6) ; " " ; V_wyj ; " V"
  514.                 Case 4 : Lcd Chr(6) ; " " ; Amper ; " A"
  515.                 Case 5 : Lcd Chr(6) ; " " ; Watt ; " W"
  516.                 Case 6 : Lcd Chr(0) ; " " ; Temp ; Chr(7) ; "C"
  517.                 Case 7 : Lcd Chr(0) ; " " ; Pojemnosc_aku ; " %"
  518.  
  519.               End Select
  520.  
  521.         End If
  522.  
  523.       End If
  524.  
  525. '---koniec 1s
  526.     End If
  527.  
  528. '---koniec 10ms
  529.   End If
  530.  
  531. '---obsluga UART
  532.   If Ischarwaiting() > 0 Then
  533.  
  534.     Znak = Waitkey()                                        ' pobierz znak z bufora
  535.  
  536.     If Znak = 13 Then                                       ' jesli ENTER to skocz do uart
  537.  
  538.       Gosub Uart
  539.  
  540.       Komenda_uart = ""
  541.  
  542.     Else
  543.  
  544.       Komenda_uart = Komenda_uart + Chr(znak)               ' kluczowe budowanie bufora
  545.       Print Chr(znak);                                      ' to jest echo zeby bylo widac co przychodzi
  546.  
  547.     End If
  548.  
  549.   End If
  550.  
  551. Loop
  552. End
  553.  
  554.  
  555. '---przerwanie od TIMERA
  556. Timer0_isr:
  557.  
  558.   $asm
  559.   !PUSH R16
  560.   !PUSH R24
  561.   !PUSH R26
  562.   !PUSH R27
  563.   !in R24, sreg
  564.   !PUSH  R24
  565.   $end Asm
  566.  
  567.     10ms = 1
  568.  
  569. '---Tuned with NoSave Tool
  570.   $asm
  571.   !POP  R24
  572.   !out sreg, r24
  573.   !POP R27
  574.   !POP R26
  575.   !POP R24
  576.   !POP R16
  577.   $end Asm
  578.  
  579. Return
  580.  
  581. '---miganie ikonami
  582. Miganie:
  583.  
  584.   Mig = Not Mig
  585.  
  586.   Locate 2 , 16
  587.  
  588. '---jezeli trwa ladowanie akumulatora mrugaj naprzemiennie ikonami kabelka i baterii
  589.     If Ladowarka = 1 Then
  590.  
  591.       If Mig = 1 Then
  592.  
  593.         Lcd Chr(5)
  594.  
  595.       Else
  596.  
  597.         Lcd Chr(0)
  598.  
  599.       End If
  600.  
  601. '---jezeli akumulator nie jest ladowany to wyswietl ikone zrodla napiecia
  602.     Else
  603.  
  604. '---jezeli jest zasilanie sieciowe pokaz ikone kabelka
  605.       If Siec = 0 Then
  606.  
  607.         Lcd Chr(5)
  608.  
  609. '---jezeli brak zasilania sieciowego pokaz ikone baterii
  610.       Else
  611.  
  612.         Lcd Chr(0)
  613.  
  614.       End If
  615.  
  616.     End If
  617.  
  618. Return
  619.  
  620. Uart:
  621.  
  622.   Ile_elementow = Split(komenda_uart , Getcommands(1) , " ")
  623.  
  624.     Select Case Getcommands(1)
  625.  
  626. '---jezeli odebrany znak to "F" (Fabryka) przywroc wartosci fabryczne i zresetuj AVR
  627.       Case "F"
  628.  
  629. '---wartosci domyslne UPS
  630.         Opoznienie_wlaczenia = 60
  631.         Opoznienie_wlaczenia_ee = Opoznienie_wlaczenia
  632.         Opoznienie_wylaczenia = 60
  633.         Opoznienie_wylaczenia_ee = Opoznienie_wylaczenia
  634.         Ladowanie = 3.8
  635.         Ladowanie_ee = Ladowanie
  636.         Naladowany = 4.0
  637.         Naladowany_ee = Naladowany
  638.         Rozladowany = 3.3
  639.         Rozladowany_ee = Rozladowany
  640.         Zmiana_ekranu = 2
  641.         Zmiana_ekranu_ee = Zmiana_ekranu
  642.         Led_lcd = 1
  643.         Led_lcd_ee = Led_lcd
  644.  
  645.         Print
  646.         Print "=================================================="
  647.         Print "                ***   UWAGA!   ***"
  648.         Print
  649.         Print
  650.         Print " UPS w trybie domyslnym"
  651.         Print "--------------------------------------------------"
  652.  
  653. '---jezeli odebrany znak to "U" (Ustawienia) konfiguracja UPS
  654.       Case "U"
  655.  
  656.         Uart_opoznienie_wlaczenia = Getcommands(2)
  657.         Opoznienie_wlaczenia = Val(uart_opoznienie_wlaczenia)
  658.         Opoznienie_wlaczenia_ee = Opoznienie_wlaczenia
  659.  
  660.         Uart_opoznienie_wylaczenia = Getcommands(3)
  661.         Opoznienie_wylaczenia = Val(uart_opoznienie_wylaczenia)
  662.         Opoznienie_wylaczenia_ee = Opoznienie_wylaczenia
  663.  
  664.         Uart_ladowanie = Getcommands(4)
  665.         Ladowanie = Val(uart_ladowanie)
  666.         Ladowanie_ee = Ladowanie
  667.  
  668.         Uart_naladowany = Getcommands(5)
  669.         Naladowany = Val(uart_naladowany)
  670.         Naladowany_ee = Naladowany
  671.  
  672.         Uart_rozladowany = Getcommands(6)
  673.         Rozladowany = Val(uart_rozladowany)
  674.         Rozladowany_ee = Rozladowany
  675.  
  676.         Uart_zmiana_ekranu = Getcommands(7)
  677.         Zmiana_ekranu = Val(uart_zmiana_ekranu)
  678.  
  679.         Uart_led_lcd = Getcommands(8)
  680.         Led_lcd = Val(led_lcd)
  681.         Led_lcd_ee = Led_lcd
  682.  
  683. '---jezeli odebrany znak to "I" (Informacje) wyswietl dane na temat sprzetu/programu
  684.       Case "I"
  685.  
  686.         Print
  687.         Print "=================================================="
  688.         Print "                 ***   INFO   ***"
  689.         Print
  690.         Print
  691.         Print "          Zasilacz awaryjny Raspberry Pi"
  692.         Print
  693.         Print "                     Projekt:"
  694.         Print "                     @pimowo"
  695.         Print "                   Piotr Mrozek"
  696.         Print "                 pimowo@gmail.com"
  697.         Print
  698.         Print
  699.         Print " PiUPS:"
  700.         Print " Wersja hadware: v2.0"
  701.         Print " Wersja software: v1.0"
  702.         Print "--------------------------------------------------"
  703.  
  704. '---jezeli odebrany znak to "O" (Odczyt) pokaz konfiguracje UPS'a
  705.       Case "O"
  706.  
  707.         Print
  708.         Print "=================================================="
  709.         Print "       ***   Aktualne ustawienia UPS   ***"
  710.         Print
  711.         Print
  712.         Print " Opoznienie wlaczenia:"
  713.         Print " " ; Opoznienie_wlaczenia ; " (sekundy)"
  714.         Print
  715.         Print " Opoznienie wylaczenia:"
  716.         Print " " ; Opoznienie_wylaczenia ; " (sekundy)"
  717.         Print
  718.         Print " Poczatek ladowania akumulatora:"
  719.         Print " " ; Ladowanie ; " V"
  720.         Print
  721.         Print " Koniec ladowania akumulatora:"
  722.         Print " " ; Naladowany ; " V"
  723.         Print
  724.         Print " Rozladowany akumulator:"
  725.         Print " " ; Rozladowany ; " V"
  726.         Print
  727.         Print " Przewijanie ekranow LCD:"
  728.         Print " " ; Zmiana_ekranu ; " (sekundy)"
  729.         Print
  730.         Print " Auto-podswietlenie LCD:"
  731.  
  732.           If Led_lcd = 1 Then Print " TAK" Else Print " NIE"
  733.  
  734.         Print "--------------------------------------------------"
  735.  
  736. '---jezeli odebrany znak to "N" (Normalny) Normalne dzialanie UPS'a
  737.       Case "N"
  738.  
  739.         Cls : Lcd_ups = 1
  740.  
  741. '---jezeli odebrany znak to "T" (Test) regulacja ADC
  742.       Case "T"
  743.  
  744.         Cls : Lcd_ups = 0
  745.  
  746. '---jezeli odebrany znak to "P" (Pomoc) wyswietl wszystkie dostepne komendy
  747.       Case "P"
  748.  
  749.         Print
  750.         Print "=================================================="
  751.         Print "             ***   Pomoc   ***"
  752.         Print
  753.         Print
  754.         Print " D (Dane)"
  755.         Print " Wyswietl wszystkie pomiary"
  756.         Print
  757.         Print " F (Fabryka)"
  758.         Print " Zresetuj UPS do ustawien fabrycznych"
  759.         Print
  760.         Print " I (Informacje)"
  761.         Print " Wyswietl wszystkie pomiary"
  762.         Print
  763.         Print " N (Normalny)"
  764.         Print " Normalny tryb pracy UPS"
  765.         Print
  766.         Print " O (Odczyt)"
  767.         Print " Wyswietl wszystkie ustawienia UPS"
  768.         Print
  769.         Print " P (Pomoc)"
  770.         Print " Wyswietl wszystkie polecenia"
  771.         Print
  772.         Print " R (Reset)"
  773.         Print " Reset AVR"
  774.         Print
  775.         Print " T (Test)"
  776.         Print " Test i regulacja ADC"
  777.         Print
  778.         Print " U (Ustawienia)"
  779.         Print " Ustawienia parametrow UPS"
  780.         Print " <*> dokladny opis ustawien UPS"
  781.         Print "--------------------------------------------------"
  782.  
  783. '---jezeli odebrany znak to "*" szerszy opis ustawien UPS
  784.       Case "*"
  785.  
  786.         Print
  787.         Print "=================================================="
  788.         Print "        ***   Opis konfiguracji UPS   ***"
  789.         Print
  790.         Print
  791.         Print " U (Ustawienia)"
  792.         Print
  793.         Print " Wyjscie UPS:"
  794.         Print " Opoznienie wlaczenia (1-240s)"
  795.         Print " Opoznienie wylaczenia (1-240s)"
  796.         Print
  797.         Print " Akumulator:"
  798.         Print " Koniec ladowania (0.1-9.9V)"
  799.         Print " Poczatek ladowania (0.1-9.9V)"
  800.         Print " Rozladowany (0.1-9.9V)"
  801.         Print
  802.         Print " LCD:"
  803.         Print " Przelaczanie ekranow (1-240s)"
  804.         Print " Auto-podswietlenie (1/0)"
  805.         Print
  806.         Print " Przykladowe (domyslne) ustawienia:"
  807.         Print " U 60 60 3.9 4.0 3.3 2 1"
  808.         Print
  809.         Print " |ustaw|"
  810.         Print " |wlacz wyjscie po 60 sekundach|"
  811.         Print " |wylacz wyjscie po 60 sekundach|"
  812.         Print " |poczatek ladowania akumulatora przy napieciu 3.9V|"
  813.         Print " |koniec laowania akumulatora po osiagnieciu 4.0V|"
  814.         Print " |stan krytyczny akumulatora przy napieciu 3.3V|"
  815.         Print " |przelaczaj ekrany LCD co 2 sekundy|"
  816.         Print " |wygas LCD przy zasilaniu akumulatorowym|"
  817.         Print "--------------------------------------------------"
  818.  
  819. '---jezeli odebrany znak to "R" (Reset) zresetuj AVR
  820.       Case "R"
  821.  
  822.         Disable Interrupts                                  'wylaczenie przerwan
  823.         Start Watchdog                                      'uruchomienie Watchdoga
  824.         Do                                                  'petla nieskonczona
  825.         Loop                                                'w niej czekamy na Reset
  826.  
  827. '---jezeli odebrany znak to "D" (Dane) odeslij dane pomiarow
  828.       Case "D"
  829.  
  830.         Print V_wej ; " " ; V_aku ; " " ; V_wyj ; " " ; Amper ; " " ; Watt ; " " ; Temp ; _
  831.             " " ; Pojemnosc_aku ; " " ; Ladowarka ; " " ; Siec ; " " ; Aku_poziom
  832.  
  833. '---jezeli odebrany znak to zaden z powyzszych...
  834.       Case Else
  835.  
  836.         Print
  837.         Print "=================================================="
  838.         Print "               ***   BLAD!   ***"
  839.         Print
  840.         Print
  841.         Print " Nie rozpoznano polecenia"
  842.         Print " <P> Pomoc"
  843.         Print "--------------------------------------------------"
  844.  
  845. '---czysczenie bufora
  846.         Getcommands(1) = ""
  847.         Getcommands(2) = ""
  848.         Getcommands(3) = ""
  849.         Getcommands(4) = ""
  850.         Getcommands(5) = ""
  851.         Getcommands(6) = ""
  852.         Getcommands(7) = ""
  853.         Getcommands(8) = ""
  854.  
  855.     End Select
  856.  
  857. '---czysczenie bufora
  858.   Getcommands(1) = ""
  859.   Getcommands(2) = ""
  860.   Getcommands(3) = ""
  861.   Getcommands(4) = ""
  862.   Getcommands(5) = ""
  863.   Getcommands(6) = ""
  864.   Getcommands(7) = ""
  865.   Getcommands(8) = ""
  866.  
  867. Return
Krytyka i pomoc przy ogarnięciu kodu do końca mile widziane.

PS
Proszę się za mocno nie śmiać bo to są wypociny niedzielnego amatora elektroniki :D
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Zasilacz awaryjny-UPS

Post autor: niveasoft » 05 gru 2017, 14:57

No i elegancko. U mnie z czasem to tak, że pisze się ciągle i nie ma czasu na swoje projekty :D
Pochwal się gdzie robiłeś płyteczkę bo w Polsce robię w Merkar a może warto spojrzeć gdzie indziej.
Do kodu zajrzę w wolnej chwili.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zasilacz awaryjny-UPS

Post autor: pimowo » 05 gru 2017, 15:09

Płytkę robiłem w Chinach, a dokładnie w PCBway
Jak na razie jest jest jeden babol, biblioteka EAGLE dla MCP1525 jest źle zrobiona i musiałem scalaka do góry nogami przylutować :(

U mnie znów nie dość, że mało czasu to jeszcze mało wiedzy w głowie, a równolegle buduję sobie jeszcze sterownik domowy-tyle razy już go porzucałem, że głowa mała-kiedyś na pewno go ukonczę he he
JanJJW
Posty: 25
Rejestracja: 17 sty 2018, 0:17

Re: Zasilacz awaryjny-UPS

Post autor: JanJJW » 21 sty 2018, 21:10

Jeśli chodzi o uśrednienie pomiaru, to stosuję średnią ruchomą. To znaczy dane zapisuję do tablicy (na ogół o rozmiarze 64). Kolejne pomiary dopisują się do tablicy a sumę po prostu przesuwam o sześć. Średnia jest obliczana po każdym pomiarze.
Z poważaniem JanJJW
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zasilacz awaryjny-UPS

Post autor: pimowo » 22 sty 2018, 8:30

Pomiary prądu i napięcia działają u mnie super. Problem mam z opanowaniem zależności działania całego UPSa :(
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zasilacz awaryjny-UPS

Post autor: pimowo » 06 lut 2018, 14:29

Panowie, co jest z moim kodem nie tak, że nie chce odpowiadać za każdym razem?
Odpytuję układ jest cisza, a za drugim czy trzecim razem jest OK
Pikczu
Posty: 388
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Zasilacz awaryjny-UPS

Post autor: Pikczu » 06 lut 2018, 19:54

Zapodaj cały kod się luknie :)
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zasilacz awaryjny-UPS

Post autor: pimowo » 06 lut 2018, 19:55

Pikczu pisze:Zapodaj cały kod się luknie :)
W pierwszym jest wszystko ;)
Pikczu
Posty: 388
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Zasilacz awaryjny-UPS

Post autor: Pikczu » 06 lut 2018, 20:11

Ok właśnie przeglądnąłem.
A dajesz enter po wysłaniu znaku ? bo jeśli wysyłasz powiedzmy " F spacja U spacja I " automatycznie enter to nie będzie działać poprawnie
Jeśli wyślesz "F" enter to będzie działać ok
"U" enter to będzie działać ok
"I" enter to będzie działać ok
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Zasilacz awaryjny-UPS

Post autor: pimowo » 06 lut 2018, 20:19

Używam tylko jedno polecenie, a nie kilka na raz.
Tak dla przykładu w MINICOM odpytuję moduł "D" (dane) Docelowo chcę to robić co minutę.

Kod: Zaznacz cały

==================================================
               ***   BLAD!   ***


 Nie rozpoznano polecenia
 <P> Pomoc
--------------------------------------------------
4.950 3.940 5.230 0.392 2.050 31.19 81 0 0 0
4.940 3.940 5.230 0.395 2.066 31.19 81 0 0 0
4.940 3.940 5.230 0.414 2.165 31.19 81 0 0 0
4.950 3.940 5.220 0.433 2.260 31.19 81 0 0 0

               ***   BLAD!   ***


 Nie rozpoznano polecenia
 <P> Pomoc
--------------------------------------------------
4.890 3.940 5.200 0.568 2.954 31.19 81 0 0 0
4.950 3.940 5.230 0.394 2.061 31.19 81 0 0 0

==================================================
               ***   BLAD!   ***


 Nie rozpoznano polecenia
 <P> Pomoc
--------------------------------------------------
4.950 3.940 5.220 0.394 2.057 31.19 81 0 0 0

Z powyższego kodu wyrzuciłem tylko:

Kod: Zaznacz cały

Print Chr(znak);                                      ' to jest echo zeby bylo widac co przychodzi
ODPOWIEDZ