//Jednoduchy vybijec Pb akumulatoru, arduino UNO REV.3 //Pro ebastlirna.cz Honza_dy 01/2013 //Pripojeni komponent" //Display I2C 16x2 SCL:A5,SDA:A4, //Pripravek: rele:12,tlacitko:11,mereni:A0 #include //knihovny pro ovladani LCD #include //dtto I2C //Definice promennych int LED = 13; //vystup s defaultne pripojenou LED - pomocna, pouzita pouze pro odladeni programu int rele = 12; //vystup ovladajici rele int tlac = 11; //vstup pro tlacitko float battMin = 11.5; //minimalni napeti baterie pro ukonceni vybijeni byte cmd = 0; //rozhodovaci promena podle ni se vetvi program byte stisk; //pomocna pro tlacitko float ADrd; //"cista" data z AD prevodniku float uBat; // zde se uklada hodnota napeti po prevodu LiquidCrystal lcd(0); // I2C adresa LCD void setup(){ lcd.begin (16,2); //Displej 16x2 //nastaveni pinu pinMode (rele,OUTPUT); pinMode (tlac,INPUT); pinMode (LED,OUTPUT); lcd.clear(); //vymaz displej digitalWrite(13,LOW); //zhasni pomocnou LED } void loop() { lcd.setCursor (0,0); //nastav kurzor displeje na prvni pozici prvniho radku lcd.print(" Ubat = "); // ADrd = analogRead (0); //precti hapeti z AD prevodniku (dostaneme hodnotu 0 - 1023) uBat = ADrd / 68; //prevod na skutecnou hodnotu napeti lcd.print (uBat); //vypis napeti na display lcd.print("V "); // + jednotky //zde se program zacina delit dle hodnoty promene cmd //po resetu cmd = 0 switch (cmd) { case 0: lcd.setCursor(0,1); //nastav kurzor LCD na prvni pozici druheho radku lcd.print("START > tlacitko"); stisk = digitalRead(tlac); //je stisknuto tlacitko? if (stisk == HIGH) { //pokud ano spust vybijeni cmd = 1; //prehod vyhybku programu na case 1 delay(200); //opatreni kvuli bezpecnemu pusteni tlacitka } break; //zpet na hlavni smycku case 1: if (uBat > battMin) { // *jestlize je napeti baterie vyssi nez minimalni mez.. lcd.setCursor (0,1); //nastav displej lcd.print("*** Vybijeni *** "); //vypis hlasku delay(300); //... digitalWrite (rele,HIGH); //...zapni rele... cmd = 2; //presun vyhybku programu na case 2 } else { // *jestlize ne... lcd.setCursor (0,1); //nastav displej lcd.print ("!Ubat moc nizke!"); //vypis hlasku delay (2000); cmd = 0; //vrat vyhybku programu zpět na case 0 } break; //zpět na hlavni smycku case 2: //sem myri program v prubehu vybijeni ADrd = analogRead (0); //cti napeti baterie... uBat = ADrd / 68; //převod... if (uBat < battMin) { // *jestliže je napeti baterie mensi nez minimalni mez... digitalWrite (LED,HIGH); //rozsvit LED (pouzito pro odladeni programu) delay (2000); //cekej 2 vteriny cmd = 3; //prehod vyhybku programu na case 3 } else { //*pokud neni loop(); //vrat se na hlavni smycku } break; case 3: //sem se program nasmeruje v pripade, ze napeti baterie je nizsi nez minimalni mez. delay (5000); //cekej 5s ADrd = analogRead (0); //znovu proved mereni napeti (toto je opatreni pro pripad, ze by doslo ke chvilkovemu ujeti prevodniku) uBat = ADrd / 68; //prevod if (uBat < battMin) { // *pokud je (opravdu) napeti mensi nez minimalni mez digitalWrite (LED,LOW); //zhasni LED (pouze pro odladeni programu) cmd = 4; // prehod vyhybku na case 4 } else{ // *jestlize ne, cmd = 2; //vrat program na case 2 digitalWrite (LED,LOW); // zhasni LED } break; case 4: //ukonceni vybijeni lcd.setCursor (0,1); //nastav displej lcd.print ("*KONEC vybijeni*"); //vypis hlasku digitalWrite (rele, LOW); //vypni rele cmd = 5; //prehod vyhybku na case 5 break; case 5: //vybijeni ukonceno lcd.setBacklight (LOW); //zhasni podsviceni displeje delay (300); //cekej 300ms lcd.setBacklight (HIGH); //rozni podsviceni displeje (displej v tomto stavu blika aby upozornil na dokoncene vybijeni) stisk = digitalRead(tlac); //tlacitko stisknuto? if (stisk == HIGH) { //jestlize ano... cmd = 0; //prehod vyhybku programu na case 0 delay(500); //pauza kvuli osetreni tlacitka } break; } } //konec smycky