Temperature sensor WITH battery monitor
- 
					
					
					
					
 Hi, I'm new to all of this arduino stuff, but I've managed to get a Serial GW and 2 tempsensors going. Now I would like to add the battery monitor to the temp sensor sketch, to monitor the 3,7V LiPo batteries. What I've done is, merged the battery sketch setup with the temp sketch setup, and also done the same with the Void sections. No errors on upload - weee! Problem is now, that I only get the Volt reading from the Node and no temperature reading anymore.  So where did I go wrong? 
 
- 
					
					
					
					
 Here's my sketch for the tempnode: // Example sketch showing how to send in OneWire temperature readings 
 #include <MySensor.h>
 #include <SPI.h>
 #include <DallasTemperature.h>
 #include <OneWire.h>#define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
 #define MAX_ATTACHED_DS18B20 16
 unsigned long SLEEP_TIME = 120000; // Sleep time between reads (in milliseconds)
 OneWire oneWire(ONE_WIRE_BUS);
 DallasTemperature sensors(&oneWire);
 MySensor gw;
 float lastTemperature[MAX_ATTACHED_DS18B20];
 int numSensors=0;
 boolean receivedConfig = false;
 boolean metric = true;
 // Initialize temperature message
 MyMessage msg(0,V_TEMP);int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point 
 int oldBatteryPcnt = 0;void setup() 
 {
 // Startup OneWire
 sensors.begin();// 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.0");// Fetch the number of attached temperature sensors 
 numSensors = sensors.getDeviceCount();// Present all sensors to controller 
 for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
 gw.present(i, S_TEMP);
 }// use the 1.1 V internal reference 
 analogReference(INTERNAL);
 }void loop() 
 {
 // Process incoming messages (like config from server)
 gw.process();// Fetch temperatures from Dallas sensors 
 sensors.requestTemperatures();// Read temperatures and send them to controller 
 for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {// Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error if (lastTemperature[i] != temperature && temperature != -127.00) { // Send in the new temperature gw.send(msg.setSensor(i).set(temperature,1)); lastTemperature[i]=temperature; }} // get the battery Voltage 
 int sensorValue = analogRead(BATTERY_SENSE_PIN);
 Serial.println(sensorValue);
 // 1M, 470K divider across battery and using internal ADC ref of 1.1V
 // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
 // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
 // 3.44/1023 = Volts per bit = 0.003363075
 float batteryV = sensorValue * 0.004106;
 int batteryPcnt = sensorValue / 10;
 Serial.print("Battery Voltage: ");
 Serial.print(batteryV);
 Serial.println(" V");
 Serial.print("Battery percent: ");
 Serial.print(batteryPcnt);
 Serial.println(" %");
 if (oldBatteryPcnt != batteryPcnt) {
 // Power up radio after sleep
 gw.sendBatteryLevel(batteryPcnt);
 oldBatteryPcnt = batteryPcnt;
 }gw.sleep(SLEEP_TIME); 
 }
 
- 
					
					
					
					
 DOH!!! Stupid me! Forgot the temp only transmits on temp change... it's working now  
 
- 
					
					
					
					
 Perhaps related to the topic. This program was used for monitoring battery level, but can not read the battery level.  mqtt="<[mysensor:MyMQTT/21/255/V_BATTERY_LEVEL:state:default]" So I tried to read, the program opanhab, but not getting value. Any ideas what went wrong. 
 
- 
					
					
					
					
 Hi 
 I know this is an old post but I try to convert this Sketch to use it with Version 2.1.and I am not sure If this can be work because I am tottaly new in Arduino and Mysenseors// Enable debug prints to serial monitor //#define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 // Example sketch showing how to send in OneWire temperature readings #include <MySensors.h> #include <SPI.h> #include <DallasTemperature.h> #include <OneWire.h> #define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 unsigned long SLEEP_TIME = 300000; // Sleep time between reads (in milliseconds) OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); //MySensors gw; float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; boolean receivedConfig = false; boolean metric = true; // Initialize temperature message MyMessage msg(0,V_TEMP); int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point int oldBatteryPcnt = 0; void setup() { // Startup OneWire sensors.begin(); // Send the sketch version information to the gateway and Controller sendSketchInfo("Temperature Sensor", "1.0"); // Fetch the number of attached temperature sensors numSensors = sensors.getDeviceCount(); // Present all sensors to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { present(i, S_TEMP); } // use the 1.1 V internal reference analogReference(INTERNAL); } void loop() { // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // Read temperatures and send them to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error if (lastTemperature[i] != temperature && temperature != -127.00) { // Send in the new temperature send(msg.setSensor(i).set(temperature,1)); lastTemperature[i]=temperature; } } // get the battery Voltage int sensorValue = analogRead(BATTERY_SENSE_PIN); Serial.println(sensorValue); // 1M, 470K divider across battery and using internal ADC ref of 1.1V // Sense point is bypassed with 0.1 uF cap to reduce noise at that point // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts // 3.44/1023 = Volts per bit = 0.003363075 float batteryV = sensorValue * 0.004106; int batteryPcnt = sensorValue / 10; Serial.print("Battery Voltage: "); Serial.print(batteryV); Serial.println(" V"); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); if (oldBatteryPcnt != batteryPcnt) { // Power up radio after sleep sendBatteryLevel(batteryPcnt); oldBatteryPcnt = batteryPcnt; } sleep(SLEEP_TIME); }Would be great If someone confirm Ifthis is correct so far... Many thanks Markus 
 
- 
					
					
					
					
 @Markus. I would say: give it a go. It looks fine at first instance. It's rather hard to say it's correct without running it through a compiler. For readability's sake I would advice you to look at the coding guidelines for reference. 
 
- 
					
					
					
					
 Its working so far.:-) But the battery voltage is only available as serial print. How must i change the file to get also the voltage send to the gateway? Simply by adding the send command before the sleep? Thx M. 
 
- 
					
					
					
					
 @Markus. You need to send the voltage explicit with a V_VOLTAGE (S_MULTIMETER) message. 
 
- 
					
					
					
					
 @AWI Hope you can give me an example because it seems that the requiered programming Level currently are over my Knowledge  THX 
 Markus
 
- 
					
					
					
					
 Anyone here an idea how i can get the voltage send tomthe gateway? Works great so far except the send of the voltage ....:-( 
 
 
			
		 
					
				
