Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Multiplexador de carregador de bateria inteligente com Smart Display

Componentes e suprimentos

Arduino UNO
× 1
Arduino Proto Shield
× 1
Sensor ultrassônico - HC-SR04 (genérico)
× 1
Adafruit MCP-3008 8 canal 10 bits Adc
× 1
Relé 5V - optoacoplador de 2 canais
× 3
LM2596 Módulo de fonte de alimentação DC / DC BUCK 3A ajustável
× 1
Resistor 1k ohm
× 12
Terminal de 6 posições
Verifique a imagem - quase qualquer tipo de sistema de conexão pode ser usado.
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)

Sobre este projeto


Morando no Nordeste, se você tem um carro ou barco mais antigo, ou cortador de grama ou outro veículo que começa com uma bateria que você não dirige ou usa em mau tempo (alguns chamam de inverno), você tem que decidir o que fazer com as baterias a cada temporada. Se você tiver um ou dois, é muito fácil - você pode obter um carregador lento. Os simples e baratos custam menos de US $ 15 - mas são simples - sem realimentação de bateria ou monitoramento, eles apenas colocam um pouco mais de 13 volts na bateria. Uma escolha melhor seria um dos carregadores inteligentes - eles geralmente têm carga regular superior / mais rápida e uma carga de neve ou gota que ajusta a saída com base na tensão e condição da bateria. Eles funcionam muito bem - Harbor Freight tem um por US $ 39 - é claro, US $ 29 à venda, o que quase sempre é.

O que perdi foi o meu MGB de 1975 (com um Oldsmobile V8 de 3,5 litros), uma picape Toyota de 1981, um barco e um gerador - todos com baterias de 12 volts. E então, se formos embora no inverno, deixamos um dos carros aqui para que haja outra bateria. Bem, eu teria que conseguir 5 controladores de bateria - $ 150 se eu fosse para o HF à venda.

Enquanto pensava sobre isso, pensei em pegar um para cada bateria, colocá-lo, ele traz as baterias para um nível e então ele apenas monitora e carrega lentamente para o resto do tempo. Então, surgiu a ideia - por que não poderia conectá-lo a cada bateria algumas horas por dia - não funcionaria? Então, se eu pudesse fazer com que ele alternasse automaticamente entre eles?

Bem, eu posso. Peguei um dos meus Arduinos e escrevi um programa que faz exatamente isso - e então me empolguei e adicionei alguns recursos extras. Portanto, aqui apresento os detalhes sobre o que acabei fazendo. Esta versão é configurada para até 6 baterias com detecção automática.

Funcionará com 1 a 6 baterias. A primeira bateria deve ser conectada ao ponto número 1 - essa conexão é ligada ao regulador de tensão que alimenta o Arduino e outros componentes eletrônicos. O segundo em diante pode então ser conectado em qualquer ordem. Quando você conecta uma bateria, a tensão é detectada na função Read_Show_Volts e essa bateria é adicionada ao ciclo de carga.

Como funciona - eu queria acomodar 6 baterias. Com um Arduino UNO A4 e A5, as entradas analógicas são necessárias para o controle LCD de 2 fios e isso deixa 4 entradas analógicas, muito poucas. Então eu conectei um MCP-3008 entradas analógicas de 8 canais. Eu uso 2 resistores de 1k como um divisor de tensão para cada entrada do MCP-3008.

Existem basicamente 4 funções chamadas no programa.
  • A função read_show_volts verifica cada conexão para ver se há uma bateria conectada, testando se há mais de 8 volts disponíveis. Se houver 8v ou mais, ele adiciona essa conexão ao circuito de carregamento.
  • Função check_relays verifica o contador do cronômetro e quando atinge o máximo, ele move o carregador para o próximo relé na linha.
  • Função update_display faz exatamente isso - atualiza a exibição. Primeiro ele mostra a tensão nas conexões 1, 2 na linha 1 e a tensão nas conexões 3 e 4 na linha 2. Em seguida, quando o cronômetro diz, ele muda e exibe a tensão nas conexões 5 e 6 na linha 1 e porque eu tinha dois Entradas analógicas extras eu mostro a tensão do sistema (esperançosamente 5 volts) e a tensão iref - 3,3 volts. Essas leituras não são necessárias, mas havia uma linha em branco e eu não sabia o que mais mostrar - estou aberto a ideias.
  • A função final é read_distance_update . Este é interessante e o mais divertido de brincar. Eu conectei uma unidade de medição de distância com sonar ultrassônico HC-SR04. Eu queria que o lcd monitorasse as tensões, mas quase nunca fico parado olhando para o lcd - na maioria das vezes ele poderia ser desligado. Eu poderia ter colocado um interruptor - saída fácil - mas o que fiz foi colocar o HC-SR04 e depois de tantos segundos desligar o LCD. Então, quando passo minha mão de perto sobre o HC-SR04, ligo o lcd novamente por x segundos.

Existem variáveis ​​para quase tudo, então você pode personalizá-lo para atender às suas necessidades. Eu configurei o cronômetro de carregamento para 1 hora por bateria. Portanto, se houver duas baterias conectadas, cada uma será carregada por 1 hora a cada 12 vezes por dia. Com 4 baterias seria 1 hora 6 vezes ao dia e assim por diante.

Enquanto eu tinha o HC-SR04, adicionei uma rotina que altera o loop do cronômetro para um tempo mais curto - alguns segundos em cada bateria. A razão de eu ter feito isso foi para poder ver que ele estava trocando entre as baterias e não tive que esperar uma hora para vê-lo trocar. Se você colocar sua mão sobre o HC-SR04 por alguns segundos, ele acenderá e apagará a luz de fundo do LCD para que você saiba que está ligado. Você ouvirá então a mudança dos relés a cada poucos segundos. Coloque sua mão sobre o HC-SR04 novamente e ele voltará.

Aqui está um zip do código:BatteryMultiplexer

Código

  • Código Arduino do multiplexador de bateria
Código do Arduino do multiplexador de bateria Arduino
Eu usei um Arduino Uno.
 #include  #include  // Usando a versão 1.2.1 # include  #include  auto timer =timer_create_default (); // cria um temporizador com configurações padrão // O construtor LCD - o endereço mostrado é 0x27 - pode ou não ser correto para o seu // Também baseado em YWRobot LCM1602 IIC V1LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVO); int zcnt =0; int acnt =0; // objetivo geral agoraint chargeTime =(10 * 1000); // quanto tempo gastar em cada bateria charge_time_counter =59; // quantos chargetimes foram passados? int charge_time_max =60; // quantos chargetimes foram passados? int relay1 =3; // cada relé em seu próprio relay2 =4; int relay3 =5; int relay4 =6; int current_relay =0; // qual relé está ligado agora? int max_relays =3; // como pode retransmitir - com base em 0. Comece esperando todos os three.float volts1; // qual é a tensão de cada bateriafloat volts2; float volts3; int min_volts =1; // qual é a tensão mínima que uma tensão de bateria deve ter para ser carregada.int volts_update_count =5; // com que freqüência atualizar a leitura de tensão em segundosint volts_update_counter =0; // rastreia a contagem de segundos decorridos byint volts_update =(500); int read_distance_update =(500); // atualiza o leitor de distância a cada milissinto time_on_counter =0; // contador para a exibição on / offint time_on_count =100; // segundos para ser onint heart_beat =0; // mude de 0 para 1 para 0 para mostrar o batimento cardíacoUltraSonicDistanceSensor distanceSensor (11, 12); // Inicializa o sensor que usa os pinos digitais 13 e 12.int distance; int relay [] ={relay1, relay2, relay3}; int is_live [] ={0, 0, 0}; // 1 se ativo, 0 se não. Tenho apenas debug 3int =5; // defina isso para o nível de mensagens de depuração para ir para a impressora serial evite all_change_to (int which) {// altere todos os relês para HIGH ou LOW, você me diz qual :) digitalWrite (relay1, qual); digitalWrite (relé2, que); digitalWrite (relé3, que);} void toggle_relays (int whichOne) {lcd.setCursor (0, 0); // mostra qual relé é o atual em lcd.print ("Relay on:"); lcd.print (current_relay + 1); // current_relay é baseado em zero all_change_to (HIGH); // desligue tudo primeiro digitalWrite (relays [current_relay], LOW); // e defina aquele que deve estar ativado em acnt ++; // apenas um contador para me mostrar que está funcionando lcd.print (""); lcd.print (acnt);} void checkRelays () {// mover current_relay para o próximo relé // se atingirmos o máximo, comece em 0 // enquanto estiver aqui, chame toggle_relays para ter certeza de que não estamos carregar um vazio ou morto charge_time_counter ++; if (contador_de_tempo_de_carga> =tempo_de_carga_max) {intervalo_atual ++; if (current_relay> =max_relay) {current_relay =0; } toggle_relays (current_relay); charge_time_counter =0; }} void read_distance () {// reaad a distância de qualquer coisa do HC-S204 // se for algo dentro de 80 cm, então ligue o display e reinicie o display no contador // se o contador for alcançado, então nada está dentro de 80 cm, então desligue o display distance =distanceSensor.measureDistanceCm (); // descomente para ver a distância real medida // Serial.print ("Distance in CM:"); // Serial.println (distância); if (distance <80) {// pode ser qualquer coisa abaixo de 200 para o meu sistema descomente acima e verifique o seu lcd.backlight (); // liga a exibição time_on_counter =0; } else {// talvez esteja saindo? time_on_counter ++; if (time_on_counter> time_on_count) {time_on_counter =0; lcd.noBacklight (); }}} void read_show_volts () {// ler os volts em cada entrada da bateria // então se for menor que min_volts, não há nada lá que valha a pena carregar, pule essa conexão // isso é chamado repetidamente, portanto, se um fio for interrompido ou // o que quer que não esteja no loop de carga volts1 =analogRead (0); volts1 =(volts1 * 0,016); lcd.setCursor (0, 1); lcd.print (""); // limpar a linha lcd.setCursor (11, 0); lcd.print (volts1); volts2 =analogRead (1); volts2 =(volts2 * 0,0164); lcd.setCursor (4, 1); lcd.print (volts2); volts3 =analogRead (2); volts3 =(volts3 * 0,0166); lcd.setCursor (11, 1); lcd.print (volts3); // agora teste as tensões. Se for menor que 10, então vamos assumir que não há bateria ou bateria sem carga // então tire-a da rotação // comece limpando todos os relés int temp_cnt =0; // define todos os arrays para 0 - isso é relés desligados [0] =0; relés [1] =0; relés [2] =0; if (volts1> min_volts) {relés [temp_cnt] =relé1; // relé 1 está bom temp_cnt ++; } if (volts2> min_volts) {relés [temp_cnt] =relé2; // relé 2 está bom temp_cnt ++; } if (volts3> min_volts) {relés [temp_cnt] =relé3; // relé 3 está bom temp_cnt ++; } max_relays =temp_cnt; // esta é uma aposta de coração no lcd - apenas me mostra que está executando lcd.setCursor (0, 1); if (heart_beat ==1) {lcd.print ("<>"); batimento cardíaco =0; } else {lcd.print ("> <"); batimento cardíaco =1; } lcd.print (charge_time_counter); read_distance ();} void setup () {Serial.begin (19200); Serial.println ("Iniciando"); lcd.begin (16, 2); // dezesseis caracteres em - 2 linhas lcd.backlight (); pinMode (relé1, SAÍDA); pinMode (relé2, SAÍDA); pinMode (relé3, SAÍDA); all_change_to (HIGH); // configurar temporizadores. 3 temporizadores - o tempo para ligar o carregador em cada bateria, // com que freqüência mostrar a atualização de voltagem // e com que freqüência verificar a distância lida para ligar o display read_show_volts (); // faça a primeira vez para que não tenhamos que esperar pelo cronômetro. checkRelays (); timer.every (chargeTime, checkRelays); timer.every (volts_update, read_show_volts);} void loop () {timer.tick (); // marque o cronômetro} 

Esquemas

Esquema para multiplexador

Processo de manufatura

  1. Smart Blinds
  2. Aceitar moeda de controle com Arduino
  3. Arduino Temp. Monitor e relógio em tempo real com tela 3.2
  4. Arduino com Bluetooth para controlar um LED!
  5. Arduino Power
  6. Brincando com Nextion Display
  7. Voltímetro DIY com Arduino e um visor Nokia 5110
  8. Plataforma de treinamento Arduino
  9. Crie o aplicativo Fridgeye com uma tela Nextion
  10. Medindo a radiação solar com Arduino