Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Cargador inteligente para baterías recargables NiMH de 9V V1

Componentes y suministros

Arduino UNO
× 1
SparkFun I2C DAC Breakout - MCP4725
× 1
Regulador lineal con salida ajustable
× 1
Amplificador operacional doble de uso general de Texas Instruments
× 1
Resistencia de 6,8 k ohmios
× 2
Resistencia de 3,3 k ohmios
× 1
Resistencia de 5,1 k ohmios
× 1
Resistencia 1k ohm
× 1
Resistencia de 10 ohmios
× 1
Retransmisión (genérico)
× 1
Resistencia de 20 k ohmios
× 1
Fuente de alimentación SparkFun Breadboard 5V / 3.3V
× 1
Fuente de alimentación 17V
× 1
YwRobot I2C SERIAL LCD 1602 MODULE
× 1

Acerca de este proyecto

Busqué un cargador inteligente que puede cargar una batería NiMH de 9 V en un par de horas y no encontré ninguno. Además, todos los cargadores que encontré eran realmente "tontos". Se desconoce la corriente de carga y no hay función para finalizar la carga después de que la batería esté completamente cargada. Problema con tales cargadores que pueden sobrecargar la batería y reducir significativamente la vida útil. Así que decidí crear un cargador "inteligente".

La primera versión que intento mantener simple, por lo que permite cosas básicas como cargar con corriente constante, terminación de carga automática después de que la batería está completamente cargada, carga lenta, medición de la carga transferida a la batería.

En la próxima versión, agregaré un par de funciones útiles adicionales como descarga, medición de capacidad y ciclos.

Advertencia:La carga de la batería con alta corriente puede provocar una explosión o un incendio. No deje el cargador desatendido. Además, no intente cargar la batería que no esté destinada a cargarse como alcalina. Este cargador se probó solo con baterías de NiMH (y aún lo está usando bajo su propio riesgo y no tengo ninguna responsabilidad en absoluto si se produce algún daño debido a errores en el diseño o el código). El disgusto de otros tipos de baterías requerirá una modificación del código.

Teoría

Algunos datos útiles para recordar que ayudarán a comprender los parámetros necesarios del cargador.

C - corriente igual a la capacidad nominal de la batería

Cuando se carga a la tasa C, el voltaje de celda única puede alcanzar 1.6V. Este voltaje puede ser mayor para las baterías viejas.

El voltaje nominal de una sola celda es de 1,2 V, pero la celda completamente cargada tiene un voltaje de circuito abierto de hasta 1,5 voltios.

Se recomienda una velocidad de carga lenta de menos de 0,025 C (C / 40) después de que la batería esté completamente cargada.

Generalmente hay dos opciones para cargar la batería de NiMH:

1. Carga rápida. Corriente de carga 0.5C-1C. El estado de carga debe ser monitoreado y terminado por dV / dt (tasa de cambio de voltaje) o dT / dt (tasa de cambio de temperatura)

2. Carga lenta. Corriente de carga 0.1C. Tiempo de carga 14-16 horas. Terminación de cargo por temporizador. Terminación de carga dT / dt imposible para corrientes bajas. La terminación dV / dt puede no ser confiable para corrientes por debajo de 0.5C según la literatura.

Parámetros básicos del circuito de carga

La batería de 9V generalmente tiene 7 ventas conectadas en serie, pero en algunos casos puede tener 6 u 8 celdas. El regulador de voltaje debe poder proporcionar voltaje de carga al menos hasta 8 * 1.6 =12.8V. Voltaje de caída del regulador LM317 hasta 2 V, por lo que el voltaje de suministro debe ser ~ 15 V (esto sin tener en cuenta la caída de voltaje en la resistencia de detección de corriente).

Para una corriente de carga máxima de 200 mA y una resistencia de detección de corriente de 10 ohmios, la caída adicional en la resistencia de detección de corriente es de 2 V, por lo que se necesita un voltaje de suministro de 17 V.

La celda completamente descargada puede tener un voltaje muy bajo, incluso negativo. El voltaje mínimo del regulador idealmente debería ser 0, pero usando LM317 puede ser tan bajo como 1.2V.

Circuito

Explicaciones del circuito

La idea básica es medir la corriente de carga y ajustar el voltaje del regulador hasta que se alcance la corriente deseada. Corriente medida midiendo la caída de voltaje en la resistencia de detección de corriente R5. I =V / R.

SparkFun I2C DAC Breakout - MCP4725 - Convertidor digital a analógico de 12 bits utilizado para controlar el voltaje. La leva de voltaje de salida se configura a través de I2C entre 0 y 5V. Porque necesitamos poder ajustar el voltaje en un rango más amplio, de 0 a 15 V, el amplificador operacional LM358 se usa para amplificar el voltaje de salida del DAC. Amplificación del amplificador operacional establecido por las resistencias R4 y R3. Ganancia =1 + R4 / R3 =1 + 6800/3300 =3,06, por lo que el voltaje de salida del amplificador operacional es aproximadamente de 0 a 15 V.

La corriente de salida máxima de LM358 es 50 mA, por lo que el regulador de voltaje ajustable LM317 se usa para controlar una corriente más alta. Salida del amplificador operacional conectado al terminal ADJ de LM317. El LM317 mantendrá 1,2 V entre los terminales ADJ y OUT, por lo que el voltaje real de la batería se puede configurar entre 1,2 y 16,2 V. El LM317 necesita una corriente mínima de 3,5 mA para mantener la regulación. Por lo tanto, la resistencia R6 de 1kOhm se usa para garantizar la regulación si la batería no está conectada. Condensador C1 utilizado para filtrar el voltaje de salida y mejorar la estabilidad del LM317.

Voltaje medido en dos puntos diferentes.

1. Resistencia R5 conectada al pin A2 de Arduino. Voltaje en la resistencia medido y la corriente de carga calculada como Icharging =V / R

2. El voltaje de la batería puede ser de hasta 16,2 V, por lo que el divisor resistivo R1, R2 solía llevar el voltaje por debajo de 5 V, permitido por Arduino. Salida de divisor conectado al pin A0 de Arduino. Para R1 =5.1k Ohm y R2 =20kOhm Vout =Vin / (20000 + 5100) * 5100 =0.2 Entonces, voltaje de la batería dividido por 5.

Relé utilizado para desconectar la batería del circuito de carga. Puede ver en el relé de foto que usé, pero generalmente se puede usar cualquier relé con control de 5V. Es más seguro conectar la batería a los contactos normalmente abiertos del relé.

Utilicé YwRobot I2C SERIAL LCD 1602 MODULE para mostrar el estado del cargador, pero se puede usar cualquier otro módulo LCD controlado por I2C. Parece que el módulo LCD de YwRobot no es compatible con la biblioteca LiquidCrystal_I2C estándar, así que utilicé la biblioteca New LiquidCrystal. Si está utilizando un módulo LCD diferente, deberá cambiar esta línea:

  LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVO); // establece la dirección LCD en 0x27 para una pantalla de 16 caracteres y 2 líneas  

Para alimentar el convertidor digital a analógico y la pantalla LCD, utilicé la fuente de alimentación SparkFun Breadboard 5V / 3.3V. Probablemente esté bien usar 5V de la placa Arduino.

También deberá suministrar 17 V al circuito de carga. Si no tiene fuente de alimentación, puede usar un convertidor CC / CC ajustable como este

http://www.ebay.com/itm/DC-DC-Adjustable-Step-up-boost-Power-Converter-Module-XL6009-Replace-LM2577-/310717070508

Funcionalidad

No quería muchos cables, por lo que no hay botones para configurar la carga. Corriente de disgusto configurada solo en código. Debe configurar la corriente de carga deseada en charger.ino

  // *************************** Parámetros de carga ************* **************************** // ******************** *********************************************** ******************* flotante target_current_mA =30; // Corriente de carga mAfloat battery_nominal_capacity_mA =170; // Capacidad nominal de la batería mAfloat max_time_for_trickle_charge =6; // Tiempo máximo de carga lenta en minutos // ************************************* *********************************************** / / ********************************************** ***************************************  

target_current_mA - corriente de carga constante

max_time_for_trickle_charge:número máximo de minutos para la carga lenta, se puede configurar hasta 600 (10 h)

battery_nominal_capacity_mA - capacidad de la batería utilizada para calcular la corriente de goteo

Generalmente, la corriente de carga puede alcanzar la capacidad nominal. Para baterías con capacidad nominal de 170 mAh, la corriente de carga máxima es de 170 mA. La corriente de carga mínima suele ser C / 10 - 17 mA para una batería de 170 mAh.

Una vez finalizada la alimentación, el cargador comprobará si la batería está conectada. Si la batería está conectada, la batería se cargará con corriente constante configurada hasta que esté completamente cargada. La carga finalizó detectando dV / dt negativo durante 5 minutos. Después de completar la carga, el cargador cambiará a carga lenta con corriente C / 40. El cargador se desconectará de la batería una vez transcurrido el tiempo máximo de carga lenta.

1 - dV / dt

2 - tiempo de carga en minutos

1 - Tiempo de carga

2 - Carga transferida a la batería

Información adicional sobre las baterías de NiMH:

1. http://data.energizer.com/PDFs/nickelmetalhydride_appman.pdf

2. http://batteryuniversity.com/learn/article/charging_nickel_metal_hydride

Código

  • charger.ino
  • main.ino
  • hw.ino
  • lcd.ino
  • calculations.ino
  • Nueva biblioteca LiquidCrystal utilizada para este proyecto
charger.ino Arduino
Archivo principal
 // Esto es para cargar batería NiMH de 9V // La batería puede tener 6,7 u 8 celdas de 1.25V // Esto hace que el voltaje nominal entre 7.5 y 10V # incluya  #include  #include  #include  #include  LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVO); // establecer la dirección de LCD en 0x27 para una pantalla de 16 caracteres y 2 líneas // Defensas de hardware # definir MCP4725_ADDR 0x60 // Dirección DAC # definir DAC_REF_VOLTAGE 5.0 # definir CHARGE_RELAY_PIN 2 # definir DISCONNECT_CHARGE_RELAY HIGH # definir CONNECT_CHARGE_RELAY_SISTOW # definir A2 CURRENT_SENSING_SESISTOR 10.2 // OHm # define BATTERY_VOLTAGE_PIN A0 # define R1 5090 // Resistencia del lado bajo del divisor de detección de voltaje # define R2 19910 // Resistencia del lado alto del divisor de detección de voltaje # define ADC_REF_VOLTAGE 4.89 // Voltaje de suministro real de Arduino o voltaje AREF para el correcto ADC a traducción de voltaje # definir R3 3300.0 # definir R4 6800.0 # definir AMP_GAIN (1 + R4 / R3) // Varias definiciones // # definir MINIMUM_VOLTAGE 8.1 // Voltaje mínimo después del regulador # definir BATTERY_GOOD_VOLTAGE_THRESHOLD 7.0 # definir MAXIMIM_ALLOWED_CURRENT 200 // Máximo permitido corriente de la batería mA (corte duro) #define MAXIMUM_BATTERY_VOLTAGE 15.0 // Voltaje máximo permitido de la batería V (corte duro) #define VOLTAGE_STEP 0.001 // Paso para voltaje regulación # define POINTS_FOR_AVERAGING 100 // Cuántos puntos tomados para promediar # define MEASURE2MEASURE_US 5000 // Tiempo entre mediciones en microsegundos (necesita ser más de 200 debido a dos lecturas analógicas) #define VOLTAGE_LOG_TIME_MIN 30.0 // Tiempo en minutos para ahorrar voltaje para dV / dt de corte # define MINUTES_TO_LOG 5 # define TRICKLE_CURRENT_RATIO 40 // cargador Unidos # definen INICIALIZACIÓN 0 # definir NO_BATTERY 5 # define BATTERY_CONNECTED 10 # define BATTERY_VOLTAGE_LOW 15 # define CURRENT_RAMP_UP 20 # define CARGA 30 # define CURRENT_RAMP_DOWN 32 # define TRICKLE 35 # define END_OF_TRICKLE 37 # define UNEXPECTED_CURRENT_FALL 40 # define UNABLE_TO_REACH_CURRENT 60 # define FULLY_CHARGED 70 # define CURRENT_TOO_HIGH 80 # define REGULATION_FAILED 90 # define OVERCURRENT 100 # define OVERVOLTAGE 101 # define FINAL_STATEVERAG_CURRENT_INFORMA_de_información_inferior; // Para promediar int sin signo largo voltaje_sum, suma_corriente; // Suma de promediarf loat regulator_voltage_code, resistor_voltage, csr_voltage_code, regulator_voltage, current_mA, battery_voltage; // Measurmentsfloat tmp_resistor_voltage, tmp_current_mA, tmp_regulator_voltage, tmp_battery_voltage; int i, j, string_state_last_voltage, lcdtrcd, lcd, ltl, ltl, lt; lcd, lcd, ltl, ltl, ltimo, lcd; String msg, eoc_line1, eoc_line2; unsigned char sec_index, min_index; // long long int charge_started; float sec_log [60], min_log [MINUTES_TO_LOG], last_blf; float trickle_current_mA; int total_minutes_average =0; elapsedTimeMillis ChargingTime 0; float last_dac_voltage =0; // Messagesconst char msg_battery_detected [] PROGMEM ="Batería detectada"; const char msg_no_battery [] PROGMEM ="Sin batería"; const char msg_battery_ok [] PROGMEM ="Batería ok"; const char msglow_voltage_too_battery PROGMEM ="Voltaje de la batería demasiado bajo"; const char msg_voltage_too_low_short [] PROGMEM ="V Batería baja"; const char msg_ramp_up [] PROGM EM ="Ramp up"; const char msg_charging [] PROGMEM ="Charging"; const char msg_space [] PROGMEM =""; const char msg_ramp_down [] PROGMEM ="Ramp down"; const char msg_trickle_charge [] PROGMEM ="Carga lenta "; const char msg_no_current [] PROGMEM =" Sin corriente "; const char msg_current_unreachable [] PROGMEM =" I unreachable "; const char msg_current_unreachable_long [] PROGMEM =" No se puede alcanzar la corriente deseada "; const char msg_completed =" Completado PROGMEM "; const char msg_charge [] PROGMEM =" Carga "; const char msg_high_current [] PROGMEM =" Corriente alta "; const char msg_regulation_fault [] PROGMEM =" Fallo de regulación "; const char msg_overcurrent [] PROGMEM =" Corriente demasiado alta "; const char msg_overvoltage [] PROGMEM ="Voltaje demasiado alto"; const char msg_trickle_completed [] PROGMEM ="Goteo terminado"; // ********************** **** Parámetros de carga *************************************** // * *********************************************** ************************************* flotar target_current_mA =30; // Corriente de carga mAfloat battery_nominal_capacity_mA =170; // Capacidad nominal de la batería mAfloat max_time_for_trickle_charge =6; // Tiempo máximo de carga lenta en minutos // ************************************* *********************************************** / / ********************************************** *************************************** struct mytime {unsigned char hours; actas de caracteres sin firmar; unsigned int total_minutes;} transcurrido_time; void setup () {pinMode (CHARGE_RELAY_PIN, OUTPUT); desconectar_circuito_de_carga (); // Desconecte el cargador de la batería Wire.begin (); // I2C dac_write_voltage (0); // Asegúrese de que el conjunto de corriente sea más bajo posible Serial.begin (115200); último_segundo =segundo (); lcd_last_second =segundo (); log_last_second =segundo (); Timer1.initialize (MEASURE2MEASURE_US); // Se utilizará para medir el voltaje y la corriente de la batería (microsegundos) Timer1.attachInterrupt (read_hw); // adjunta read_hw () como una interrupción de desbordamiento del temporizador averaging_index =0; sec_index =0; índice_mín =0; charger_state =0; // Estado inicial de la máquina de estado want_dac_voltage =0; // Hacer que el voltaje mínimo salga last_blf =1.0; goteo_corriente_mA =batería_nominal_capacity_mA / TRICKLE_CURRENT_RATIO; // ChargingTimeMillis =0; // LCD lcd.begin (16,2); LCD luz de fondo(); lcd.clear (); update_lcd (F ("Encendido ..."), cadena_vacia); delay (1000);} float log_battery_voltage () {// Registrar solo una vez por segundo if (log_last_second ==second ()) return last_blf; más log_last_second =segundo (); sec_log [sec_index] =voltaje_batería; si (sec_index <59) {sec_index ++; } else {// Si se registra un minuto // Calcula el promedio por minuto if (min_index> =MINUTES_TO_LOG) min_index =0; sec_index =0; flotante sum_v =0; para (i =0; i <60; i ++) {sum_v + =sec_log [i]; } float min_average =sum_v / 60.0; para (i =1; i  
main.ino Arduino
 bucle vacío () {String msg1; switch (charger_state) {case INICIALIZACIÓN:// Estado inicial desconectar_circuito_de_carga (); // Hacer que el relé shure esté desconectado dac_write_voltage (0); // Asegurarse de que el conjunto de corriente más bajo posible deseado_dac_voltage =0; // Hacer un retardo de salida de voltaje mínimo (100); read_status (); if (battery_voltage> 0.1) {charger_state =BATTERY_CONNECTED; // Batería detectada update_lcd (M2S (msg_battery_detected), empty_string); Serial.println (M2S (msg_battery_detected)); retraso (2000); } else {// Sin batería Serial.println (M2S (msg_no_battery)); update_lcd (M2S (msg_no_battery), construct_status_string ()); charger_state =NO_BATTERY; // Retardo de batería detectado (1000); } descanso; case NO_BATTERY:// Sin batería read_status (); if (battery_voltage> 0.1) {charger_state =BATTERY_CONNECTED; // Batería detectada Serial.println (M2S (msg_battery_detected)); update_lcd (M2S (msg_battery_detected), construct_status_string ()); retraso (1500); } else {// Si ninguna batería permanece en este estado update_lcd (M2S (msg_no_battery), construct_status_string ()); retraso (1100); } descanso; case BATTERY_CONNECTED:// Batería conectada dac_write_voltage (0); // Asegúrese de que el conjunto de corriente más bajo posible deseado_dac_voltage =0; retraso (100); read_status (); if (battery_voltage> BATTERY_GOOD_VOLTAGE_THRESHOLD) {charger_state =CURRENT_RAMP_UP; // Iniciar carga actual rampup // snprintf (welcome, sizeof (welcome), "Firmware:V% d.% d% d", ver, ver2, ver3); update_lcd (M2S (msg_battery_ok), construct_status_string ()); Serial.println (M2S (msg_battery_ok)); retraso (2000); want_dac_voltage =get_approximated_dac_voltage (battery_voltage); // Establecer el voltaje del regulador necesario //Serial.println(get_approximated_dac_voltage(battery_voltage)); connect_charging_circuit (); retraso (200); } else {charger_state =BATTERY_VOLTAGE_LOW; // Voltaje de la batería demasiado bajo Serial.println (M2S (msg_voltage_too_low)); update_lcd (M2S (msg_voltage_too_low_short), construct_status_string ()); retraso (1000); } descanso; case BATTERY_VOLTAGE_LOW:// Voltaje de la batería demasiado bajo update_lcd (M2S (msg_voltage_too_low_short), construct_status_string ()); Serial.println (M2S (msg_voltage_too_low)); charger_state =FINAL_STATE; // Detener la pausa; case CURRENT_RAMP_UP:/// Current rampup // if (current_mA <1.0) charger_state =40; // La corriente cayó inesperadamente read_status (); update_lcd (M2S (msg_ramp_up), construct_status_string ()); retraso (50); if (current_mA  MAXIMUM_BATTERY_VOLTAGE) charger_state =OVERVOLTAGE; // Sobretensión if (abs (current_mA-target_current_mA)> 0.2) {// Si la corriente se desvía del objetivo  0.01) quería_dac_voltaje =quería_dac_voltaje-VOLTAGE_STEP; else charger_state =CURRENT_TOO_HIGH; // Corriente demasiado alta, no se puede bajar}} if (abs (current_mA-target_current_mA)> 5) {// Error de regulación, diferencia demasiado alta charger_state =REGULATION_FAILED; // Error de regulación, diferencia demasiado alta} dac_write_voltage (voltaje_de_dac_de_seado); if (total_minutes_average  goteo_corriente_mA) {if (deseado_dac_voltaje> VOLTAGE_STEP) {deseado_dac_voltage =deseado_dac_voltage-VOLTAGE_STEP; dac_write_voltage (deseado_dac_voltage); } else charger_state =CURRENT_TOO_HIGH; // No se puede reducir la corriente a la tasa de goteo} else {charger_state =TRICKLE; // Cargando TrickleChargingTimeMillis =0; Serial.println (M2S (msg_trickle_charge)); } descanso; case TRICKLE:// Retardo de carga (200); read_status (); if (current_mA <0.2) charger_state =UNEXPECTED_CURRENT_FALL; // La corriente cayó inesperadamente if (battery_voltage> MAXIMUM_BATTERY_VOLTAGE) charger_state =OVERVOLTAGE; // Sobretensión if (abs (current_mA-trickle_current_mA)> 0.2_mA  0.01) quería_dac_voltaje =quería_dac_voltaje-VOLTAGE_STEP; else charger_state =CURRENT_TOO_HIGH; // Corriente demasiado alta, no se puede bajar}} if (abs (current_mA-trickle_current_mA)> 5) {// Error de regulación, diferencia demasiado alta charger_state =REGULATION_FAILED; // Error de regulación, diferencia demasiado alta} dac_write_voltage (voltaje_de_dac_de_seado); // if (total_minutes_average  max_time_for_trickle_charge) {// Carga de goteo máxima permitida update_lcd (eoc_line1, eoc_line2); cargador_state =END_OF_TRICKLE; // Detener desconectar_cargar_circuito (); // Desconecte el cargador de la batería} break; caso END_OF_TRICKLE:if ((segundo ()% 8) <4) update_lcd (M2S (msg_trickle_completed), construct_status_string ()); else update_lcd (eoc_line1, eoc_line2); descanso; case UNEXPECTED_CURRENT_FALL:// La corriente cayó inesperadamente Serial.println (F ("La corriente cayó inesperadamente")); desconectar_circuito_de_carga (); querido_dac_voltaje =0; update_lcd (M2S (msg_no_current), construct_status_string ()); charger_state =FINAL_STATE; // Detener el retraso (1000); descanso; case UNABLE_TO_REACH_CURRENT:// No se puede alcanzar el Serial.println actual deseado (M2S (msg_current_unreachable_long)); desconectar_circuito_de_carga (); querido_dac_voltaje =0; dac_write_voltage (deseado_dac_voltage); retraso (1000); update_lcd (M2S (msg_current_unreachable), construct_status_string ()); charger_state =FINAL_STATE; // Detener la pausa; case FULLY_CHARGED:// Tiempo transcurrido completamente cargado =mills2time (ChargingTimeMillis); int charge_mAh; charge_mAh =calcular_carga (ChargingTimeMillis); msg =Cadena (M2S (msg_completed) + M2S (msg_space) + construct_time_string (elapsed_time)); msg1 =Cadena (M2S (msg_carga) + M2S (msg_space) + Cadena (carga_mAh) + Cadena ("mAh")); eoc_line1 =msg; eoc_line2 =msg1; update_lcd (msg, msg1); Serial.println (msg); // desconectar_circuito_de_carga (); // Voltaje_dac_de_seado =0; // dac_write_voltage (quería_dac_voltage); retraso (3000); charger_state =CURRENT_RAMP_DOWN; // Detener la pausa; case CURRENT_TOO_HIGH:// Corriente demasiado alta Serial.println (F ("No se puede reducir la corriente al objetivo")); desconectar_circuito_de_carga (); querido_dac_voltaje =0; dac_write_voltage (0); update_lcd (M2S (msg_high_current), construct_status_string ()); retraso (1000); charger_state =FINAL_STATE; // Detener la pausa; case REGULATION_FAILED:// Error de regulación Serial.println (M2S (msg_regulation_fault)); desconectar_circuito_de_carga (); querido_dac_voltaje =0; dac_write_voltage (0); update_lcd (M2S (msg_regulation_fault), construct_status_string ()); retraso (1000); charger_state =FINAL_STATE; // Detener la pausa; case OVERCURRENT:// Sobrecorriente desconexión_carga_circuito (); Serial.println (M2S (msg_overcurrent)); querido_dac_voltaje =0; dac_write_voltage (deseado_dac_voltage); update_lcd (M2S (msg_overcurrent), construct_status_string ()); retraso (1000); charger_state =FINAL_STATE; // Detener la pausa; case OVERVOLTAGE:// Sobretensión desconectar_circuito_de_carga (); Serial.println (M2S (msg_overvoltage)); querido_dac_voltaje =0; dac_write_voltage (deseado_dac_voltage); update_lcd (M2S (msg_overvoltage), construct_status_string ()); retraso (1000); charger_state =FINAL_STATE; // Detener la pausa; case FINAL_STATE:// Detener retraso (10000); descanso; predeterminado:quería_dac_voltaje =0; estado_cargador =0; } //Serial.println(current_mA); //Serial.print("Current="); //Serial.print(current_mA); //Serial.println("mA "); //Serial.print("DAC voltage "); //Serial.println(dac_voltage); //Serial.print("Wanted DAC voltage "); //Serial.println(wanted_dac_voltage); //Serial.print(current_mA); //Serial.print (""); //Serial.print(dac_voltage); //Serial.print (""); read_status (); if (last_second! =second ()) {Serial.print (current_mA); Serial.print (","); //Serial.print(resistor_voltage); //Serial.print (","); //Serial.print(dac_voltage); //Serial.print (","); //Serial.print(regulator_voltage); //Serial.print (","); Serial.println (batería_voltaje); último_segundo =segundo (); }} 
hw.ino Arduino
 float get_approximated_dac_voltage (float vbat) {// float offset_voltage =1.2 / R3 * (R3 + R4); float offset_voltage =1.2; flotador adc_voltage =(vbat-offset_voltage) /AMP_GAIN-0.5; if (adc_voltage <0) adc_voltage =0; return adc_voltage;} int voltage_to_code (voltaje de flotación) {int code =4095.0 / DAC_REF_VOLTAGE * voltage; código de retorno;} void dac_write (código int) {Wire.beginTransmission (MCP4725_ADDR); Wire.write (64); // cmd para actualizar el DAC Wire.write (código>> 4); // los 8 bits más significativos ... Wire.write ((código &15) <<4); // los 4 bits menos significativos ... Wire.endTransmission ();} void read_status () {voltage_sum =0; suma_actual =0; para (i =0; i  =PUNTOS_PARA_PROMEDIAR) índice_promedio =0; if (tmp_battery_voltage> MAXIMUM_BATTERY_VOLTAGE) {desconectar_circuito_de_carga (); // Desconecte el cargador de la batería charger_state =OVERVOLTAGE; } if (tmp_current_mA> MAXIMIM_ALLOWED_CURRENT) {desconectar_circuito_de_carga (); // Desconecte el cargador de la batería charger_state =OVERCURRENT; }} vacío desconectar_circuito_de_carga () {digitalWrite (CHARGE_RELAY_PIN, DISCONNECT_CHARGE_RELAY); // Desconecte el cargador de la batería} void connect_charging_circuit () {digitalWrite (CHARGE_RELAY_PIN, CONNECT_CHARGE_RELAY); // Conectar el cargador a la batería} // sec_index =0; // min_index =0; 
lcd.ino Arduino
 void update_lcd (String first_line, String second_line) {//Serial.print("update_lcd "); //Serial.print(lcd_last_string2); //Serial.print (""); //Serial.println(second_line); if (lcd_last_string1! =first_line) {lcd.clear (); lcd.setCursor (0,0); lcd.print (primera_línea); lcd_last_string1 =primera_línea; lcd.setCursor (0,1); lcd.print (segunda_línea); lcd_last_string2 =second_line; } if (lcd_last_second! =second ()) {if (lcd_last_string2! =second_line) {lcd.setCursor (0,1); lcd.print (segunda_línea); lcd_last_string2 =second_line; }} lcd_last_second =second ();} String construct_status_string (void) {String v, i; if (voltaje_batería <10) v =String (voltaje_batería, 2); else v=String(battery_voltage, 1); if (current_mA<10) i=String(current_mA, 2); else i=String(current_mA, 1); //Serial.println(v); mytime elapsed; String msg,msg_time; //Serial.print(charging_started); //Serial.print(" "); //Serial.println(String(millis()-charging_started)); switch(charger_state){ case CHARGING:elapsed=mills2time(ChargingTimeMillis); descanso; case TRICKLE:elapsed=mills2time(TrickleChargingTimeMillis); descanso; } if (charger_state==CHARGING || charger_state==TRICKLE){ if (elapsed.total_minutes<10) msg_time=String(elapsed.total_minutes)+" "; else if (elapsed.total_minutes<100) msg_time=String(elapsed.total_minutes)+" "; else msg_time=String(elapsed.total_minutes); } switch(charger_state){ case CHARGING:msg=v+String(F("V "))+i+String(F("mA"))+" "+msg_time; descanso; case TRICKLE:msg=v+String(F("V "))+i+String(F("mA"))+" "+msg_time; descanso; default:msg=v+String(F("V "))+i+String(F("mA")); } msg.replace("-","");//Remove minus sign return msg;}String construct_time_string(mytime timeinfo){ String mystring=String(timeinfo.hours,DEC)+String(F(":"))+String(timeinfo.minutes,DEC); //return String(timeinfo.hours,DEC)+String(F(":"))+String(timeinfo.minutes,DEC); return mystring;}
calculations.inoArduino
float best_linear_fit(float y[MINUTES_TO_LOG]){ float sx =0.0, sy =0.0, sxx =0.0, sxy =0.0; //int n =y.size(); for (i =0; i  
New LiquidCrystal library used for this projectArduino
 Sin vista previa (solo descarga). 

Esquemas

charger_AgK96zxw2T.zip

Proceso de manufactura

  1. Alerta de sed Alarma de planta
  2. Reloj Word en italiano
  3. Solo tres pines para un teclado de 4x3
  4. Medidor de kWh Sigfox
  5. Monitor de temperatura Bluetooth
  6. Bloqueo controlado por gestos
  7. El IC complementario
  8. Adaptador MIDI USB
  9. Una entrada analógica aislada para Arduino
  10. Visualizador de espectro de audio RGB de 32 bandas
  11. Mide tu tiempo de reacción