Sensor Node is compact, Arduino-compatible microcontroller and is designed for wireless sensor networks using transceiver nRF24L01+.
Model: 830068001
In the basic version (without additional sensors) module can be used as a wireless temperature sensor (using built-in sensor MCP9700, connected to A3) to control the battery charge level (via integrated voltage divider connected to A2).
Basic functionality can be greatly expanded by connecting the various components GROVE from Seeed Studio.
Also you can use the modules own making, for example, a temperature sensor based on MCP9700 (a temperature sensor similar to that installed on board Sensor Node).
By default, the standard boot stitched microcontroller Arduino, allowing to record the firmware in the module with the type of programmers FOCA v2.2.
Connecting the programmer via 5-pin (PROG) on the module (battery installed when programming is required - module receives power from the programmer)
Warning! Do not forget to set the programmer working voltage of 3.3V. When flashing the bootloader via ISP, be sure to disconnect the wireless module nRF24L01 +.
Just programmer can be used to debug (monitor port).
If you want to get even further about 2K more memory for your sketch, you can use almost any ISP-Programmer for example, Arduino ISP (regular Arduino-compatible board and a standard example of the environment Arduino) or USBtinyISP.
Connecting programmer via 6-pin connector (ISP) on the module (battery installed when programming is required - module receives power from the programmer).
In the first case, to maximize the operating time of a battery should be fitted in use nRF24L01+ power saving mechanisms:
... radio.powerUp(); //turn the power on NRF24 // sending data ... radio.powerDown(); //turn off the power on NRF24 ...
Button connected to digital pin of D4 without external pull-up resistor. This connection is necessary to use the built-in pull-up resistor microcontroller.
This is done as follows (in the example being polled button once 0.5s and if it is pressed - LED lights):
void setup (){ // button pinMode(4, INPUT); // enable pull-up resistor digitalWrite(4, HIGH); // LED pinMode(9, OUTPUT); } void loop(){ if(digitalRead(4) == LOW) { digitalWrite(9, HIGH); } else { digitalWrite(9, LOW); } delay(500); }
Besides measuring the voltage at the voltage divider with a simple analogRead (A2), you can use more "advanced" way - use the built-in capabilities of the microcontroller.
You can use the following universal function:
long readVcc() { // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(75); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA,ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high<<8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts }
The function returns the voltage in millivolts.
In the present pin connector Digital D3. The peculiarity of its use is that this digital signal to the pins of the interrupt can be processed (INT1).
To ensure longer battery module from one battery can reduce the frequency of the microcontroller to 1MHz and lower "threshold" voltage at which it will start to 1.8V.
This is done by adding the following section in the file boards.txt IDE Arduino:
s328o1.name=Sensor328p (int1MHz, 1.8V) s328o1.upload.protocol=arduino s328o1.upload.maximum_size=30720 s328o1.upload.speed=19200 s328o1.bootloader.low_fuses=0x62 s328o1.bootloader.high_fuses=0xda s328o1.bootloader.extended_fuses=0x06 s328o1.bootloader.path=atmega s328o1.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex #s328o8.bootloader.file=ATmegaBOOT_168_atmega328.hex s328o1.bootloader.unlock_bits=0x3F s328o1.bootloader.lock_bits=0x0F s328o1.build.mcu=atmega328p s328o1.build.f_cpu=1000000L s328o1.build.core=arduino s328o1.build.variant=standard
After adding this code to the appropriate file (and restarting the Arduino) in the list of available cards will be a new line: Sensor328 (int1MHz, 1.8V)
Warning! Fuse bits specified in the file boards.txt and defining modes of microcontroller sewn Arduino environment only when writing the bootloader (but not the firmware of the microcontroller).
To correct fuse bits without changing the boot loader can be used, for example avrdude GUI
To use the Sensor Node requires the following libraries:
Requires the libraries that are used at work RF24:
Software debugging and use
API
Library has used examples of them just to understand how it works.
Initialization RF-module as follows:
... //RF24 radio(CE,CSN); RF24 radio(8,7); ...
/* This sketch is for a devDuino SN v1.3 and MySensors 1.5 This sketch is a modification of code written Version 1.3 - Thomas Bowman Mørch for sensor Sensebender Micro http://www.mysensors.org/hardware/micro modified 1 December 2015 by greengo */ #include <MySensor.h> #include <SPI.h> // Define a static node address, remove if you want auto address assignment #define NODE_ADDRESS 3 // Uncomment the line below, to transmit battery voltage as a normal sensor value #define BATT_SENSOR 2 #define RELEASE "1.0" #define CHILD_ID_TEMP 1 // How many milli seconds between each measurement #define MEASURE_INTERVAL 60000 //for Debug 60 sec //#define MEASURE_INTERVAL 10000 //for Debug 10 sec // FORCE_TRANSMIT_INTERVAL, this number of times of wakeup, the sensor is forced to report all values to the controller #define FORCE_TRANSMIT_INTERVAL 30 //#define FORCE_TRANSMIT_INTERVAL 10 //for Debug //LED Blink wait blinks during data transmission. Greater battery energy consumption! #define LED_BLINK_WAIT_TRANSMIT #define TEMP_TRANSMIT_THRESHOLD 0.5 #define LED_PIN 9 // LED int TEMP_SENSE_PIN = A3; // Input pin for the Temp sensor MCP9700 float TEMP_SENSE_OFFSET = -0.01; MyTransportNRF24 transport(8, 7); MySensor gw(transport); float temp = 0; MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); #ifdef BATT_SENSOR MyMessage msgBatt(BATT_SENSOR, V_VOLTAGE); #endif // Global settings int measureCount = 0; int sendBattery = 0; boolean highfreq = true; boolean transmission_occured = false; // Storage of old measurements float lastTemperature = 0; long lastBattery = 0; // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin 9 as an output. pinMode(LED_PIN, OUTPUT); Serial.begin(115200); Serial.print(F("devDuino SNv1.3")); Serial.println(RELEASE); Serial.flush(); // digitalWrite(OTA_ENABLE, LOW); // remove pullup, save some power. digitalWrite(LED_PIN, HIGH); #ifdef NODE_ADDRESS gw.begin(NULL, NODE_ADDRESS, false); #else gw.begin(NULL,AUTO,false); #endif digitalWrite(LED_PIN, LOW); Serial.flush(); Serial.println(F(" - Online!")); gw.sendSketchInfo("devDuino SNv1.3", RELEASE); gw.present(CHILD_ID_TEMP,S_TEMP); #ifdef BATT_SENSOR gw.present(BATT_SENSOR, S_POWER); #endif sendTempMeasurements(false); sendBattLevel(false); } // the loop function runs over and over again forever void loop() { measureCount ++; sendBattery ++; bool forceTransmit = false; transmission_occured = false; if ((measureCount == 5) && highfreq) if (measureCount > FORCE_TRANSMIT_INTERVAL) { // force a transmission forceTransmit = true; measureCount = 0; } gw.process(); sendTempMeasurements(forceTransmit); if (sendBattery > 60) { sendBattLevel(forceTransmit); // Not needed to send battery info that often sendBattery = 0; } gw.sleep(MEASURE_INTERVAL); } /******************************************** * * Sends battery information (battery percentage) * * Parameters * - force : Forces transmission of a value * *******************************************/ void sendBattLevel(bool force) { if (force) lastBattery = -1; long vcc = readVcc(); if (vcc != lastBattery) { lastBattery = vcc; Serial.print("Volts: ");Serial.println(vcc); #ifdef BATT_SENSOR gw.send(msgBatt.set(vcc)); #endif // Calculate percentage vcc = vcc - 1900; // subtract 1.9V from vcc, as this is the lowest voltage we will operate at long percent = vcc / 14.0; gw.sendBatteryLevel(percent); transmission_occured = true; } } /********************************************* * * Sends temperature and humidity from Si7021 sensor * * Parameters * - force : Forces transmission of a value (even if it's the same as previous measurement) * *********************************************/ void sendTempMeasurements(bool force) { bool tx = force; float temp = readMCP9700(TEMP_SENSE_PIN,TEMP_SENSE_OFFSET); //temp pin and offset for calibration float diffTemp = abs(lastTemperature - temp); Serial.print(F("TempDiff :"));Serial.println(diffTemp); if (diffTemp > TEMP_TRANSMIT_THRESHOLD) tx = true; if (tx) { measureCount = 0; Serial.print("T: ");Serial.println(temp); // LED #ifdef LED_BLINK_WAIT_TRANSMIT digitalWrite(LED_PIN, HIGH); gw.send(msgTemp.set(temp,1)); digitalWrite(LED_PIN, LOW); #else gw.send(msgTemp.set(temp,1)); #endif lastTemperature = temp; transmission_occured = true; } } /******************************************* * * Internal TEMP sensor * *******************************************/ float readMCP9700(int pin,float offset) { analogReference(INTERNAL); analogRead(A0); //perform a dummy read to clear the adc delay(20); for (int n=0;n<5;n++) analogRead(pin); int adc=analogRead(pin); float tSensor=((adc*(1.1/1024.0))-0.5+offset)*100; float error=244e-6*(125-tSensor)*(tSensor - -40.0) + 2E-12*(tSensor - -40.0)-2.0; float temp=tSensor-error; return temp; } /******************************************* * * Internal battery ADC measuring * *******************************************/ long readVcc() { // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADcdMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA,ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high<<8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts }
Revision | Description | Release |
0.9 | Prototype | 07.06.2013 |
1.2 | Public version (Not produced) | 04.11.2013 |
1.3 | Public version | 28.03.2014 |
This product can be purchased:
China (shipping worldwide)
Seeed store
Elecrow store
Russia
Devicter store
This documentation is licensed under the Creative Commons Attribution-ShareAlike License 3.0 Source code and libraries are
licensed under GPL/LGPL, see source code files for details.
Wireless communication is a "smart home" RU
Measuring voltage microcontroller
Copyright (c) 2008-2016 Seeed Development Limited (www.seeedstudio.com / www.seeed.cc)