Mini 3-wire Volt Meter

Buongiorno a tutti, vorrei trasferire i risultati della lettura di questo mini voltmetro (Mini 3-wire Volt Meter (0 - 99.9VDC) : ID 705 : $7.95 : Adafruit Industries, Unique & fun DIY electronics and kits) su una variabile per controllare lo stato di carica di una batteria; non sono riuscito a trovare alcuna indicazione si internet e non ho ottenuto alcunché dalle prove fatte.

Qualcuno mi saprebbe (se possibile) indirizzare su dove guardare?

Grazie + saluti

Enrico

non puoi, temo
quello è un puro voltmetro, non ha uscite che possano essere lette da qualcosa
spiega bene il problema, che magari si trova soluzione

Grazie,

quello che vorrei realizzare è un avvisatore, via HC-12, che mi segnali lo stato di carica della batteria (basterebbe quindi solo avere una soglia limite, p.es, al raggiungimento dei 4-5V) ricaricabile da 9V che alimenta un arduino (probabilmente un nano) in modo da poter ricaricarla prima che si esaurisca.
Saluti

Fai un partitore 2:1 con due resistenze da circa 100kOhm ed entri in un ingresso analogico.

Datman:
Fai un partitore 2:1 con due resistenze da circa 100kOhm ed entri in un ingresso analogico.

No Datman, l'impedenza è troppo alta ... gli ingressi analogici di Arduino vogliono una impedenza in ingresso <= 10KΩ.

Comunque basta togliere un zero :smiley: :smiley: :smiley:

Guglielmo

Togliendo uno zero, aumenta di 10 volte la corrente assorbita. Sono comunque ingressi cmos, con impedenza quasi infinita. Abbiamo parlato più volte del problema della prima lettura non precisa e della capacità di ingresso: per quest'ultima, basta abbassare l'impedenza dinamica del partitore mettendo 100nF tra l'ingresso analogico e massa, in grado di fornire tutta la corrente necessaria per caricare la piccola capacità d'ingresso. Poi, comunque, io faccio sempre una prima lettura che non uso:

analogRead(A0); valore=analogRead(A0);

Grazie, non conoscevo l'esistenza dei partitori (anche se pensavo a qualcosa del genere ma non sapevo come realizzarlo); in mancanza di ulteriori informazioni penso che utilizzerò quanto proposto seguendo l'esempio postato da Daniele Alberti.

Ancora grazie dell'aiuto.

Saluti - Enrico

Datman:
Togliendo uno zero, aumenta di 10 volte la corrente assorbita. ...

e capirai ... perché è quel partitore che assorbe ... :smiley: :smiley: :smiley:

Fai come vuoi, sappi comunque che sei fuori dalle specifiche che, chiaramente, fornisce Atmel/Microchip nel datasheet del chip ...

The ADC is optimized for analog signals with an output impedance of approximately 10 kΩ or less. If such a source is used, the sampling time will be negligible. If a source with higher impedance is used, the sampling time will depend on how long time the source needs to charge the S/H capacitor, with can vary widely. The user is recommended to only use low impedance sources with slowly varying signals, since this minimizes the required charge transfer to the S/H capacitor.

... poi, di trucchi per ovviare, se ne possono usare mille ... :slight_smile:

Guglielmo

Il condensatore in parallelo all'ingresso è uno di questi, considerando che noi stiamo misurando una tensione praticamente costante (varia con la velocità di scarica della batteria). :slight_smile:

e capirai ... perché è quel partitore che assorbe ...

L'ho scritto perché mi si è presentato il problema del partitore che rimaneva collegato quando il microcontrollore andava in sleep.

Buona sera,

Per misurare la carica della batteria ho inserito un partitore da 10+10 Kohm ho collegato il tutto, inserito la batteria al litio da 9 V 1000 mAh …. e ho visto un filo di fumo levarsi dall'arduino! Ho quindi scollegato la batteria ritornando all'alimentazione tramite presa sul PIN RAW (v. schema allegato) e tutto funziona.

Cosa può essere successo? Dove ho sbagliato?

Il programma caricato è il seguente:

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#include <DHT.h>
#include <SoftwareSerial.h>

#define LED_PIN (5)
int cicli = 0;
volatile int f_wdt = 1; //This variable is made volatile because it is changed inside an interrupt function
int PIN_ventola = 6;
// variabili batteria
const int ctr_PIN = A0; // controllo carica batteria
int ctr_btt;
int ValPinBatt;
int Vbatt;
int Vpin_perc;
float calc_res;
float R1 = 9800; //modificare questi valori con i valori di resistore realmente utilizzati.
float R2 = 10000;
String strdati;

DHT dht(7, DHT11);
SoftwareSerial HC12(4, 3); // RX, TX

// Setup for the serial comms and the other things
void setup() {
  dht.begin();
  HC12.begin(9600);
  Serial.println ("** Basato su TX_StMeto_base_01 **");
  Serial.begin(9600);
  delay(100);
  pinMode(LED_PIN, OUTPUT);
  pinMode(PIN_ventola, OUTPUT); // accende/spegne la ventola
  digitalWrite (PIN_ventola, LOW);
  setupWatchDogTimer();
  Serial.println("Initialisation complete.");
  pinMode(ctr_PIN, INPUT); // controllo batteria
  calc_res = (R1 + R2) / R2;
  delay(100);
}

// Watchdog Interrupt Service. This is executed when watchdog timed out.
ISR(WDT_vect) {

  if (f_wdt == 0) {
    // here we can implement a counter the can set the f_wdt to true if the watchdog cycle needs to run longer
    // than the maximum of eight seconds.
    f_wdt = 1;
  }
}

void enterSleep(void) {  //Enters the arduino into sleep mode.

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();

  // Now enter sleep mode.
  sleep_mode();

  // The program will continue from here after the WDT timeout First thing to do is disable sleep.
  sleep_disable();

  // Re-enable the peripherals.
  power_all_enable();
}

void setupWatchDogTimer() { // Setup the Watch Dog Timer (WDT)

  MCUSR &= ~(1 << WDRF);

  WDTCSR |= (1 << WDCE) | (1 << WDE);

  WDTCSR  = (1 << WDP3) | (0 << WDP2) | (0 << WDP1) | (1 << WDP0);

  // Enable the WD interrupt (note: no reset).
  WDTCSR |= _BV(WDIE);
}

void loop() { // main loop
  // Wait until the watchdog have triggered a wake up.
  if (f_wdt != 1) {

    return;
  }

  if (cicli == 50) {

    digitalWrite(LED_PIN, 1); // accende il LED
    
    // aziona ventola x 20 sec. ************************************************
    Serial.println ("** Parte la ventola **");
    digitalWrite (PIN_ventola, HIGH);
    delay (20000);

    // controlla carica della batteria ***********************************
    ValPinBatt = analogRead(ctr_PIN);
    Vpin_perc = map (ValPinBatt, 0, 1023, 0, 500);
    //leggerò 1023 quando ho 5 volt sul pin, quindi scalo 0-1023 in 0-500.
    Vbatt = Vpin_perc * calc_res / 100 ;
    if (Vbatt < 5) {
      ctr_btt = 1; //batteria bassa
    } else {
      ctr_btt = 2;
    }

    // legge e,trasmette i dati *************************************************
    int t = dht.readTemperature();
    int h = dht.readHumidity();
    
    // elabora la stringa da trasmettere
    strdati = ((ctr_btt * 10000) + ((t + 49) * 100) + h) ;
    delay (200);
    Serial.println(strdati);
    HC12.print(strdati);
    delay (200);

    // spegni ventola ***********************************************
    digitalWrite (PIN_ventola, LOW);
    
    // Toggle the LED off
    digitalWrite(LED_PIN, 0); // spegne il LED

    cicli = 0;
  }
  cicli ++;

  delay(100);

  Serial.println(cicli);
  
  f_wdt = 0; // clear the flag so we can run above code again after the MCU wake up

  enterSleep(); // Re-enter sleep mode.
}

Saluti a tutti e buone feste.

Enrico

TX_StMeteo_02.pdf (561 KB)

Manca una connessione dal negativo del partitore e GND.

NON PUOI alimentare un "ventilatore" DIRETTAMENTE da un pin di Arduino. A meno che non assorba meno di 30mA. E comunque hai bisogno di un diodo di protezione.

Ciao,
P.

x pgiagno:

grazie della risposta, ovviamente avevo collegato anche il partitore al GDN (svista! non mi ero accorto di averlo eliminato in fase di "pulizia" dello schema!!).

La ventola è da 5V (recuperata da vecchi computer) e sta funzionando egregiamente da diversi giorni; purtroppo non ho idea di come inserire il diodo (ritengo tra il PIN ed il positivo della stessa, ma ….).

Saluti + buone feste!!

Enrico

TX_StMeteo_02.pdf (570 KB)