Link to GitHub library and sketch code from video https://github.com/ForceTronics/nRF24L01-Sensor-Network-that-Connects-to-the-Cloud
The ForceTronics blog provides tutorials on creating fun and unique electronic projects. The goal of each project will be to create a foundation or jumping off point for amateur, hobbyist, and professional engineers to build on and innovate. Please use the comments section for questions and go to forcetronics.com for information on forcetronics consulting services.
Showing posts with label low power. Show all posts
Showing posts with label low power. Show all posts
Wednesday, October 26, 2016
Creating a Sensor Network that Connects to the Cloud Part 1
In this three part series we look at how to create a wireless sensor mesh network that stores data on the cloud using the Arduino platform. In part one we will look at the architecture of the network and how to get started sending sensor data to the cloud.
Link to GitHub library and sketch code from video https://github.com/ForceTronics/nRF24L01-Sensor-Network-that-Connects-to-the-Cloud
Link to GitHub library and sketch code from video https://github.com/ForceTronics/nRF24L01-Sensor-Network-that-Connects-to-the-Cloud
Thursday, September 15, 2016
Reducing Power Consumption on the Arduino Enabled ESP8266
In this tutorial we look at how to reduce the power consumption of your Arduino enabled ESP8266 WiFi module for battery powered applications.
//**************Arduino code: ESP8266_Sleep_Example *************
/*
This sketch was created for a tutorial on saving power using the ESP8266 with the Arduino IDE
That was presented on the ForceTronics YouTube Channel. This code is public domain for anybody to use
at their own risk
*/
#include <Arduino.h>
#include <ESP8266WiFi.h> //not using WiFi but need for some of the sleep commands
const int LED_PIN = 5; // Thing's onboard, green LED
const int sleepTimeS = 5; //sets deepsleep time to 5 sec
void setup()
{
pinMode(LED_PIN,OUTPUT); //setup LED pin
flashLED(); //function that flashes LED on and off
WiFi.forceSleepBegin(0); //this function turns on modem sleep mode (turns off RF but not CPU)
flashLED();
WiFi.forceSleepWake(); //wakes modem up from sleep mode
flashLED();
// deepSleep time is defined in microseconds. Multiply seconds by 1e6
ESP.deepSleep(sleepTimeS * 1000000); //Can also add mode setting: WAKE_RF_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED
//ESP.deepSleep(0,WAKE_RF_DEFAULT); //In Deep-sleep mode, the chip can be woken up and initialized by a low-level pulse
//generated on the EXT_RSTB pin via an external IO
}
void loop()
{ //do nothing in the loop
}
//function that flashes LED at 1.5sec intervals
void flashLED() {
digitalWrite(LED_PIN, HIGH);
delay(1500);
digitalWrite(LED_PIN, LOW);
delay(1500);
}
//**************Arduino code: ESP8266_Sleep_Cloud_Example *************
/*
This sketch was used for a tutorial on saving power with the ESP8266 using Arduino IDE
That was presented on the ForceTronics YouTube Channel. This code is public domain for anybody to
use or modify at your own risk
Note that this code was leveraged from a Sparkfun example
on using their cloud service Phant
*/
#include <Arduino.h>
// Include the ESP8266 WiFi library.
#include <ESP8266WiFi.h>
// Include the SparkFun Phant library.
#include <Phant.h>
//Set your network name and password
const char WiFiSSID[] = "YourNetwork";
const char WiFiPSK[] = "YourPassword";
//define constants for pin control and node number
const int LED_PIN = 5; // Thing's onboard, green LED
const int ANALOG_PIN = A0; // The only analog pin on the Thing
const int NODE_NUM = 1; //node identifier
//declare phant address and security keys
const char PhantHost[] = "data.sparkfun.com";
const char PublicKey[] = "YourPublicKey";
const char PrivateKey[] = "YourPrivateKey";
//specify the rate that you post data to cloud
const unsigned long postRate = 15000;
unsigned long lastPost = 0;
const int sleepTimeS = 15;
void setup()
{
initHardware(); //setup arduino hardware
connectWiFi(); //Connect your WiFi network
digitalWrite(LED_PIN, HIGH);
while (postToPhant() != 1) //post to cloud in setup code because we will reset after sleep
{
delay(100);
}
digitalWrite(LED_PIN, LOW);
// deepSleep time is defined in microseconds. Multiply
// seconds by 1e6
ESP.deepSleep(sleepTimeS * 1000000); //This is where we go to sleep, will reset upon waking up
}
void loop()
{ //do nothing here
}
//function used to connect to WiFi network and where we set transmit power level
void connectWiFi()
{
byte ledStatus = LOW;
//Set transmit power level
WiFi.setOutputPower(0.0); //sets transmit power to 0dbm to lower power consumption, but reduces usable range
// Set WiFi mode to station (as opposed to AP or AP_STA)
WiFi.mode(WIFI_STA);
// WiFI.begin([ssid], [passkey]) initiates a WiFI connection
// to the stated [ssid], using the [passkey] as a WPA, WPA2,
// or WEP passphrase.
WiFi.begin(WiFiSSID, WiFiPSK);
// Use the WiFi.status() function to check if the ESP8266
// is connected to a WiFi network.
while (WiFi.status() != WL_CONNECTED)
{
// Blink the LED
digitalWrite(LED_PIN, ledStatus); // Write LED high/low
ledStatus = (ledStatus == HIGH) ? LOW : HIGH;
// Delays allow the ESP8266 to perform critical tasks
// defined outside of the sketch. These tasks include
// setting up, and maintaining, a WiFi connection.
delay(100);
// Potentially infinite loops are generally dangerous.
// Add delays -- allowing the processor to perform other
// tasks -- wherever possible.
}
}
//function that sets up some initial hardware states
void initHardware()
{
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
}
//this function takes data and posts it to the cloud
int postToPhant()
{
// LED turns on when we enter, it'll go off when we
// successfully post.
digitalWrite(LED_PIN, HIGH);
// Declare an object from the Phant library - phant
Phant phant(PhantHost, PublicKey, PrivateKey);
//These functions build data and field string that will be sent to phant cloud
phant.add("adcdata", analogRead(ANALOG_PIN));
phant.add("wifinode", NODE_NUM);
// Now connect to data.sparkfun.com, and post our data:
WiFiClient client; //declare client object that will post the data
const int httpPort = 80; //specify port to post through
if (!client.connect(PhantHost, httpPort)) //attempt to connect to phant
{
// If we fail to connect, return 0.
return 0;
}
//Send post to phant
client.print(phant.post());
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
//Serial.print(line); // Trying to avoid using serial
}
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
return 1; // Return success
}
//**************Arduino code: ESP8266_Sleep_Example *************
/*
This sketch was created for a tutorial on saving power using the ESP8266 with the Arduino IDE
That was presented on the ForceTronics YouTube Channel. This code is public domain for anybody to use
at their own risk
*/
#include <Arduino.h>
#include <ESP8266WiFi.h> //not using WiFi but need for some of the sleep commands
const int LED_PIN = 5; // Thing's onboard, green LED
const int sleepTimeS = 5; //sets deepsleep time to 5 sec
void setup()
{
pinMode(LED_PIN,OUTPUT); //setup LED pin
flashLED(); //function that flashes LED on and off
WiFi.forceSleepBegin(0); //this function turns on modem sleep mode (turns off RF but not CPU)
flashLED();
WiFi.forceSleepWake(); //wakes modem up from sleep mode
flashLED();
// deepSleep time is defined in microseconds. Multiply seconds by 1e6
ESP.deepSleep(sleepTimeS * 1000000); //Can also add mode setting: WAKE_RF_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED
//ESP.deepSleep(0,WAKE_RF_DEFAULT); //In Deep-sleep mode, the chip can be woken up and initialized by a low-level pulse
//generated on the EXT_RSTB pin via an external IO
}
void loop()
{ //do nothing in the loop
}
//function that flashes LED at 1.5sec intervals
void flashLED() {
digitalWrite(LED_PIN, HIGH);
delay(1500);
digitalWrite(LED_PIN, LOW);
delay(1500);
}
//**************Arduino code: ESP8266_Sleep_Cloud_Example *************
/*
This sketch was used for a tutorial on saving power with the ESP8266 using Arduino IDE
That was presented on the ForceTronics YouTube Channel. This code is public domain for anybody to
use or modify at your own risk
Note that this code was leveraged from a Sparkfun example
on using their cloud service Phant
*/
#include <Arduino.h>
// Include the ESP8266 WiFi library.
#include <ESP8266WiFi.h>
// Include the SparkFun Phant library.
#include <Phant.h>
//Set your network name and password
const char WiFiSSID[] = "YourNetwork";
const char WiFiPSK[] = "YourPassword";
//define constants for pin control and node number
const int LED_PIN = 5; // Thing's onboard, green LED
const int ANALOG_PIN = A0; // The only analog pin on the Thing
const int NODE_NUM = 1; //node identifier
//declare phant address and security keys
const char PhantHost[] = "data.sparkfun.com";
const char PublicKey[] = "YourPublicKey";
const char PrivateKey[] = "YourPrivateKey";
//specify the rate that you post data to cloud
const unsigned long postRate = 15000;
unsigned long lastPost = 0;
const int sleepTimeS = 15;
void setup()
{
initHardware(); //setup arduino hardware
connectWiFi(); //Connect your WiFi network
digitalWrite(LED_PIN, HIGH);
while (postToPhant() != 1) //post to cloud in setup code because we will reset after sleep
{
delay(100);
}
digitalWrite(LED_PIN, LOW);
// deepSleep time is defined in microseconds. Multiply
// seconds by 1e6
ESP.deepSleep(sleepTimeS * 1000000); //This is where we go to sleep, will reset upon waking up
}
void loop()
{ //do nothing here
}
//function used to connect to WiFi network and where we set transmit power level
void connectWiFi()
{
byte ledStatus = LOW;
//Set transmit power level
WiFi.setOutputPower(0.0); //sets transmit power to 0dbm to lower power consumption, but reduces usable range
// Set WiFi mode to station (as opposed to AP or AP_STA)
WiFi.mode(WIFI_STA);
// WiFI.begin([ssid], [passkey]) initiates a WiFI connection
// to the stated [ssid], using the [passkey] as a WPA, WPA2,
// or WEP passphrase.
WiFi.begin(WiFiSSID, WiFiPSK);
// Use the WiFi.status() function to check if the ESP8266
// is connected to a WiFi network.
while (WiFi.status() != WL_CONNECTED)
{
// Blink the LED
digitalWrite(LED_PIN, ledStatus); // Write LED high/low
ledStatus = (ledStatus == HIGH) ? LOW : HIGH;
// Delays allow the ESP8266 to perform critical tasks
// defined outside of the sketch. These tasks include
// setting up, and maintaining, a WiFi connection.
delay(100);
// Potentially infinite loops are generally dangerous.
// Add delays -- allowing the processor to perform other
// tasks -- wherever possible.
}
}
//function that sets up some initial hardware states
void initHardware()
{
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
}
//this function takes data and posts it to the cloud
int postToPhant()
{
// LED turns on when we enter, it'll go off when we
// successfully post.
digitalWrite(LED_PIN, HIGH);
// Declare an object from the Phant library - phant
Phant phant(PhantHost, PublicKey, PrivateKey);
//These functions build data and field string that will be sent to phant cloud
phant.add("adcdata", analogRead(ANALOG_PIN));
phant.add("wifinode", NODE_NUM);
// Now connect to data.sparkfun.com, and post our data:
WiFiClient client; //declare client object that will post the data
const int httpPort = 80; //specify port to post through
if (!client.connect(PhantHost, httpPort)) //attempt to connect to phant
{
// If we fail to connect, return 0.
return 0;
}
//Send post to phant
client.print(phant.post());
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
//Serial.print(line); // Trying to avoid using serial
}
// Before we exit, turn the LED off.
digitalWrite(LED_PIN, LOW);
return 1; // Return success
}
Sunday, April 19, 2015
Reducing Arduino’s Power Consumption Part 4 (Turning Off the BOD)
This is the fourth, and most likely the last, in a series where we look at how to reduce your Arduino's power consumption. This series is great for anybody working on a project that is battery powered and you want to ensure the longest battery life possible. In this part we will look at how to turn off the Brown Out Detector (BOD) to save power.
************************Arduino Code*******************************************
/* This Arduino Sketch is part of a tutorial on the ForceTronics YouTube Channel and demonstrates how to use the Sleep cabilities on
Arduino as well as turn off the ADC to get low power consumption. In this tutorial the Extended Fuse on the Atmega was configured
to turn off the Brown Out Detection (BOD) for even further power savings. It is free and open for anybody to use at their own risk.
*/
/*
To turn off the BOD avrdude was used via the command prompt, the following command was used:
avrdude -c usbtiny -p atmega328p -U efuse:w:0x07:m
*/
#include <avr/sleep.h>
void setup() {
delay(6000); //Delay to see normal power level first
sleep_enable(); //enable the sleep capability
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set the type of sleep mode. Default is Idle
ADCSRA &= ~(1<<ADEN); //Turn off ADC before going to sleep (set ADEN bit to 0)
sleep_cpu(); //enter sleep mode. Next code that will be executed is the ISR when interrupt wakes Arduino from sleep
}
void loop() {
// put your main code here, to run repeatedly:
}
************************Arduino Code*******************************************
/* This Arduino Sketch is part of a tutorial on the ForceTronics YouTube Channel and demonstrates how to use the Sleep cabilities on
Arduino as well as turn off the ADC to get low power consumption. In this tutorial the Extended Fuse on the Atmega was configured
to turn off the Brown Out Detection (BOD) for even further power savings. It is free and open for anybody to use at their own risk.
*/
/*
To turn off the BOD avrdude was used via the command prompt, the following command was used:
avrdude -c usbtiny -p atmega328p -U efuse:w:0x07:m
*/
#include <avr/sleep.h>
void setup() {
delay(6000); //Delay to see normal power level first
sleep_enable(); //enable the sleep capability
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set the type of sleep mode. Default is Idle
ADCSRA &= ~(1<<ADEN); //Turn off ADC before going to sleep (set ADEN bit to 0)
sleep_cpu(); //enter sleep mode. Next code that will be executed is the ISR when interrupt wakes Arduino from sleep
}
void loop() {
// put your main code here, to run repeatedly:
}
Thursday, December 11, 2014
Reducing Arduino’s Power Consumption Part 3
Welcome to part 3 of reducing Arduino's power consumption, a must watch series for anybody building a battery powered project with Arduino. In part 3 we will look at how to use the Watch Dog Timer like an alarm clock to wake Arduino up from sleep mode. We we also look at some additional techniques to save power.
*****************************************Arduino Code*************************************************
/*
Example program for using sleep modes and watch dog timer in Arduino. This example code was used in a sleep mode tutorial video on the ForceTronics YouTube Channel.
This code is open for anybody to use at their own risk*/
/*WDT BYTE variables for setting timer value
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S */
#include <avr/sleep.h>
//We use part of the WDT library, but have to use registers as well since library does not support interrupt mode for WDT
#include <avr/wdt.h>
int led = 13; //variable for pin that the LED is on
int tog = 1; //variable that toggles between traditional delay() function and WDT sleep delay function
void setup() {
wdt_disable(); //Datasheet recommends disabling WDT right away in case of low probabibliy event
pinMode(led, OUTPUT); //set up the LED pin to output
}
void loop() {
if(tog) { //use traditional delay function
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait
tog = 0; //toggle variable
}
else { //after blinking LED setup interrupt and then go to sleep. Note that sleep will only happen once sinc
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // turn the LED on (HIGH is the voltage level)//
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delayWDT(WDTO_1S); // Use WDT sleep delay function, argument is byte variable from WDT Library
//delayWDT(0x06); //Use WDT sleep delay function, argument is byte value that sets timer to 1 second
tog = 1; //toggle variable
}
}
//This function serves as a power saving delay function. The argument is a Byte type variable that is used to set the delay time
//The function sets up sleep mode in power down state. The function then sets up the WDT timer in interrupt mode and sets it.
//It then puts the Arduino to sleep for the set time. Upon wake up the WDT and sleep mode are shut off
void delayWDT(byte timer) {
sleep_enable(); //enable the sleep capability
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set the type of sleep mode. Default is Idle
ADCSRA &= ~(1<<ADEN); //Turn off ADC before going to sleep (set ADEN bit to 0)
WDTCSR |= 0b00011000; //Set the WDE bit and then clear it when set the prescaler, WDCE bit must be set if changing WDE bit
WDTCSR = 0b01000000 | timer; //Or timer prescaler byte value with interrupt selectrion bit set
// WDTCSR = 0b01000110; //This sets the WDT to 1 second
wdt_reset(); //Reset the WDT
sleep_cpu(); //enter sleep mode. Next code that will be executed is the ISR when interrupt wakes Arduino from sleep
sleep_disable(); //disable sleep mode
ADCSRA |= (1<<ADEN); //Turn the ADC back on
}
//This is the interrupt service routine for the WDT. It is called when the WDT times out.
//This ISR must be in your Arduino sketch or else the WDT will not work correctly
ISR (WDT_vect)
{
wdt_disable();
MCUSR = 0; //Clear WDT flag since it is disabled, this is optional
} // end of WDT_vect
*****************************************Arduino Code*************************************************
/*
Example program for using sleep modes and watch dog timer in Arduino. This example code was used in a sleep mode tutorial video on the ForceTronics YouTube Channel.
This code is open for anybody to use at their own risk*/
/*WDT BYTE variables for setting timer value
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S */
#include <avr/sleep.h>
//We use part of the WDT library, but have to use registers as well since library does not support interrupt mode for WDT
#include <avr/wdt.h>
int led = 13; //variable for pin that the LED is on
int tog = 1; //variable that toggles between traditional delay() function and WDT sleep delay function
void setup() {
wdt_disable(); //Datasheet recommends disabling WDT right away in case of low probabibliy event
pinMode(led, OUTPUT); //set up the LED pin to output
}
void loop() {
if(tog) { //use traditional delay function
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait
tog = 0; //toggle variable
}
else { //after blinking LED setup interrupt and then go to sleep. Note that sleep will only happen once sinc
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // turn the LED on (HIGH is the voltage level)//
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delayWDT(WDTO_1S); // Use WDT sleep delay function, argument is byte variable from WDT Library
//delayWDT(0x06); //Use WDT sleep delay function, argument is byte value that sets timer to 1 second
tog = 1; //toggle variable
}
}
//This function serves as a power saving delay function. The argument is a Byte type variable that is used to set the delay time
//The function sets up sleep mode in power down state. The function then sets up the WDT timer in interrupt mode and sets it.
//It then puts the Arduino to sleep for the set time. Upon wake up the WDT and sleep mode are shut off
void delayWDT(byte timer) {
sleep_enable(); //enable the sleep capability
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set the type of sleep mode. Default is Idle
ADCSRA &= ~(1<<ADEN); //Turn off ADC before going to sleep (set ADEN bit to 0)
WDTCSR |= 0b00011000; //Set the WDE bit and then clear it when set the prescaler, WDCE bit must be set if changing WDE bit
WDTCSR = 0b01000000 | timer; //Or timer prescaler byte value with interrupt selectrion bit set
// WDTCSR = 0b01000110; //This sets the WDT to 1 second
wdt_reset(); //Reset the WDT
sleep_cpu(); //enter sleep mode. Next code that will be executed is the ISR when interrupt wakes Arduino from sleep
sleep_disable(); //disable sleep mode
ADCSRA |= (1<<ADEN); //Turn the ADC back on
}
//This is the interrupt service routine for the WDT. It is called when the WDT times out.
//This ISR must be in your Arduino sketch or else the WDT will not work correctly
ISR (WDT_vect)
{
wdt_disable();
MCUSR = 0; //Clear WDT flag since it is disabled, this is optional
} // end of WDT_vect
Subscribe to:
Posts (Atom)