Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. Voltage Sensors wrong and no Onewire

Voltage Sensors wrong and no Onewire

Scheduled Pinned Locked Moved Troubleshooting
1 Posts 1 Posters 161 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • MasMatM Offline
    MasMatM Offline
    MasMat
    wrote on last edited by MasMat
    #1

    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 V

    My 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?

    1. why do the voltages read wrong? Why do the values come out negative (see the "-" in the voltMilli calculation)?
    2. why do the ds18b20's not show up?
    3. how do I get the values from the for-loop to play with? The "float voltage_array[k] = (voltMilli / 1000)" causes errors
    1 Reply Last reply
    0

    Hello! It looks like you're interested in this conversation, but you don't have an account yet.

    Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

    With your input, this post could be even better 💗

    Register Login
    Reply
    • Reply as topic
    Log in to reply
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes


    67

    Online

    12.0k

    Users

    11.2k

    Topics

    113.4k

    Posts


    Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
    • Login

    • Don't have an account? Register

    • Login or register to search.
    • First post
      Last post
    0
    • MySensors
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular