How Can I Add the NRF24L01 ratio to the 2-wire Temp Probe Sketch
-
Hi,
How do I add the radio sketch to this simple sketch?
#include <MySensor.h>
#include <SPI.h>// SPI Pins
#define CE_PIN 9
#define CS_PIN 10// Wait times
#define LONG_WAIT 500
#define SHORT_WAIT 50#define SKETCH_NAME "2 Wire Temp Probe"
#define SKETCH_VERSION "v0.1"// which analog pin to connect
#define ID_S_TEMP 007#define THERMISTORPIN A0
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000// Global Vars
unsigned long SLEEP_TIME = 12000; // Sleep time between reads (in milliseconds)
boolean metric = true;
long randNumber;// Instanciate MySersors Gateway
MySensor gw;#ifdef ID_S_TEMP
MyMessage msg_S_TEMP(ID_S_TEMP,V_TEMP);
#endif#ifdef ID_S_DISTANCE
MyMessage msg_S_DISTANCE(ID_S_DISTANCE,V_DISTANCE);
#endifint samples[NUMSAMPLES];
void setup(void) {
Serial.begin(9600);
analogReference(EXTERNAL);
}void loop(void) {
uint8_t i;
float average;// take N samples in a row, with a slight delay
for (i=0; i< NUMSAMPLES; i++) {
samples[i] = analogRead(THERMISTORPIN);
delay(10);
}// average all the samples out
average = 0;
for (i=0; i< NUMSAMPLES; i++) {
average += samples[i];
}
average /= NUMSAMPLES;Serial.print("Average analog reading ");
Serial.println(average);// convert the value to resistance
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
Serial.print("Thermistor resistance ");
Serial.println(average);float steinhart;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 258.95; // convert to CSerial.print("Temperature ");
Serial.print(steinhart);
Serial.println(" *C");delay(1000);
}
-
To initialize the radio and the sensor (in setup):
gw.begin(); gw.sendSketchInfo("2-Wire Temperature Sensor", "1.0"); gw.present(ID_S_TEMP, S_TEMP);//child ID 0
to send the temperature (in loop):
gw.send(msg.setSensor(ID_S_TEMP).set(temperature, 1));
to save energy use
gw.sleep(sleeptime)
instead ofdelay(sleeptime)
.How do you wire the sensors? What do you wire on the external reference pin?
-
Hi Fleinze, thanks for the help. I am using A0 for the pin and I decided to rebuild the Dallas temp sketch, I can compile it and the radio looks like it is communicating, I just can get it to register as a sensor in vera. Any ideas?
NEW Sketch
#include <MySensor.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
#define ONE_WIRE_BUS A0 // Pin where sensor is connected
#define MAX_ATTACHED_DS18B20 16
#define LONG_WAIT 500
#define SHORT_WAIT 50
#define ID_S_TEMP 97
#define THERMISTORPIN A0
#define THERMISTORNOMINAL 10000
#define TEMPERATURENOMINAL 25
#define NUMSAMPLES 5
#define BCOEFFICIENT 3950
#define SERIESRESISTOR 10000unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.MySensor gw;
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=A0;
boolean receivedConfig = false;
boolean metric = true;
// Initialize temperature message
MyMessage msg(A0,V_TEMP);int samples[NUMSAMPLES];
void setup(void) {
Serial.begin(115200);
analogReference(EXTERNAL);
// Startup up the OneWire library
sensors.begin();
// requestTemperatures() will not block current thread
sensors.setWaitForConversion(false);// Startup and initialize MySensors library. Set callback for incoming messages.
gw.begin();// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Temperature Sensor", "1.1");// Fetch the number of attached temperature sensors
numSensors = sensors.getDeviceCount();// Present all sensors to controller
for (int i=A0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
gw.present(i, S_TEMP);
}
}
void loop(void) {
// Process incoming messages (like config from server)
gw.process();
// Fetch temperatures from sensor
sensors.requestTemperatures();// query conversion time and sleep until conversion completed
int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
// sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
gw.sleep(conversionTime);uint8_t i;
float average;// take N samples in a row, with a slight delay
for (i=0; i< NUMSAMPLES; i++) {
samples[i] = analogRead(THERMISTORPIN);
delay(10);
}
// average all the samples out
average = 0;
for (i=0; i< NUMSAMPLES; i++) {
average += samples[i];
}
average /= NUMSAMPLES;Serial.print("Average analog reading ");
Serial.println(average);// convert the value to resistance
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
Serial.print("Thermistor resistance ");
Serial.println(average);float temperature;
temperature = average / THERMISTORNOMINAL; // (R/Ro)
temperature = log(temperature); // ln(R/Ro)
temperature /= BCOEFFICIENT; // 1/B * ln(R/Ro)
temperature += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
temperature = 1.0 / temperature; // Invert
temperature -= 258.95; // convert to CSerial.print("Temperature ");
Serial.print(temperature);
Serial.println(" *C");
// Send in the new temperature
gw.send(msg.setSensor(i).set(temperature,1));
// Save new temperatures for next compare
lastTemperature[i]=temperature;
// delay(1000);
gw.sleep(SLEEP_TIME);
}
send: 254-254-0-0 s=255,c=0,t=17,pt=0,l=3,sg=0,st=ok:1.5
send: 254-254-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
read: 0-0-254 s=255,c=3,t=6,pt=0,l=1,sg=0:M
read: 0-0-254 s=255,c=3,t=1,pt=0,l=10,sg=0:1442404204
sensor started, id=254, parent=0, distance=1
send: 254-254-0-0 s=255,c=3,t=11,pt=0,l=18,sg=0,st=ok:Temperature Sensor
send: 254-254-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.1
Average analog reading 706.00
Thermistor resistance 22271.30
Temperature 22.21 *C
send: 254-254-0-0 s=5,c=1,t=0,pt=7,l=5,sg=0,st=ok:22.2
Average analog reading 707.00
Thermistor resistance 22373.42
Temperature 22.12 *C
send: 254-254-0-0 s=5,c=1,t=0,pt=7,l=5,sg=0,st=ok:22.1
Average analog reading 707.20
Thermistor resistance 22393.92
Temperature 22.10 *C
send: 254-254-0-0 s=5,c=1,t=0,pt=7,l=5,sg=0,st=ok:22.1
Average analog reading 708.00
Thermistor resistance 22476.19
Temperature 22.02 *C
send: 254-254-0-0 s=5,c=1,t=0,pt=7,l=5,sg=0,st=ok:22.0
Average analog reading 709.00
Thermistor resistance 22579.62
Temperature 21.93 *CSo the value that sends is rounded 21.93C = 22 and it looks like it sent that. I just cant figure out how the vera will pick it up.
Any ideas?
-
Hi @Newzwaver!
please consider using using the code-feature of the forum, because it makes the code much more readable.
You still had a lot of code from the dallastemp-example in your code which is not needed in you case. I tried to clean it up for you, but I did#include <MySensor.h> #include <SPI.h> #define THERMISTORPIN A0 #define THERMISTORNOMINAL 10000 #define TEMPERATURENOMINAL 25 #define NUMSAMPLES 5 #define BCOEFFICIENT 3950 #define SERIESRESISTOR 10000 const unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) MySensor gw; // Initialize temperature message MyMessage msg(0,V_TEMP); int samples[NUMSAMPLES]; void setup(void) { pinMode(THERMISTORPIN, INPUT); analogReference(EXTERNAL); // Startup and initialize MySensors library. Set callback for incoming messages. gw.begin(); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Temperature Sensor", "1.1"); // Present all sensors to controller gw.present(0, S_TEMP); } void loop(void) { // Process incoming messages (like config from server) gw.process(); float average; // take N samples in a row, with a slight delay for (uint8_t i=0; i< NUMSAMPLES; i++) { samples[i] = analogRead(THERMISTORPIN); delay(10); } // average all the samples out average = 0; for (uint8_t i=0; i< NUMSAMPLES; i++) { average += samples[i]; } average /= NUMSAMPLES; Serial.print("Average analog reading "); Serial.println(average); // convert the value to resistance average = 1023 / average - 1; average = SERIESRESISTOR / average; Serial.print("Thermistor resistance "); Serial.println(average); float temperature; temperature = average / THERMISTORNOMINAL; // (R/Ro) temperature = log(temperature); // ln(R/Ro) temperature /= BCOEFFICIENT; // 1/B * ln(R/Ro) temperature += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) temperature = 1.0 / temperature; // Invert temperature -= 258.95; // convert to C Serial.print("Temperature "); Serial.print(temperature); Serial.println(" *C"); // Send in the new temperature gw.send(msg.setSensor(0).set(temperature,1)); // delay(1000); gw.sleep(SLEEP_TIME); }
The original sketch is programmed to present a number of sensors, hence the for loop before
gw.present()
. You need just one sensor so you can present it at any child-ID (i.e. child-ID 0). The way the for loop was written,gw.present()
was never executed. Also when sending the data you sent it as child-IDi
.i
was set in the last for-loop to 5.
Try this, it should work.
-
Thank you very much worked great, I have the probe in my deep freeze ... If something goes wrong I get a notification. No more spoiled food. Thank you very much, it was very well appreciated..