├── README.md ├── arduino_ups └── arduino_ups.ino ├── hw_doc ├── Arduino_UPS.fzz ├── Arduino_UPS_bb.png ├── Buzzer.fzz ├── Buzzer_bb.png ├── Voltage_divider.fzz └── Voltage_divider_bb.png └── sw_doc ├── Arduino_UPS_activity_diagram.png ├── Arduino_UPS_activity_diagram.xml ├── Arduino_UPS_activity_diagram_buzzer.png ├── Arduino_UPS_activity_diagram_buzzer.xml └── Arduino_UPS_buttons.png /README.md: -------------------------------------------------------------------------------- 1 | # Arduino UPS 2 | An UPS (Uninterruptible Power Supply) made of my old (broken) UPS and Arduino. 3 | 4 | # Documentation 5 | The documentation consists of hardware and software part. 6 | The hardware documentation consists of used parts and electrical schemes. It resides in "hw_doc" directory. 7 | The software documentation consists of action diagrams. It resides in "sw_doc" directory. 8 | Source code is included as well and can be found in "arduino_ups" directory. 9 | Every aspect of this project is thoroughly explained in this documentation. 10 | 11 | # Hardware documentation 12 | ## Parts 13 | * Old UPS (or a box to put everything in) 14 | * 12V 7Ah battery - `CJ12-7` accumulator has dimensions to fit exactly in the battery compartment 15 | * 12V power brick 16 | * Arduino Uno 17 | * LCD Keypad Shield 18 | * Breadboard (using a smaller one) 19 | * Wires 20 | * Transistor (N MOSFET) 21 | * Resistors: 20k, 10k, 2.2k 22 | * Buzzer 23 | * Power panel connectors 24 | * Polymer fuses: one >=13V >=7A (main power), one >=13V >=1A (buzzer fuse :) ) 25 | 26 | ## Tools 27 | * Drill 28 | * Screwdriver 29 | 30 | ## Schemes 31 | ### Physical scheme 32 | 33 | ![Physical scheme](https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/master/hw_doc/Arduino_UPS_bb.png) 34 | 35 | #### Power circuit 36 | The power from the power brick goes into "Input 12V DC" jack. Then it leads to the polymer fuse. From there it 37 | goes to the bread board and Arduino Uno power jack. The LCD Keypad Shield is directly connected to the Arduino 38 | board. The LCD Keypad Shield is used for user interaction. 39 | 40 | #### Voltage measuring 41 | For voltage measuring I used voltage divider, which uses Ohm's law. R1 resistor is 20k, R2 is 10k 42 | 43 | The calculation and the picture of the scheme for voltage measuring is shown below. 44 | 45 | ##### Calculation 46 | We need to calculate, what the maximum input voltage from the power source can be, before the Arduino blows on fire :) 47 | The closer it is to the nominal voltage of the power brick (in this case 12V), the more accurate voltage readings we will get, 48 | but the less headroom we will have, when the voltage starts fluctuating (which is rather unlikly but possible). 49 | 50 | Vout = ouput voltage (to the Arduino input pin) 51 | Vin = input voltage (from the power source) 52 | R1, R2 = resistance values of R1 and R2 53 | 54 | Vout can be at most 5V beacuse we can provide to the Arduino input pins AT MOST 5V! Otherwise we will fry the Arduino. 55 | 56 | Equations... 57 | 58 | Vout = (Vin * R2) / (R1 + R2) 59 | Vout * (R1 + R2) = Vin * R2 60 | (Vout * (R1 + R2)) / R2 = Vin 61 | 62 | Now we can replace the variables with the values. 63 | Vout = 5V 64 | R1 = 20k = 20000 65 | R2 = 10k = 10000 66 | 67 | (Vout * (R1 + R2)) / R2 = Vin 68 | (5 * (20000 + 10000)) / 10000 = Vin 69 | Vin = 15V => 15V can be the maximum input volate to the voltage divider from the power brick. 70 | 71 | You don't have to do the math by hand. Instead, use [a calculator for voltage divider](http://www.ohmslawcalculator.com/voltage-divider-calculator) to do the job for you. You can customize there everything you need. 72 | 73 | ![Voltage divider scheme](https://github.com/kyberdrb/Arduino_UPS/raw/master/hw_doc/Voltage_divider_bb.png) 74 | 75 | #### Buzzer 76 | A N-channel MOSFET was needed to drive a buzzer (piezo speaker), which was rated for 12V. Pin #3 on Arduino was outputting PWM signal to the MOSFET's gate through the 2.2k resistor. The frequency of the PWM signal was transfered to the speaker, which then produced tone at that frequency. 77 | 78 | ![Buzzer scheme](https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/master/hw_doc/Buzzer_bb.png) 79 | 80 | The physical scheme ([Arduino_UPS.fzz](https://github.com/kyberdrb/Arduino_UPS/raw/master/hw_doc/Arduino_UPS.fzz), [Buzzer.fzz](https://github.com/kyberdrb/Arduino_UPS/raw/master/hw_doc/Buzzer.fzz) and [Voltage_divider.fzz](https://github.com/kyberdrb/Arduino_UPS/raw/master/hw_doc/Voltage_divider.fzz)) has been made with the help of **_Fritzing_**. 81 | 82 | # Software documentation 83 | ## Voltage measuring 84 | 85 | Using the computation mentioned in the hardware documentation, the maximum voltage that we can measure is 15 Volts. However the Arduino analog input pins can handle only 5 Volts which is why we put a voltage divider in between the battery and Arduino. The voltage that the voltage divider ouputs to the Arduino is less than 5V. In the program, the voltage is reversly transformed into the original voltage of the battery. The calculated voltage of the battery is then send to the LCD Keypad Shield to be outputted on the display. 86 | 87 | ## Buzzer 88 | 89 | The buzzer provides an acoustic feedback about the voltage level of the battery. If it's too high or low (according to 90 | measuring and ATX2.2 standard), the buzzer starts beeping (different sounds for too low and too high levels). When everything 91 | is all right, the buzzer is silent. Below we can see the activity diagram (state chart) for the buzzer. The buzzer can exist in three (transition) states: 92 | 93 | |    State |                              Description | Explanation 94 | |---------|---------------------------------|-----------------------------------------------------------| 95 | | State 1 | Not beeping -> Start beeping | Starts beeping 96 | | State 2 | Started beeping -> Keep beeping | Continues beeping certain amount of time 97 | | State 3 | Enough beeping -> Stop beeping | After the beeping time is over, the buzzer is silent for certain amount of time. Then the buzzer can start beeping again. 98 | 99 | Table created with the help of [tablesgenerator.com](http://www.tablesgenerator.com/markdown_tables). 100 | 101 | ![Buzzer diagram](https://github.com/kyberdrb/Arduino_UPS/raw/master/sw_doc/Arduino_UPS_activity_diagram_buzzer.png) 102 | 103 | This activity diagram produces one beep of certain length and then the buzzer becomes silent for a certain amount of time. 104 | 105 | ## User interaction 106 | I was considering to split the user interaction on hardware and software part, but instead I decided to put everything about 107 | it here. 108 | 109 | The user can interact with the UPS using the buttons. The function of each button is explained below. After pressing a button, 110 | a responsible action is taken which is defined in function "execBtnAction". 111 | 112 | The DEBUG buttons are inactive! Their function is to test the voltage limits. When the voltage limits are crossed, the user 113 | gets feedback from the buzzer. 114 | 115 | Button 1 - DEBUG - Voltage up 116 | Button 2 - Mute/Unmute the buzzer 117 | Button 3 - Brightness up 118 | Button 4 - Brightness down 119 | Button 5 - DEBUG - Voltage down 120 | Button 6 - Reset (can't be changed, it's hardwired to Arduino) 121 | 122 | 123 | ![Buttons diagram](https://github.com/kyberdrb/Arduino_UPS/raw/master/sw_doc/Arduino_UPS_buttons.png) 124 | 125 | ## Activity diagram 126 | 127 | The program does exactly what is depicted in the activity diagram below. Most of the variables are declared and initialized 128 | in the "setup" function. The "loop" function takes care of the continuous program run. In addition to that, debugging 129 | printouts to serial 130 | console are distributed 131 | all over the 132 | code to 133 | monitor program's behavior on demand. 134 | 135 | ![Activity diagram](https://github.com/kyberdrb/Arduino_UPS/raw/master/sw_doc/Arduino_UPS_activity_diagram.png) 136 | 137 | The activity diagram has been made with the use of [draw.io](https://www.draw.io/). 138 | 139 | The entire code doesn't contain any "delay" function call, so that the program is very responsive, fast and stable. The 140 | avoidance of using the "delay" function allows to use buttons for user interaction, which would be otherwise problematic and 141 | cumbersome. 142 | 143 | The source code is in the file 144 | [arduino_ups.ino](https://github.com/kyberdrb/Arduino_UPS/blob/master/arduino_ups/arduino_upc.ino) and can be found in 145 | directory "[arduino_upc](https://github.com/kyberdrb/Arduino_UPS/tree/master/arduino_ups)". 146 | 147 | 148 | 149 | # Sources 150 | How to Use a Buzzer (or Piezo Speaker) - Arduino Tutorial 151 | http://www.instructables.com/id/How-to-use-a-Buzzer-Arduino-Tutorial/?ALLSTEPS 152 | 153 | Piezzo Speaker - DBX12 154 | http://www.db.com.hk/dbtronix/site/products_detail.php?pID=152 155 | 156 | IRFZ 24N :: Power MOSFET N-channel TO-220AB 55 V 17 A 157 | https://www.reichelt.de/Transistors-IRFU-IRFZ-/IRFZ-24N/3/index.html?ACTION=3&GROUPID=2894&ARTICLE=41737&OFFSET=16&SID=12VLelR38AAAIAABdkn9cb2bfeae5b6b044ddd7148786155b03ea&LANGUAGE=EN 158 | 159 | IRFZ24NPBF - Documentation for the tranzistor (the closest i could find) 160 | http://cdn-reichelt.de/documents/datenblatt/A100/IRFZ24N_IR.pdf 161 | 162 | IRF740 - Documentation (supplemental documentation to the one mentioned above) 163 | http://www.vishay.com/docs/91054/91054.pdf 164 | 165 | Scheme - Controlling high voltage motor with tranzistor and Arduino 166 | http://bildr.org/2011/03/high-power-control-with-arduino-and-tip120/ 167 | http://bildr.org/blog/wp-content/uploads/2011/03/tip120-motor.png 168 | 169 | Fritzing - The scheme-making tool 170 | http://fritzing.org/learning/ 171 | 172 | Fritzing - LCD Keypad Shield 173 | https://github.com/RafaGS/Fritzing/blob/master/LCD%20Keypad%20Shield.fzpz 174 | 175 | Fritzing - tutorial 176 | https://www.youtube.com/watch?v=M4CvUSkP9hw&t=3s 177 | 178 | Arduino Uno pinout 179 | https://micro-manager.org/wiki/Arduino 180 | 181 | picoPSU-120 datasheet 182 | http://www.mini-box.com/s.nl/it.A/id.417/.f 183 | http://resources.mini-box.com/online/PWR-PICOPSU-120/PWR-PICOPSU-120-manual-engl.pdf 184 | 185 | ATX v2.2 voltage tolerances 186 | https://www.lifewire.com/power-supply-voltage-tolerances-2624583 187 | 188 | Arduino - Blink without delay (huge efficiency improvement) 189 | https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay 190 | 191 | const vs #define 192 | http://forum.arduino.cc/index.php?topic=44023.0 193 | 194 | LCD Keypad Shield demo code 195 | https://www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009) 196 | 197 | LCD Keypad Shield - display brightness control 198 | http://forum.arduino.cc/index.php?topic=97817.0 199 | 200 | Tips and tricks for AVR controllers 201 | http://www.nongnu.org/avr-libc/user-manual/FAQ.html 202 | 203 | Variable types and modifiers explanation 204 | https://stackoverflow.com/questions/3684760/where-are-the-local-global-static-auto-register-extern-const-volatile-var 205 | -------------------------------------------------------------------------------- /arduino_ups/arduino_ups.ino: -------------------------------------------------------------------------------- 1 | /* 2 | Arduino UPS 3 | An Arduino DVM (Digital Volt Meter) based on voltage divider concept 4 | T.K.Hareendran && Andrej Sisila 5 | */ 6 | 7 | #include 8 | 9 | //*********************************************************** 10 | // LCD KEYPAD SETUP - DISPLAY 11 | //*********************************************************** 12 | 13 | // initialize the library with the numbers of the interface pins 14 | const int pin_RS = 8; // arduino pin wired to LCD RS 15 | const int pin_EN = 9; // arduino pin wired to LCD EN 16 | const int pin_d4 = 4; // arduino pin wired to LCD d4 17 | const int pin_d5 = 5; // arduino pin wired to LCD d5 18 | const int pin_d6 = 6; // arduino pin wired to LCD d7 19 | const int pin_d7 = 7; // arduino pin wired to LCD d8 20 | 21 | const int pin_BL = 10; // arduino pin wired to LCD backlight circuit 22 | byte backlightLevel = 1; 23 | 24 | // link the pins to the software library 25 | LiquidCrystal lcd( pin_RS, pin_EN, pin_d4, pin_d5, pin_d6, pin_d7); 26 | 27 | //*********************************************************** 28 | // LCD KEYPAD SETUP - BUTTONS 29 | //*********************************************************** 30 | 31 | boolean isBtnPressed = false; // avoid executing actions by holding the button 32 | 33 | //*********************************************************** 34 | // VOLTAGE MEASURING SETUP 35 | //*********************************************************** 36 | const int voltReadPin = 1; // pin for voltage measuring 37 | float voltOut = 0.0; 38 | float voltIn = 0.0; 39 | float voltInMin = 0.0; // minimum input voltage 40 | float voltInMax = 0.0; // maximum input voltage 41 | float R1 = 20000.0; // resistance of R1 (20K) 42 | float R2 = 10000.0; // resistance of R2 (10K) 43 | int voltInputValue = 0; 44 | 45 | // DEBUG REACTIONS 46 | int offset = 0; 47 | 48 | //*********************************************************** 49 | // AUDIO OUTPUT SETUP 50 | //*********************************************************** 51 | const int buzzerPin = 3; 52 | byte audioEnabled = 1; // used to mute audio with LEFT button 53 | 54 | //*********************************************************** 55 | // PROGRAM ACCELERATORS SETUP ;) (to avoid "delay" function) 56 | //*********************************************************** 57 | 58 | // it doesn't matter, of which type the currentMillis variable is, 59 | // beacuse I will check it for overflow anyway in the function 60 | // currentMillisOverflowProtection. I like it unsigned for better 61 | // debugging output. 62 | 63 | //unsigned short currentMillis = 0; // for overflow testing 64 | unsigned long currentMillis = 0; 65 | 66 | unsigned long previousBuzzerMillis = 0; 67 | int buzzerState = 0; 68 | 69 | int lcdRefreshInterval = 1000; // interval at which to refresh the lcd display 70 | unsigned long previousLCDMillis = 0; 71 | 72 | int debugInterval = 500; 73 | unsigned long previousDebugMillis = 0; 74 | 75 | 76 | void setup() { 77 | pinMode(voltReadPin, INPUT); 78 | pinMode(buzzerPin, OUTPUT); 79 | Serial.begin(9600); 80 | 81 | lcd.begin(16, 2); 82 | lcd.print("DC VOLTMETER"); 83 | 84 | // set backlight intensity 85 | setLCDbacklight(backlightLevel); 86 | 87 | // inicializuj minimalne vstupne napatie 88 | voltInMin = analogRead(voltReadPin); 89 | } 90 | 91 | void loop() { 92 | // update runtime 93 | currentMillis = millis(); 94 | 95 | // execute button action after pressing 96 | execBtnAction(); 97 | 98 | // read the value at analog input 99 | voltInputValue = analogRead(voltReadPin); 100 | voltOut = (voltInputValue * 5.0) / 1024.0; // see text 101 | voltIn = voltOut / (R2 / (R1 + R2)); 102 | 103 | // DEBUG REACTIONS -> TESTING USER FEEDBACK (AUDIO & DISPLAY) 104 | voltIn = voltIn + offset; // offset is there for testing purposes and is responsible for triggering 105 | // offset is changed with buttons SELECT and RIGHT 106 | 107 | if (voltIn < 0.0) 108 | { 109 | voltIn = 0.0; //statement to quash undesired reading ! 110 | } 111 | 112 | // zmen hranicne hodnoty 113 | if (voltIn > voltInMax) voltInMax = voltIn; 114 | if (voltIn < voltInMin) voltInMin = voltIn; 115 | 116 | // check ATX2.2 12V rail tolerance +-5%: 11.4 - 12.6V 117 | if (voltIn > 12.9) { // the picoPSU 120 limit of overvoltage protection is 13-13.5V - setting it to 12.9 118 | beepBuzzer(buzzerPin, 1400, 1000, 1000); 119 | } else if (voltIn < 11.4) { 120 | beepBuzzer(buzzerPin, 700, 500, 1000); 121 | } else { 122 | // do nothing :) everything is OK ;) 123 | } 124 | 125 | currentMillisOverflowProtection(currentMillis, previousLCDMillis); 126 | if (currentMillis - previousLCDMillis >= lcdRefreshInterval) { 127 | previousLCDMillis = currentMillis; 128 | lcd.setCursor(0, 1); 129 | lcd.print("INPUT V= "); 130 | lcd.print(voltIn); 131 | } 132 | 133 | //DEBUG 134 | currentMillisOverflowProtection(currentMillis, previousDebugMillis); 135 | if (currentMillis - previousDebugMillis >= debugInterval) { 136 | 137 | previousDebugMillis = currentMillis; 138 | Serial.print(voltIn); 139 | // Serial.print('\t'); 140 | // Serial.print(voltInMax); 141 | // Serial.print('\t'); 142 | // Serial.print(voltInMin); 143 | Serial.println(' '); 144 | Serial.println(audioEnabled); 145 | Serial.println(""); 146 | // Serial.println(buzzerInterval); 147 | // Serial.println(buzzerState); 148 | // Serial.println(currentMillis); 149 | } 150 | } 151 | 152 | /* 153 | "beepBuzzer" function sends frequency paFreq to pin paPin. 154 | The bsound will sound paDuration milliseconds. 155 | Afterwards the buzzer stops beeping for paPause milliseconds. 156 | */ 157 | void beepBuzzer(int paPin, int paFreq, int paDuration, int paPause) { 158 | 159 | 160 | // Buzzer State 0: Not Beeping -> Beeping 161 | if (buzzerState == 0) { 162 | if (audioEnabled == 1) { 163 | tone(paPin, paFreq); 164 | } 165 | buzzerState = 1; 166 | } 167 | 168 | // Buzzer State 1: Keep beeping, until you run out of time (paDuration). 169 | // Beeping -> Not Beeping 170 | if (buzzerState == 1) { 171 | currentMillisOverflowProtection(currentMillis, previousBuzzerMillis); 172 | if (currentMillis - previousBuzzerMillis >= paDuration) { 173 | previousBuzzerMillis = currentMillis; 174 | noTone(paPin); 175 | buzzerState = 2; 176 | } 177 | } 178 | 179 | // Buzzer State 2: Don't beep for paPause amount of time. 180 | // After that you can beep. 181 | if (buzzerState == 2) { 182 | currentMillisOverflowProtection(currentMillis, previousBuzzerMillis); 183 | if (currentMillis - previousBuzzerMillis >= paPause) { 184 | previousBuzzerMillis = currentMillis; 185 | buzzerState = 0; 186 | } 187 | } 188 | 189 | } 190 | 191 | void currentMillisOverflowProtection(int currentMillis, int previousMillis) { 192 | if (currentMillis < previousMillis) { 193 | previousMillis = 0; 194 | } 195 | } 196 | 197 | void execBtnAction() { 198 | int btnPressed = analogRead(0); 199 | 200 | //currentMillisOverflowProtection(currentMillis, previousDebugMillis); 201 | //if (currentMillis - previousDebugMillis >= debugInterval) { 202 | // DEBUG 203 | // Serial.println(btnPressed); 204 | // Serial.println(isBtnPressed); 205 | // Serial.println(backlightLevel); 206 | // Serial.println(audioEnabled); 207 | // Serial.println(' '); 208 | //} 209 | 210 | // No button pressed 211 | if (btnPressed >= 850 && btnPressed < 1024) { 212 | isBtnPressed = false; 213 | } 214 | 215 | if (!isBtnPressed) { 216 | // Left button 217 | if (btnPressed >= 450 && btnPressed < 650) { 218 | Serial.println("audio on/off"); 219 | if (audioEnabled == 1) { 220 | audioEnabled = 0; 221 | noTone(buzzerPin); // stop beeping immediately 222 | } else { 223 | audioEnabled = 1; 224 | } 225 | isBtnPressed = true; 226 | } 227 | 228 | // Up button 229 | if (btnPressed >= 50 && btnPressed < 250) { 230 | Serial.println("brightness up"); 231 | backlightLevel = (backlightLevel + 1) % 4; 232 | setLCDbacklight(backlightLevel); 233 | isBtnPressed = true; 234 | } 235 | 236 | // Down button 237 | if (btnPressed >= 250 && btnPressed < 450) { 238 | Serial.println("brightness down"); 239 | backlightLevel = (backlightLevel - 1) % 4; 240 | setLCDbacklight(backlightLevel); 241 | isBtnPressed = true; 242 | } 243 | 244 | 245 | 246 | //************************************************ 247 | // DEBUG REACTIONS 248 | // Right button 249 | if (btnPressed >= 0 && btnPressed < 50) { 250 | // Serial.println("offset up"); 251 | // offset = offset + 1; // add 1 Volt to input voltage 252 | isBtnPressed = true; 253 | } 254 | 255 | // Select button 256 | if (btnPressed >= 650 && btnPressed < 850) { 257 | // Serial.println("offset up"); 258 | // offset = offset - 1; // substract 1 Volt from input voltage 259 | isBtnPressed = true; 260 | } 261 | //************************************************ 262 | 263 | } 264 | 265 | } 266 | 267 | void setLCDbacklight(const byte paLevel) { 268 | int backlightLevelReal = 0; 269 | 270 | if (backlightLevel == 0) backlightLevelReal = 0; 271 | else if (backlightLevel == 1) backlightLevelReal = 50; 272 | else if (backlightLevel == 2) backlightLevelReal = 127; 273 | else backlightLevelReal = 255; 274 | 275 | analogWrite(pin_BL, backlightLevelReal); 276 | } 277 | 278 | -------------------------------------------------------------------------------- /hw_doc/Arduino_UPS.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/hw_doc/Arduino_UPS.fzz -------------------------------------------------------------------------------- /hw_doc/Arduino_UPS_bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/hw_doc/Arduino_UPS_bb.png -------------------------------------------------------------------------------- /hw_doc/Buzzer.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/hw_doc/Buzzer.fzz -------------------------------------------------------------------------------- /hw_doc/Buzzer_bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/hw_doc/Buzzer_bb.png -------------------------------------------------------------------------------- /hw_doc/Voltage_divider.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/hw_doc/Voltage_divider.fzz -------------------------------------------------------------------------------- /hw_doc/Voltage_divider_bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/hw_doc/Voltage_divider_bb.png -------------------------------------------------------------------------------- /sw_doc/Arduino_UPS_activity_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/sw_doc/Arduino_UPS_activity_diagram.png -------------------------------------------------------------------------------- /sw_doc/Arduino_UPS_activity_diagram.xml: -------------------------------------------------------------------------------- 1 | 3Zlbc5s8EIZ/DTPtRTocDLYvaztNO5N2Ok1nvi+XMqxBrUCMED7k11cCcbKI6xbsZpKLDLyIFdp9dllhw1nG+zuG0ugzDYAYthnsDWdl2PbM88R/KRxKYeJNSiFkOCglqxEe8BMo0VRqjgPIOgM5pYTjtCv6NEnA5x0NMUZ33WEbSrqzpigETXjwEdHV/3DAI7Us12z0j4DDqJrZMtWVNfJ/hozmiZrPsJ1N8VdejlFlS43PIhTQXUtybg1nySjl5VG8XwKRrq3cVt734Zmr9XMzSPg5N9jlDVtEcrV0Qmmqno0fKn8UKwJ5j2U4i12EOTykyJdXdwIAoUU8JuoyIjhMxDGBjXiGxRYYx8K175Uc4yCQdheZsICT8L4Ytpo1ynfxBM7KbIQF5ZzG0rwrVX2Rat1yKti3JLXoO6AxcHYQQ9TVufK/4tOu4rdroj2ptKgVac9TIlKEhbXpxsviQDn6mShNNK9rHodAAKlOKeMRDWmCyG2jLpqYmF3//wDODyqnUM6pkBoL97RwrlW7UU70LDxKymjOfDXKUemIWAjVKKff1wwI4njbNT/EcY7mt2+AgiLtOIdizq2oEjK5BxE8AmC20yXM6SHMsvsIGwGwOm6j8AR7zP+X8jtXnT1ehTSrDzXvSqhZOmsrnKUEHfpxM2ki/t0vV2OQp2HW46vzyZtdkTzLfQ3kTXTwrlXi9FfD7R78nEvE1rl4DUrMkM+xPHhhNa7uaq5CmqmtfwhpiZi+hZo8fVTDLsvaXGdtMpC14tb3jBW1qhqQUpzwTPNwbf8sp881OjPg+cB+cYSad9TO9VS8/m5ujHftqL1bVfGsVr0rkTyXwppkq8NxYeMv38Oejqg9vSyjyvJXKTRhroOo4uxaR7ub34yfTs2j0JZP8Lfp0NOQfqEaDgJr3o0ygww/oXUxQAKg1i1GuwvDXbX2UL4IDLBTuyiC1kAW9bZzSQllxbzVxvNEgqnts3oSo67fbSBKvp/NvBtJVtvHN5YqEn+GghY7Z94168y6FuhmI2rPwHpmv4p2pTdBX+5LxPa0rHmE7LWljfvbtOnmjTdK1txUJUlZrZJx1Kyx9AAatkd4+cFG9KVeKI8/bSSTEfRvmDwUyz4gWWdp4evyfjF120QlB3h7LLWH4UxuwHLpByonXcuQIoYlVSftCrlj+riNiWi8zrPzP3nV3HW+ZLmnYPqDjd3R22zi9bTbs542p/46OajPmb2GUtm3tbt0LzOkVOrbwa+MbnEgkyrPBGq2uQEI5GdncfgmE+uSWbAGSAV+Tf7lT0/A3uqA/+NvE95Vv4rNr0Nws5fUO/AL0z3V6b5wH9D/GtI2ZM7pRt2aDhtvuyM39lMt7+6oUf68I/1L68xSGffC8mo6uVxeidPm96nSt81vgM7tLw== -------------------------------------------------------------------------------- /sw_doc/Arduino_UPS_activity_diagram_buzzer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/sw_doc/Arduino_UPS_activity_diagram_buzzer.png -------------------------------------------------------------------------------- /sw_doc/Arduino_UPS_activity_diagram_buzzer.xml: -------------------------------------------------------------------------------- 1 | 3VdLj9owEP4tPeS4KMSQwhEo3Up9qBKHtkdv4k3cdTyRY1799bWTCXk4y9KWXa3KAcXfjMeeb74ZgkdW2eFW0Tz9DDETXuDHB4+884JgFobm2wLHCpiEkwpIFI8raNwAG/6LIegjuuUxKzqOGkBonnfBCKRkke5gVCnYd93uQXRPzWnCHGATUeGi33isU0xr6jf4B8aTtD557KPljkYPiYKtxPO8gNyXn8qc0ToW+hcpjWHfgsjaIysFoKun7LBiwlJb01bte/+I9XRvxaS+ZENQbdhRscXUv5ijTR6M5Vwm5unGC0Ka5R5ZJibi0iAbTVXHp0xEH2vyyvSZPWBsNuxTrtkmp5G17o1aDJbqTKDZvTDmsGNKs0MLwgRuGWRMq6NxOZzYr7ag2Ga43DeVCwhiaatqIWIUxZKcIjeEmQfkbJi/t072LDZKwiUonUICkop1gy4bfvwuF+zA9XcLj6a4+oGWn0zrI7YJ3WowUBP7E0D+FJsFbFWENyTYUFQlDL2wO+3dzzKumKCa77pd8i/8EUd/pboMO+c1+NHYXrEEA/8FNTh7Fg22FIh6lOZeJ5NdNLar6nPi6jO4tj7LrQul6LHlkAOXumhF/mqBpsrzbpHJtDdbz7vXGmmqWp3f1PiUyEVlnzits5awTdInpze85s4hwQt2ztSh0G0lGS/sC4VZRYIWBY8upKCt6MBVNLlQ0S0apgMs1NifCd+Rar8Kk2mP3Sob3HVG8+OwF8jvBao4cAL9hf7nwz8db5wSGiXqbtEKreCBrUCAMogEaUfiPReiB1HBE2krb4rLDL60uubmNXGBhozHcTlPhxrlkVYYUMuj3WH4686Q0O2OyYAsgis0Ry2JDsGQ/9f8Dr07Phu/Y4ffhYzLXs4ZtT01Go1eDdkKtBkwYP1u5v512Cc98gdG//w65Jtl85+qmjXN/1ay/g0= -------------------------------------------------------------------------------- /sw_doc/Arduino_UPS_buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyberdrb/Arduino_UPS/f1e7718d0b426f18387baa57de2c2b017b8e4c6a/sw_doc/Arduino_UPS_buttons.png --------------------------------------------------------------------------------