15 Temmuz 2016 Cuma

Arduino destekli 9v-12v UPS

Modem, lan switch vb cihazları elektrik kesilmesi halinde çalıştırabilecek 9v -12v arası ayarlanabilen bir ups benzeri cihaz yapayım dedim... Yaptım ve kod ve benzeri şeyleri kaybolmasınlar diye buraya bırakıyorum. Arduino kodunu tam anlamıyla kullanabilmek için sistemi tam olarak kurmak gerekiyor. Sistemin donanımsal olarak tüm detaylarını paylaşmayı düşünmüyorum fakat yazılım kısmı ve birkaç fotoğraf burada yer alacak.

Cihaz kısaca;
Pillerden gelen 16v girişi 9v'a stepdown converter ile çeviriyor ve voltaj seviyelerini arduino yardımı ile sürekli ölçüyor. İstenirse tüm sistem durumunu sürekli olarak bir bilgisayara aktarabiliyor. Seviyeye göre durum ışıklarını yakıyor ve ses çıkarıyor. 4 tane 16850 li-ion pil ile bir modemi yaklaşık 10 saat civarında (veya daha uzun) besleyebiliyor. Gerekli ayarlamalardan sonra UPS mantığı ile elektrik gittiğinde devreye girebiliyor.

Aslında voltajı sürekli pillerden sağladığı için pek çok son model UPS'ten daha iyi diyebilirim. Online UPS mantığı ile çalışıyor desek de olur... Kablolama hariç. İleride istediğim parçayı geri çıkarabilmek için modüler yapmayı tercih ettim ki bu da biraz fazla kablo kullanımı gerektirdi...
Sonuçta: Mükemmel oldu :)











/*
  Arduino Battery Tester
  Created: 20/01/2016
  By Gus
   http://arduinomylifeup.com/arduino-battery-tester
 
  
          Modified:  15/07/2016
By, Osmn TSN  http://x86macerasi.blogspot.com/ 
           Based on Arduino Battery Tester, Modified alot! Became 9v UPS for generic use.
 
 Arduino battery tester & relayed charge/discharge solution with relay and 1v to 25v voltage measurement. Version 0.1
*/
// the setup routine runs once when you press reset:

int gl2 = 9; //gl means GreatLight :)
int gl3 = 8;
int gl4 = 7;
int gl5 = 6;
int gl6 = 5;
int gl7 = 4;
int gl8 = 3;
int gl9 = 2;
int role1 = 11; //role means relay
int role2 = 12;
int analogValue = 0;
float voltage = 0;
int ledDelay = 1000;
void setup()
{
  Serial.begin(9600);
  Serial.println("Baglanti baslatildi");
  pinMode(gl2, OUTPUT);
  pinMode(gl3,OUTPUT);
  pinMode(gl4,OUTPUT);
  pinMode(gl5,OUTPUT);
  pinMode(gl6,OUTPUT);
  pinMode(gl7,OUTPUT);
  pinMode(gl8,OUTPUT);
  pinMode(gl9,OUTPUT);
  pinMode(role1,OUTPUT);
  pinMode(role2,OUTPUT);
  pinMode(10, OUTPUT); // for beep and melody

  // Startup melody begins below
  beep(50);
  delay(100);
  tone( 10, 1000, 100);
  delay(100);
  tone( 10, 1100, 100);
  delay(100);
  tone( 10, 1200, 100);
  delay(100);
  tone( 10, 1300, 100);
  delay(100);
  tone( 10, 1400, 100);
  delay(100);
  tone( 10, 1500, 100);
  delay(500);
  beep(50);
  delay(1000);

// Startup boot indicator, start all leds like powerbanks
delay(300);
digitalWrite(gl2, HIGH);
delay(300);
digitalWrite(gl3, HIGH);
delay(300);
digitalWrite(gl4, HIGH);
delay(300);
digitalWrite(gl5, HIGH);
delay(300);
digitalWrite(gl6, HIGH);
delay(300);
digitalWrite(gl7, HIGH);
delay(300);
digitalWrite(gl8, HIGH);
delay(300);
digitalWrite(gl9, HIGH);
delay(300);
// röleleri aç LOW röle açar çünkü bu röleler ters mantıkta çalışıyor
// open relays, LOW opens & HIGH closes relay because these Chinese relays works indirect
digitalWrite(role1, HIGH); // Relay closed. No current passes over relay.
delay(300);
Serial.println("Role 1 KAPALI");
delay(300);
digitalWrite(role2, HIGH); // Relay closed.
delay(300);
Serial.println("Role 2 KAPALI");
tone( 10, 2000, 200); // Sistemin hazır olduğunu belirmek için bir kere uzun ses çıkar. -System is ready- tone.
}
void loop()
{
  analogValue = analogRead(A0);
  voltage = 0.024*analogValue; // yeni değer 16.20v girdi için. 5v girdi için eski değer ise voltage = 0.0048*analogValue; for 5v input
  Serial.println(voltage);
  // delay(1);
  if (voltage > 16.25)
    digitalWrite(gl9, HIGH);
  else if (voltage > 15.80 && voltage < 16.26)
    {
    digitalWrite(gl8, HIGH);
    digitalWrite(gl7, HIGH);
    digitalWrite(gl6, HIGH);
    digitalWrite(gl5, HIGH);
    digitalWrite(gl4, HIGH);
    digitalWrite(gl3, HIGH);
 
    }
  else if (voltage > 15.40 && voltage < 15.81)
    {
    digitalWrite(gl7, HIGH);
    digitalWrite(gl6, HIGH);
    digitalWrite(gl5, HIGH);
    digitalWrite(gl4, HIGH);
    digitalWrite(gl3, HIGH);
    }
  else if (voltage > 15.00 && voltage < 15.40)
    {
    digitalWrite(gl6, HIGH);
    digitalWrite(gl5, HIGH);
    digitalWrite(gl4, HIGH);
    digitalWrite(gl3, HIGH);
    }
  else if (voltage > 14.60 && voltage < 15.01)
    {
    digitalWrite(gl5, HIGH);
    digitalWrite(gl4, HIGH);
    digitalWrite(gl3, HIGH);
    }
  else if (voltage > 14.20 && voltage < 14.61)
    {
    digitalWrite(gl4, HIGH);
    digitalWrite(gl3, HIGH);
    }
  else if (voltage > 13.80 && voltage < 14.21)
    digitalWrite(gl3, HIGH);
 
  else if (voltage > 13.00 && voltage < 13.81)
    {
      digitalWrite(gl2, HIGH);
      delay(100);
      digitalWrite(gl2, LOW);
    }
  if (voltage > 13.00 && voltage < 13.31)
    beep(100);
  else if (voltage > 12.50 && voltage < 13.00)
    {
      tone( 10, 2000, 500);
      delay(500);
      tone(10, 3000, 500);
      digitalWrite(gl2, HIGH);
      delay(100);
      digitalWrite(gl2, LOW);
      digitalWrite(gl3, HIGH);
      delay(100);
      digitalWrite(gl3, LOW);
    }
  if (voltage > 11.00 && voltage < 12.50)
    {
      tone( 10, 2000, 1000);
      delay(1500);
      digitalWrite(role1, HIGH);
 
    }
  else if (voltage > 14.10)
    digitalWrite(role1, LOW);
 
  if (voltage > 16.15)
    {
    digitalWrite(role2, HIGH);
    }
 
  else if (voltage < 16.15)
    digitalWrite(role2, LOW);
if (voltage < 10)
{
  digitalWrite(role1, HIGH);
  digitalWrite(role2, HIGH);
 tone( 10, 90, 200);
 delay(300);
digitalWrite(gl2, HIGH);
delay(100);
digitalWrite(gl2, LOW);
delay(100);
digitalWrite(gl3, HIGH);
delay(100);
digitalWrite(gl3, LOW);
delay(100);
digitalWrite(gl4, HIGH);
delay(100);
digitalWrite(gl4, LOW);
delay(100);
digitalWrite(gl5, HIGH);
delay(100);
digitalWrite(gl5, LOW);
delay(100);
digitalWrite(gl6, HIGH);
delay(100);
digitalWrite(gl6, LOW);
delay(100);
digitalWrite(gl7, HIGH);
delay(100);
digitalWrite(gl7, LOW);
delay(100);
digitalWrite(gl8, HIGH);
delay(100);
digitalWrite(gl8, LOW);
delay(100);
digitalWrite(gl9, HIGH);
delay(100);
digitalWrite(gl9, LOW);
Serial.println("Pil bulunamadı");
}

  delay(ledDelay);
  digitalWrite(gl9, LOW);
  digitalWrite(gl8, LOW);
  digitalWrite(gl7, LOW);
  digitalWrite(gl6, LOW);
  digitalWrite(gl5, LOW);
  digitalWrite(gl4, LOW);
  digitalWrite(gl3, LOW);
  digitalWrite(gl2, LOW);
  //digitalWrite(role1, LOW);
}
void beep(unsigned char delayms){
  analogWrite(10, 20);      // Almost any value can be used except 0 and 255
                           // experiment to get the best tone
  delay(delayms);          // wait for a delayms ms
  analogWrite(10, 0);       // 0 turns it off
  delay(delayms);          // wait for a delayms ms
}  


1 yorum:

JDP Watchdog dedi ki...

What a useless machine. I like it very much :)