Ranga Yogeshwar

Ein konkretes Projekt: Stromwächter

Als "Finger√ľbung" habe ich mir ein kleines Projekt ausgedacht: Ein Stromw√§chter.
Manchmal f√§llt der Strom aus und falls man l√§ngere Zeit nicht zuhause ist k√∂nnen die Konsequenzen unangenehm sein. Z.B. taut die Tiefk√ľhltruhe auf..

Die Idee: Falls der Strom ausfällt, sendet mir eine kleine Box eine SMS auf mein Handy. Dann kann ich z.B. meinen Nachbarn um Hilfe bitten.

Das Projekt klingt komplizierter als es ist, doch mit heutiger Technik geht das ziemlich leicht:

Basis ist folgende Hardware:

Arduino UNO mit GSM-Shield sowie eine kleine selbstentworfene Platine.
So sieht das Ganze fertig aus:

 

/*
 SMS sender with currentchecker Version 1.0 (Ranga Yogeshwar) 
 
 This sketch, for the Arduino GSM shield,sends an SMS message 
 in case power is off.
 
 based partly on SMS-sender by Tom Igoe. 
 Power is sensed via analog Pin 0 (+5V if Power available, else 0V)
 The status can be read via 3 leds:Green (g), Blue (b), Yellow (y)
 a) Power is available: g = On
 b) Power is off: g = Off
 
 c) Startup:  b = Off, y = ON: System is booting, but not yet connected. (if no GSM y is slowly blinking)
 d) GSM is Ready:  4 x b AND y blink
 
 e) System is sensing and Power is on: bORy short, continuous strobe
 f) Power just failed: only b is on, y off
 g) Power fail sending SMS: 4 x b AND y blink
 h) Power fail- after SMS - b is on, y blink
 i) Power back after fail: y is on - b is off
 j) Power back sending SMS: 4 x b AND y blink
 after that e) as standard
 
 
 */



#include <GSM.h>

#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess;
GSM_SMS sms;
int analogPin = 0;        // Neben Green LED - misst ob es einen Stromausfall gibt (Falls Strom dann 5V sonst 0V)
int ledblue = 9;          // Blaue LED auf Pin 9
int ledyel = 8;           // Gelbe LED auf Pin 8
int val = 0;              // variable to store the value read
int delaytime = 8;        // delaytime before sms is send

char remoteNum[20] ="0049171xxxxxxx";  // telephone number to send sms
char txtMsgoff[200] = "Message from Rangas Powerwatch:power is down";// This is the message that will be send
char txtMsgon[200] = "Sensor meldet Strom wieder da. Ausfallzeit in Min :";// This is the message that will be send

int offcounter = 0; // Zaehler um kleinere Aus-Schwankungen auszugleichen
int backcounter = 0; // Zaehler um kleinere An-Schwankungen auszugleichen
int smsONFlag = 0;// 0 falls noch keine SMS gesendet wurde, sonst 1
int smsOFFFlag = 0;// 0 falls noch keine SMS gesendet wurde, sonst 1
int stateBlu = 0;// Zustand der jeweiligen LEDs
int stateYel = 0;
unsigned long time;// Aktuelle Zeit (Millisek seitdem der Arduino läuft)
unsigned long timeoff;// Zeit wo der Strom ausfiel
unsigned long timedown;// Zeit der Stromunterbrechung
unsigned long timedownmin;// Zeit der Stromunterbrechung in Minuten



void setup()
{
  pinMode(ledblue, OUTPUT); 
  pinMode(ledyel, OUTPUT); 

  // initialize serial communications and wait for port to open:
  boolean notConnected = true;
  ledBluOFF();
  ledYelON();

  // Start GSM shield*******************************************
  // **** In this state yellow is blinking (= not yet connected)
  // If your SIM has PIN, pass it as a parameter of begin() in quotes , in this case no PINNumber
  while(notConnected)
  {
    ledYelON();// Led Yello on = Status not connected
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      delay(1000); // Led Yellow is blinking (1s) while not connected
      ledYelOFF();
    }
  }

  // Now we are connected **************************************
  // Show via LED, that we are connected
  Led4xBluORYel(); // Blinkt 4 x blue and yellow
}








void loop()
{
  // measure the current
  int a = currentVal();  // a = 1 == Strom da, sonst ==0
  delay(1000);

  //1. power is off*******************************************
  if(a == 0){
    switch(smsOFFFlag){
    case 1:// SMS already send

      Led1xYelBluON();// Show Blue blinking Yellow on
      break;// SMS was send, so go back to measure

    case 0:// SMS not yet send
      offcounter =offcounter +1;// increment the delaycounter
      if(offcounter > delaytime){
        // sms was not jet send so do it
        sendoffSMS();
        Led4xBluANDYel();
        smsOFFFlag =1;
        smsONFlag = 0;
        offcounter =0;
      }
      else
      {
        ledBluON();
        ledYelOFF();
      }
      break;
    }
  }
  // 2. power is back*****************************************
  else if(a ==1){ 
    switch(smsONFlag){
    case 1:// SMS already send
      Led1xBluORYel();
      break;

    case 0:
¬†¬†¬†¬†¬†¬†backcounter¬†=¬†backcounter¬†+1;¬†// Nach Stromausfall pr√ľfen ob er wieder da ist.
      if (backcounter >delaytime){
        sendonSMS();
        Led4xBluANDYel();
        smsOFFFlag =0;
        smsONFlag = 1;
        backcounter =0;
      }
      else
      {
        ledBluOFF();
        ledYelON();
      }
      break;
    }
  }
}


//***********************************************************
//********************end of the loop ***********************


// Read the value of the current

int currentVal()
{
  val = analogRead(analogPin); 
  if(val > 100){
    return 1;// Current is on
  }
  else
  { 
    return 0;// Current is low
  }
} 

//****************************Send SMS - off ***************
int sendoffSMS()
{
  sms.beginSMS(remoteNum);
  sms.print(txtMsgoff);
  sms.endSMS();
  timeoff = millis(); // Get the starting time of the power failiure 
}

//****************************Send SMS - on *************** 
int sendonSMS()
{
  time = millis(); // Get the actual time
  timedown = (time - timeoff)/1000; // timedown in sek since Power down.
  timedownmin = timedown/60;
  String str1 = "Message from Rangas Powerwatch: power is back again. downtime in seconds was:";
  str1 += timedown;
  int str_len = str1.length()+1;
  char char_array[str_len];
  str1.toCharArray(char_array, str_len);

  sms.beginSMS(remoteNum);
  sms.print(char_array);
  sms.endSMS(); 
}









// ******************************LED states ***********************
int ledBluOFF()
{
  digitalWrite(ledblue, LOW);
  stateBlu = 0; 
}

int ledBluON()
{
  digitalWrite(ledblue, HIGH);
  stateBlu = 1; 
}

int ledYelOFF()
{
  digitalWrite(ledyel, LOW);
  stateYel = 0; 
}

int ledYelON()
{
  digitalWrite(ledyel, HIGH);
  stateYel = 1; 
}

// LED Blue AND Yellow blink 4 times *************************

int Led4xBluANDYel() // Blinkt 4 x Blue AND yellow
{
  for (int i=0; i <= 5; i++){
    ledBluON();
    ledYelON();
    delay(300);
    ledBluOFF();
    ledYelOFF();
    delay(300);
  }
}
// LED Blue OR Yellow blink 4 times ****************************
int Led4xBluORYel() // Blinkt 4 x Blue /Yellow alternativ
{
  for (int i=0; i <= 5; i++){
    ledBluON();
    ledYelOFF();
    delay(300);
    ledBluOFF();
    ledYelON();
    delay(300);
  }
}

// LED Blue Or Yellow fast blink 1xtimes ************************
int Led1xBluORYel()
{
  ledBluON();
  ledYelOFF();
  delay(50);
  ledBluOFF();
  ledYelON();
  delay(50); 
  ledYelOFF();
}
// LED Yellow ON with Blue blinking *****************************
int Led1xBluYelON()
{
  ledBluON();
  ledYelON(); 
  delay(50);
  ledBluOFF();
}
// LED Blue ON with Yellow blinking *****************************
int Led1xYelBluON()
{
  ledBluON();
  ledYelON(); 
  delay(50);
  ledYelOFF();
}

//Read input serial +++++++++++++++++++++++++++++++++++++++++++

int readSerial(char result[])
{
  int i = 0;
  while(1)
  {
    while (Serial.available() > 0)
    {
      char inChar = Serial.read();
      if (inChar == '\n')
      {
        result[i] = '\0';
        Serial.flush();
        return 0;
      }
      if(inChar!='\r')
      {
        result[i] = inChar;
        i++;
      }
    }
  }
}