Are you ready to continue? I have to give an advance warning because the project becomes a bit confusing regarding the Fritzing-Schematics.
Nevertheless I will post the final add-on for the base station just to be complete: the 16x2 backlight LCD. If you are not sure about how to connect a 16x2 LCD there is a fantastic site which will give you full information about this topic: How to connect Arduino with a character LCD. In the meantime this is the current version of the breadboard.
If you followed up to this point it will be no big effort to connect the last item!
Although we haven't built the remote sensor yet, I will start to show the sketch so you have a break building circuits.
Let's start with some information about the project and the configuration of the Xbees - I already mentioned the base station XBee configuration here.
Sketch Part I: project description, explanation how to configure the XBees (this is done via X-CTU and/ or terminal program):
/* REMOTE AND LOCAL TEMPERATURE SENSOR WITH:
ARDUINO UNO, TMP36, AD22100KT, RTC DS1307, TWO SERIES 2 XBEES
ARDUINO UNO, TMP36, AD22100KT, RTC DS1307, TWO SERIES 2 XBEES
AND 16*2 LCD-DISPLAY
Ver 0.1by Markus Ulsass
http://lookmanowire.blogspot.com/
*/
/*
*** XBEE CONFIGURATION ***
RECEIVER: (BASE STATION)
COORDINATOR
ATID 2001 (PAN ID)
ATDH 0
ATDL 0
ATAP 1 API mode enable
ATSP AF0 sleep period according to longest sleep period on end device
/*
*** XBEE CONFIGURATION ***
RECEIVER: (BASE STATION)
COORDINATOR
ATID 2001 (PAN ID)
ATDH 0
ATDL 0
ATAP 1 API mode enable
ATSP AF0 sleep period according to longest sleep period on end device
SENDER: (REMOTE SENSOR )
END DEVICE
ATID 2001 (PAN ID)
ATDH 0
ATDL 0
ATD0 2 pin 0 in analog in mode with TMP36
ATIR 3E8 sample rate 1000 millisecs (hex 3E8)
ATSM 4 sleep mode cyclic sleep mode
ATSP AFO sleep period (AFO = 2800 ms * 10 = 28 seconds)
ATST 7D0 time before sleep 2 seconds (hex 7D0 = 2000 ms)
END DEVICE
ATID 2001 (PAN ID)
ATDH 0
ATDL 0
ATD0 2 pin 0 in analog in mode with TMP36
ATIR 3E8 sample rate 1000 millisecs (hex 3E8)
ATSM 4 sleep mode cyclic sleep mode
ATSP AFO sleep period (AFO = 2800 ms * 10 = 28 seconds)
ATST 7D0 time before sleep 2 seconds (hex 7D0 = 2000 ms)
*/
As mentioned before you should already be familiar with the configuration of the base station ("RECEIVER"), I will now explain the settings for the remote sensor:
- ATID 2001: We select the same PAN ID for the end device, else we would likely have serious communication problems between coordinator and end device
- ATDH 0, ATDL 0: We leave both destination addresses at 0 (no broadcast) to send any information directly to the coordinator
- ATD0 2: Analog Pin 0 (physical pin 20) is set to analog input mode. Remember the XBee will look for a maximum of 1.2 volt input so you might have to use a voltage divider depending on your analog sensor
- ATIR 3E8: The periodic I/O Sampling Rate is set to 1000 milliseconds (that's 3E8 in HEX), this means a sample is sent every second from the remote sensor to the coordinator, given that the end device is awake
- ATSM 4: We set the Sleep Mode to "4" which means we enable the cyclic sleep mode for the XBee end device
- ATSP AF0: The Sleep Period is set to the maximum of 28 seconds hence we set the parameter to AF0 (HEX) or 2800 milliseconds. Because the sleep period is multiplied by 10 we get our 28 seconds.
- ATST 7D0: This value sets the Sleep Timer which decrements the given parameter before the end device falls asleep again provided there is no RF signal received. For testing purposes we set this value to 7D0 (HEX) which is 2000 milliseconds. Later we could decrease this value to save energy. For the time being I will keep this value this high, because we could easier get access to the XBee if something goes wrong.
Sketch Part II: including libraries, declaring and initializing values:
// include the library for liquid crystal code:
#include <LiquidCrystal.h>
// include the library for DS1307 RTC connected via I2C and Wire Library
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 RTC;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int debugLED = 13; // for debugging purposes only
int analogValue = 0; // declare and initialize analogValue for remote sensor
float temperatureInside = 0; // declare and initialize temperatureInside for local temperature
#include <LiquidCrystal.h>
// include the library for DS1307 RTC connected via I2C and Wire Library
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 RTC;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int debugLED = 13; // for debugging purposes only
int analogValue = 0; // declare and initialize analogValue for remote sensor
float temperatureInside = 0; // declare and initialize temperatureInside for local temperature
Not a lot to explain, just the settings for the several devices connected and some values set for later use.
Sketch Part III:Setup:
void setup() {
pinMode(debugLED,OUTPUT); //debugging LED set to output
Serial.begin(9600); // start serial transmission with 9600 baud
Serial.flush(); // flush the serial port
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// start Wire and RTC
Wire.begin();
RTC.begin();
// check if RTC is running
if (! RTC.isrunning())
Serial.println("RTC is NOT running!");
pinMode(debugLED,OUTPUT); //debugging LED set to output
Serial.begin(9600); // start serial transmission with 9600 baud
Serial.flush(); // flush the serial port
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// start Wire and RTC
Wire.begin();
RTC.begin();
// check if RTC is running
if (! RTC.isrunning())
Serial.println("RTC is NOT running!");
Again the comments should be sufficient to explain the code. If there are any open questions regarding the language check the reference on the Arduino homepage.
I think that might be enough for this time. In the next part we will continue with the sketch and will start with the remote temperature sensor.