Go Down

Topic: Wifi Power Outage Detector (Read 2073 times) previous topic - next topic

RedHotQC

Jan 14, 2014, 04:35 am Last Edit: Jan 14, 2014, 04:36 am by RedHotQC Reason: 1
Hi, community of Arduino.

I'm kind of new to this kind of project so any help is appreciated.

I am making a wifi power outage detector, I have the schematic plan and the program is already made, but I need to know if I'm doing it right or if there was a better way for doing it.

I intend on using a ATMEGA328P-PU, Adafruit's CC3000 wifi breakout and a LM35DZ for the temp
I'm not sure if using a relay will effectively switch between the mains power and the battery. The 4.8V battery is supposed to work directly with the chip and it will be more effective than using a voltage regulator. Sleeping saves the battery. It will connect to a mobile wifi access and upload the power status and the temperature to Xively.

The schematic is attached to the post.

Here's the code:
Code: [Select]
#include <Adafruit_CC3000.h>
#include <ccspi.h>
#include <SPI.h>
#include <stdlib.h>
#include <string.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <debug.h>


#define ADAFRUIT_CC3000_IRQ 3
#define ADAFRUIT_CC3000_VBAT 5
#define ADAFRUIT_CC3000_CS 10

Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIV2);

#define WLAN_SSID "SSID"
#define WLAN_PASS "****"
#define WLAN_SECURITY WLAN_SEC_WPA2

#define WEBSITE "api.xively.com"
#define API_key "yourAPIKey"
#define feedID "yourFeedID"

uint32_t ip;

#define redLed 6
#define greenLed 7
#define yellowLed 8
#define powerPin 2
#define tempPin A5

#define sleepTime 450
volatile byte wdt = 0;

void setup(){
 pinMode(redLed, OUTPUT);
 pinMode(greenLed, OUTPUT);
 pinMode(yellowLed, OUTPUT);
 pinMode(powerPin, INPUT);
 pinMode(tempPin, INPUT);
 
 Serial.println(F("\nInitializing..."));
 if(!cc3000.begin()){
   Serial.println(F("Couldn't begin()! Check your wiring!"));
   while(1);
 }
 
 setup_watchdog();
 set_sleep_mode(SLEEP_MODE_PWR_DOWN);
 
 delay(10);
}

void loop(){
 int powerState = digitalRead(powerPin);
 while(powerState == true){
   digitalWrite(greenLed, HIGH);
   digitalWrite(yellowLed, HIGH);
   ip = 0;
   Serial.print(WEBSITE);Serial.print(F("->"));
   while(ip == 0){
     if(!cc3000.getHostByName(WEBSITE, &ip)){
       Serial.println(F("Couldn't resolve!"));
     }
     delay(500);
   }
   cc3000.printIPdotsRev(ip);
   int tempC = (5.0 * analogRead(tempPin) * 100.0) / 1024.0;
   int length = 0;
   String data = "";
   data = data + "\n" + "{\"version\":\"1.0.0\",\"datastreams\" : [ {\"id\" : \"Temperature\",\"current_value\" : \"" + String(tempC) + "\"},"
   + "{\"id\" : \"Power Status\",\"current_value\" : \"" + String(powerState) + "\"}]}";
   length = data.length();
   Adafruit_CC3000_Client client = cc3000.connectTCP(ip, 80);
   if(client.connected()){
     Serial.println("Connected!");
     client.println("PUT /v2/feeds/" + String(feedID) + ".json HTTP/1.0");
     client.println("Host: api.xively.com");
     client.println("X-ApiKey: " + String(API_key));
     client.println("Content-Length: " + String(length));
     client.print("Connection: close");
     client.println();
     client.print(data);
     client.println();
   }
   while(client.connected()){
     while(client.available()){
       char c = client.read();
       Serial.print(c);
     }
   }
   client.close();
   cc3000.disconnect();
   digitalWrite(yellowLed, LOW);
   delay(300000);
   digitalWrite(greenLed, LOW);
 }
 while(powerState == false){
   digitalWrite(yellowLed, HIGH);
   digitalWrite(redLed, HIGH);
   ip = 0;
   Serial.print(WEBSITE);Serial.print(F("->"));
   while(ip == 0){
     if(!cc3000.getHostByName(WEBSITE, &ip)){
       Serial.println(F("Couldn't resolve!"));
     }
     delay(500);
   }
   cc3000.printIPdotsRev(ip);
   int tempC = (5.0 * analogRead(tempPin) * 100.0) / 1024.0;
   int length = 0;
   String data = "";
   data = data + "\n" + "{\"version\":\"1.0.0\",\"datastreams\" : [ {\"id\" : \"Temperature\",\"current_value\" : \"" + String(tempC) + "\"},"
   + "{\"id\" : \"Power Status\",\"current_value\" : \"" + String(powerState) + "\"}]}";
   length = data.length();
   Adafruit_CC3000_Client client = cc3000.connectTCP(ip, 80);
   if(client.connected()){
     Serial.println("Connected!");
     client.println("PUT /v2/feeds/" + String(feedID) + ".json HTTP/1.0");
     client.println("Host: api.xively.com");
     client.println("X-ApiKey: " + String(API_key));
     client.println("Content-Length: " + String(length));
     client.print("Connection: close");
     client.println();
     client.print(data);
     client.println();
   }
   while(client.connected()){
     while(client.available()){
       char c = client.read();
       Serial.print(c);
     }
   }
   client.close();
   cc3000.disconnect();
   digitalWrite(yellowLed, LOW);
   digitalWrite(redLed, LOW);
   system_sleep();
 }
}

void system_sleep() {
 for(int x = 0; x < sleepTime; x++){
   digitalWrite(9,HIGH);
   delay(100);
   digitalWrite(9,LOW);
   delay(10);
   byte dummy_0 = DDRB;                    
   byte dummy_1 = DDRD;                    
   byte dummy_2 = TWSR;                    
   byte dummy_3 = TWBR;                    
   byte dummy_4 = SPCR;                    
   byte dummy_5 = SPSR;                    
   PRR = 0xEF;                              
   ADCSRA |= (0<<ADEN);                    
   DDRB = 0x00;                            
   DDRD = 0x00;                            
   sleep_enable();                        
   sleep_mode();  
   // sleeping ...
   sleep_disable();                        
   wdt=0;                                  
   PRR = 0x00;                            
   ADCSRA |= (1<<ADEN);                  
   DDRB = dummy_0;                      
   DDRD = dummy_1;                    
   TWSR = dummy_2;                    
   TWBR = dummy_3;                    
   SPCR = dummy_4;                      
   SPSR = dummy_5;                      
 }
}

void setup_watchdog() {
 MCUSR = 0x00;  
 WDTCSR |= (1<<WDCE) | (1<<WDE);  
 WDTCSR = (1<<WDP3) | (1<<WDP0);
 WDTCSR |= (1<<WDIE);              
}


ISR(WDT_vect) {
 wdt++;
}


Thank you!

gatorback

Have you considered using an Uninterrupatble Power Supply to fill the gap during a power failure?

RedHotQC

Well, I'm a DIY kind of guy and those I found were very expensive, so I would rather use a relay and a battery pack instead.
I'm building this so I can monitor the power and temp remotely, because we go there 2-3 times a month and power outage are frequent and can last from a small 2 hours to a whole week.

Go Up