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
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:
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.
Datman:
Togliendo uno zero, aumenta di 10 volte la corrente assorbita. ...
e capirai ... perché è quel partitore che assorbe ...
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 ...
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).
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.
}
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.
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 ….).