Voltage Sensors wrong and no Onewire
-
Hi,
I need more eyes and help with code on this.
I have a solar battery (6S Li-ion, Nissan Leaf cells) and I want to monitor voltages, temps and (later) control a safety relay/contactor. The Arduino (3.3v pro mini is powered by a adjustable step down converter set to 3.65V -- just couldnt get 3.3V no matter how closely I turned the knob).
The voltages come out wrong (1M+100kOhm dividers) - even with a multiplier to even it out. The DS18B20's dont register at all (with simple example sketches they read fine!).Measured at battery and at voltage divider:
4,01 - 0,353
8,02 - 0,715
12,03 - 1,064
16,05 - 1,419
20,05 - 1,775
24,06V - 2,15 VMy code
#define MY_DEBUG // Enable debug prints to serial monitor #define MY_RADIO_RF24 // Enable and select radio type attached #define MY_NODE_ID 22 #define voltagePin1 19 //A5 -- 1S #define voltagePin2 18 #define voltagePin3 17 #define voltagePin4 16 #define voltagePin5 15 #define voltagePin6 14 //A0 -- 6S #define RELAY1 5 #define RELAY2 6 #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 2 #include <MySensors.h> #include <OneWire.h> #include <DallasTemperature.h> int voltSenseMax = 40150; // * Voltage divider R1 1 megaohm R2 100 kilohms -- 3.65V VCC int sampleCount = 0; int sum = 0; // sum of samples taken int numSamples = 5; int voltMilli; float voltage_array[6] = { 0, 0, 0, 0, 0, 0,}; 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. float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; DeviceAddress tempDeviceAddress; bool receivedConfig = false; bool metric = true; MyMessage msg_S_MULTIMETER(0, V_VOLTAGE); MyMessage msg(0,V_TEMP); void setup() { sensors.begin(); delay(10); for (int j=14; j<20; j++) { pinMode(j, INPUT); } pinMode(RELAY1, OUTPUT); digitalWrite(RELAY1, HIGH); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY2, LOW); } void presentation() { sendSketchInfo("Solar Battery Monitor", "v05092020"); // Send the sketch version information to the gateway and Controller for (int j=14; j<20; j++) { present(j, S_MULTIMETER); } present(RELAY1, S_BINARY, "Cutoff Relay1"); present(RELAY2, S_BINARY, "Cutoff Relay2"); numSensors = sensors.getDeviceCount(); Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(numSensors, DEC); Serial.println(" devices."); for (int i=0; i<numSensors; i++) { present(i, S_TEMP); } } void loop() { // TEMPERATURES sensors.requestTemperatures(); for (int i=0; i<numSensors; i++) { if(sensors.getAddress(tempDeviceAddress, i)){ Serial.print("Temperature for device: "); Serial.println(i,DEC); float tempC = sensors.getTempC(tempDeviceAddress); Serial.print("Temp C: "); Serial.println(tempC); send(msg.setSensor(i).set(tempC,1)); } } // VOLTAGES for (int k=0; k<6; k++) { while (sampleCount < numSamples) { sum += analogRead(k+14); sampleCount++; delay(5); } int voltMilli = -(map((sum / numSamples),0,1023,0,voltSenseMax))*1.5988; // map the reading and get the result in millivolts send(msg_S_MULTIMETER.setSensor(k+14).set((voltMilli / 1000.0), 2)); // Divide by 1000 to convert back to volts to two decimal places, send data to controller. // send voltage message to gateway with 1 decimal place Serial.print(voltMilli / 1000.0); Serial.println(" V"); // float voltage_array[k] = (voltMilli / 1000); sampleCount = 0; sum = 0; delay(5000); } delay(15000); } void receive(const MyMessage &message) { if (message.type==V_STATUS) { digitalWrite(message.sensor, message.getBool()); saveState(message.sensor, message.getBool()); Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }
I would also like to get the voltages as values to play with in the code (to monitor high and low voltages) but I cant make "voltage_array" work. Can someone with more arduino-code powers help here?
- why do the voltages read wrong? Why do the values come out negative (see the "-" in the voltMilli calculation)?
- why do the ds18b20's not show up?
- how do I get the values from the for-loop to play with? The "float voltage_array[k] = (voltMilli / 1000)" causes errors