sma forma, o primeiro, no anúncio diz que serve para carregar baterias de lítio.
Link do módulo: https://pt.aliexpress.com/item/32984121389.html?
Meu esquema está da seguinte forma:
Fonte 24V -> Módulo XL4015 (Ajustado para 12.6V e limitado a 1A) -> HX-3S-01 (bms) -> baterias.
ps - Não vou entrar no mérito da eficiência dos módulos baseado nos gráficos de carga das baterias e outras coisas.
Aparentemente, tudo está funcionado do jeito que deveria, entretanto, existe algo que está me incomodando.
Quando a fonte NÃO está conectada, a bateria alimentada o XL4015 (através do output), ficando com tensão no in/out (vcc), além de ficar com o led verde (indicando "carga completa") ligado o tempo todo. Isso consome cerca de 12mAh.
Só que:
0,012 x 24 = 0,288 * 7 = 2,016A.
Ou seja. Se o material ficar desligado e SEM USO, em 7 dias, as baterias serão consumidas.
Eu sei que todo circuito consome um pouco de corrente, incluindo o próprio hx-3s-01, mas talvez este consumo com o material desligado, talvez, seja um pouco absurdo.
Para facilitar a vida, bati umas fotos e obtive as seguintes informações:
ps- Esse " 4'31 ", eu não tenho certeza se tinha algo a mais. É um componente muito pequeno, e consegui essa informação com a câmera do celular (e com dificuldade)
Estou procurando soluções para contornar essa situação. Até o momento, a única coisa que imaginei foi adicionar um 10A10 (diodo - que tenho em estoque) em série no out+ do XL4051 e, consequentemente, aumentar o valor de 12V6 para 13~13v5..
Sugestões? Orientações? Gráficos? Links? Video? Imagens? Qualquer coisa? kkkkk…
Adicionado por tiago merces ao 16:52 em 22 abril 2022
kRunning 0
#define stSetDay 1
#define stSetMonth 2
#define stSetYear 3
#define stSetHour 4
#define stSetMinute 5
#define stSetSecond 6
float tempC = 0; // variavel de ponto flutuante para a temperatura em Graus Celcius
int tempPin = 0; // Declaração do pino de entrada analógica 0 (A0) no Arduino
float samples[8]; // matriz para armazenar oito amostras para o cálculo da temperatura média
int i;
int stat = stClockRunning;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //configuração dos pinos do lcd
void Print(int number)
{
lcd.print(number/10);
lcd.print(number%10);
}
// Preenchimento do display LCD
void printTime()
{
lcd.setCursor(2,1); Print(hour());
lcd.print(":"); Print(minute());
lcd.print(":"); Print(second());
lcd.setCursor(2,0); Print(day());
lcd.print("/"); Print(month());
lcd.print("/"); Print(year());
lcd.setCursor(0,0);
lcd.noCursor(); // Cursor invisível
lcd.noBlink(); // Efeito blink desligado
if (stat != stClockRunning)
lcd.print("");
else
lcd.print("");
simbolorelogio();
lcd.setCursor(0,1);
lcd.write(3);
switch(stat)
{
case stSetDay:
lcd.setCursor(0,0);
lcd.print("d ");
lcd.setCursor(3,0);
lcd.cursor(); // Cursor visível
lcd.blink(); // Cursor piscando
break;
case stSetMonth:
lcd.setCursor(0,0);
lcd.print("m ");
lcd.setCursor(6,0);
lcd.cursor(); // Cursor visível
lcd.blink(); // Cursor piscando
break;
case stSetYear:
lcd.setCursor(0,0);
lcd.print("a ");
lcd.setCursor(11,0);
lcd.cursor(); // Cursor visível
lcd.blink(); // Cursor piscando
break;
case stSetHour:
lcd.setCursor(0,0);
lcd.print("h ");
lcd.setCursor(3,1);
lcd.cursor(); // Cursor visível
lcd.blink(); // Cursor piscando
break;
case stSetMinute:
lcd.setCursor(0,0);
lcd.print("M ");
lcd.setCursor(6,1);
lcd.cursor(); // Cursor visível
lcd.blink(); // Cursor piscando
break;
case stSetSecond:
lcd.setCursor(0,0);
lcd.print("s ");
lcd.setCursor(9,1);
lcd.cursor(); // Cursor visível
lcd.blink(); // Cursor piscando
break;
}
}
// Lê pino usando limiar, como um interruptor, isto é,
// interruptor pressionado primeira vez liga, pela segunda vez desliga
int readPinSwitch(int pin, int threshold)
{
if (digitalRead(pin))
{
unsigned long tt = millis();
while (digitalRead(pin));
if ((millis() - tt) > threshold)
return 1;
else
return 0;
}
else
return 0;
}
//Lê pino usando limiar
int readPin(int pin, int threshold)
{
if (digitalRead(pin))
{
unsigned long tt = millis();
while ((digitalRead(pin) && (millis() - tt) <= threshold));
if (digitalRead(pin))
return 1;
else
return 0;
}
else
return 0;
}
// obter novo status, se houver
int getStat()
{
if (readPinSwitch(clockSet,300))
if (stat == stSetSecond)
return stClockRunning;
else
return stat+1;
else
return stat;
}
// definir Arduino e tempo do RTC
void setRTCTime(int hour, int minute, int second, int day, int month, int year)
{
// define tempo do Arduino
setTime(hour,minute,second,day,month,year);
time_t t = now();
// define tempo do RTC
RTC.set(t);
}
void simbolorelogio()
{
byte relogio[8] = {
B00000,
B01110,
B10101,
B10111,
B10001,
B01110,
B00000,
B00000};
lcd.createChar(3, relogio); // Cria o caractere personalizado de um relogio
}
void setup()
{
pinMode(clockUp,INPUT); // configura os pinos dos botões como entrada
pinMode(clockDown,INPUT);
pinMode(clockSet,INPUT);
lcd.begin(16, 2); // Seta o display para 16 colunas and 2 linhas
setSyncProvider(RTC.get); // função para obter o tempo do RTC
if(timeStatus()!= timeSet) // verifica status do RTC e retorna erro
{
lcd.setCursor(0,0);
lcd.print("Erro do RTC:");
lcd.setCursor(0,1);
lcd.print("Ajuste o Relogio");
delay(3000);
lcd.clear();
}
}
int oldStat = stat;
unsigned long t=millis();
void loop()
{
int value = 0;
printTime(); // rotina que imprime o tempo no lcd
delay(100);
stat=getStat();
if (stat != oldStat)
{
t=millis();
oldStat = stat;
}
else
if ((stat != stClockRunning) && ((millis() - t) > 30000)) //tempo em milisegundos que o ajuste do relógio ficará disponível para ser alterado
stat=stClockRunning;
switch(stat)
{
case stClockRunning:
break;
case stSetDay:
// inicializa value
value=day();
//se botao UP (para cima) for pressionado
while(readPin(clockUp,200))
{
value++;
if (value > 31)
value=1;
setRTCTime(hour(),minute(),second(),value,month(),year());
printTime();
}
//se botao DOWN (para baixo) for pressionado
while(readPin(clockDown,200))
{
value--;
if (value < 1)
value=31;
setRTCTime(hour(),minute(),second(),value,month(),year());
printTime();
}
break;
// ver comentários em stSetDay
case stSetMonth:
value=month();
while(readPin(clockUp,200))
{
value++;
if (value > 12)
value=1;
setRTCTime(hour(),minute(),second(),day(),value,year());
printTime();
}
while(readPin(clockDown,200))
{
value--;
if (value < 1)
value=12;
setRTCTime(hour(),minute(),second(),day(),value,year());
printTime();
}
break;
case stSetYear:
value=year();
while(readPin(clockUp,200))
{
value++;
if (value > 2080)
value=2000;
setRTCTime(hour(),minute(),second(),day(),month(),value);
printTime();
}
while(readPin(clockDown,200))
{
value--;
if (value < 2000)
value=2080;
setRTCTime(hour(),minute(),second(),day(),month(),value);
printTime();
}
break;
case stSetHour:
value=hour();
while(readPin(clockUp,200))
{
value++;
if (value > 23)
value=0;
setRTCTime(value,minute(),second(),day(),month(),year());
printTime();
}
while(readPin(clockDown,200))
{
value--;
if (value < 1)
value=24;
setRTCTime(value,minute(),second(),day(),month(),year());
printTime();
}
break;
case stSetMinute:
value=minute();
while(readPin(clockUp,200))
{
value++;
if (value > 59)
value=0;
setRTCTime(hour(),value,second(),day(),month(),year());
printTime();
}
while(readPin(clockDown,200))
{
value--;
if (value < 0)
value=59;
setRTCTime(hour(),value,second(),day(),month(),year());
printTime();
}
break;
case stSetSecond:
value=minute();
while(readPin(clockUp,200))
{
value++;
if (value > 59)
value=0;
setRTCTime(hour(),minute(),value,day(),month(),year());
printTime();
}
while(readPin(clockDown,200))
{
value--;
if (value < 0)
value=59;
setRTCTime(hour(),minute(),value,day(),month(),year());
printTime();
}
{
samples[i] = ( 4.8 * analogRead(tempPin) * 100.0) / 1024.0; // conversão matemática para amostra legível de temperatura do LM35 e armazena resultado de conjunto de amostras. 1024 é a profundidade de bits (quantização) do Arduino.
// 5 é a voltagem fornecida ao LM35. Alterar apropriadamente para ter a medida correta. No meu circuito é de 4.8Volts.
// Exibição atual para temperatura em grau Celcius no LCD
lcd.setCursor(11, 1);
lcd.print(samples[i]); // imprime amostra da temperatrua atual no LCD
simbolograu();
lcd.setCursor(15,1);
lcd.write(1);
}
} //Fim da rotina principal
}
void simbolograu()
{
byte grau[8] = { // Cria um array de bytes com o simbolo de grau
B00110,
B01001,
B00110,
B00000,
B00000,
B00000,
B00000,
B00000};
lcd.createChar(1, grau); // Cria o caractere personalizado de grau
} // fim rotina simbolograu…
o e depois Phaisarn, alterou algumas coisas.... ele é muito parecido com o que vc quer porém mais complexo pois multiplexa os displays.... ele criou uma tabela para os caracteres... o zero é o led aceso!!! acredito que os pinos estão ligados assim:
PINO DISPLAY "HC595"
A=128 "QH 595" B=64 "QG 595" C=32 "QF 595" D=16 "QE 595" E=8 "QD 595" F=4 "QC 595" G=2 "QB 595" DP=1 "QA 595"
//character set (0-9)0-9
// (10-19)0.-9.
// (20-45)A-Z
// (46-71)a-z
// (72)- (73) space (74) º
intcharacters[]={
3,159,37,13,153,73,65,31,1,9,
2,158,36,12,152,72,64,30,0,8,
17,1,99,3,97,113,67,145,243,135,145,227,85,19,3,49,25,115,73,31,129,129,169,145,137,37,
5,193,229,133,33,113,9,209,247,143,81,227,85,213,197,49,25,245,73,225,199,199,169,145,137,37,
253,255,57
};
Talvez tabelar vá facilitar! Voce só vai precisar da 1ª e 2ª linha da tabela..…
ay(1000); SelecionaDataeHora(); inicio_ok =1; Serial.begin (9600); if (!SD.begin(4)) { Serial.println("Erro ao iniciar o cartao SD !"); inicio_ok =0; return; } Serial.println ("Iniciacao Ok!"); } void loop () { int leituraSensor = analogRead (0); arquivo = SD.open ("teste2.txt", FILE_WRITE); if (arquivo) { Mostrarelogio(); delay(1000); arquivo. println (leituraSensor); arquivo.close(); } } void SelecionaDataeHora() //Seta a data e a hora do DS1307 { byte segundos = 40; //Valores de 0 a 59 byte minutos = 59; //Valores de 0 a 59 byte horas = 23; //Valores de 0 a 23 byte diadasemana = 1; //Valores de 0 a 6 - 0=Domgino, 1 = Segunda, etc. byte dia = 17; //Valores de 1 a 31 byte mes = 4; //Valores de 1 a 12 byte ano = 13; //Valores de 0 a 99 Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados //As linhas abaixo escrevem no CI os valores de data e hora que foram colocados nas variaveis acima Wire.write(ConverteParaBCD(segundos)); Wire.write(ConverteParaBCD(minutos)); Wire.write(ConverteParaBCD(horas)); Wire.write(ConverteParaBCD(diadasemana)); Wire.write(ConverteParaBCD(dia)); Wire.write(ConverteParaBCD(mes)); Wire.write(ConverteParaBCD(ano)); Wire.write(zero); //Start no CI Wire.endTransmission(); } byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD return ( (val/10*16) + (val%10) ); } byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal return ( (val/16*10) + (val%16) ); } void Mostrarelogio(){ Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); int segundos = ConverteparaDecimal(Wire.read()); int minutos = ConverteparaDecimal(Wire.read()); int horas = ConverteparaDecimal(Wire.read() & 0b111111); int diadasemana = ConverteparaDecimal(Wire.read()); int dia = ConverteparaDecimal(Wire.read()); int mes = ConverteparaDecimal(Wire.read()); int ano = ConverteparaDecimal(Wire.read()); //Mostra a data no Serial Monitor Serial.print("Data: "); Serial.print(dia); Serial.print("/"); Serial.print(mes); Serial.print("/"); Serial.print(ano); Serial.print(" "); Serial.print("Hora : "); Serial.print(horas); Serial.print(":"); Serial.print(minutos); Serial.print(":"); Serial.print(segundos); switch(diadasemana) { case 0:Serial.println(", Domingo"); break; case 1:Serial.println(", Segunda"); break; case 2:Serial.println(", Terca"); break; case 3:Serial.println(", Quarta"); break; case 4:Serial.println(", Quinta"); break; case 5:Serial.println(", Sexta"); break; case 6:Serial.println(", Sabado"); } }…
Adicionado por Luiz Carlos ao 9:53 em 18 dezembro 2013
vez abrindo o arquivo do seu programa que você produziu na "IDE" como administrador, você consiga resolver esse problema. Por exemplo: Abrir qualquer arquivo diretamente, sendo que ao invés de dar dois cliques no arquivo do tipo .ino, você deverá clicar com botão direito no arquivo e escolher a opção "Executar como administrador"! Já no Linux que é o meu caso, você deverá navegar até a pasta que baixou o instalador do Arduino e executar o programa como administrador! eu extrai a pasta em: /home/pedro/ então abri o terminal e digitei sem as aspas:
"sudo su"
O terminal pedirá a senha do administrador do seu computador, digite e pressione enter!
"cd /home/pedro/arduino-1.8.7/"
"sudo ./arduino"
Ele abrirá a "IDE" do Arduino porém com direitos administrativos. Agora sim irá funcionar! O erro que obtive foi:
Arduino: 1.8.7 (Linux), Placa:"Arduino/Genuino Uno"
O sketch usa 1856 bytes (5%) de espaço de armazenamento para programas. O máximo são 32256 bytes.Variáveis globais usam 28 bytes (1%) de memória dinâmica, deixando 2020 bytes para variáveis locais. O máximo são 2048 bytes.avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission deniedProblema ao carregar para a placa. Veja http://www.arduino.cc/en/Guide/Troubleshooting#upload para sugestões.
Este relatório teria mais informações com"Mostrar a saida detalhada durante a compilação"opção pode ser ativada em "Arquivo -> Preferências"
A solução foi encontrada no fórum do Arduino: https://forum.arduino.cc/index.php?topic=177426.0
no comentário de karlkarl:
-------------------------------------------------------------------------------------------------------------------------------------------------------
Re: How to install uno drivers in ubuntu
#1
Jul 18, 2013, 07:31 pm
Hi Quizmaster,You have to start the Arduino IDE from a root-shell or with root-rights from the directory where it is stored: sudo ./ArduinoAs a standard user you do not belong to groups which allow access to the serial/USB connenctionsSee Note 1 here:http://playground.arduino.cc/Linux/Debian
-------------------------------------------------------------------------------------------------------------------------------------------------------
Boa sorte a todos!
…
Adicionado por Pedro Trindade ao 15:12 em 2 novembro 2018
arduino ao sensor?
na net encontrei um código http://playground.arduino.cc/Code/ModbusMaster
#include <ModbusMaster.h> // instantiate ModbusMaster object as slave ID 2 // defaults to serial port 0 since no port was specified ModbusMaster node(2); void setup() { // initialize Modbus communication baud rate node.begin(19200); } void loop() { static uint32_t i; uint8_t j, result; uint16_t data[6]; i++; // set word 0 of TX to least-significant word of counter (bits 15..0) node.TX(0, lowWord(i)); // set word 1 of TX to most-significant word of counter (bits 31..16) node.TX(1, highWord(i)); // slave 1: write TX to (2) 16-bit registers starting at register 0 result = node.WriteMultipleRegisters(0, 2); // slave 1: read (6) 16-bit registers starting at register 2 to RX result = node.ReadHoldingRegisters(2, 6); // do something with data if read is successful if (result == node.ku8MBSuccess) { for (j = 0; j < 6; j++) { data[j] = node.RX(j); } } }
eu estou com duvida é esta parte que faz a leitura do sensor?
// slave 1: read (6) 16-bit registers starting at register 2 to RX result = node.ReadHoldingRegisters(2, 6);
No local do "6" eu colocaria do endereço que estão no manual?
Obrigado Pessoal.…
//www.seeedstudio.com/wiki/Grove_-_Electricity_Sensor
Esse é código montado por mim , anexei o arquivo com o nome ACS712_GrooveA
http://pastebin.com/8sAQXe6Y
Vejam os resultados aferidos com teste com lampadas incandescentes e um ferro de passar :
Percebam que apenas um bit de diferença na leitura da tensão, faz uma grande diferença na corrente.
Acho que será preciso blindar o cabo que liga o sensor ao Arduino !!
Medições com ACS712-30A
dia 15/ago/2015
Medições Multimetro Fluke 17B+
Tensão REDE = 129,7 Vca (medida)
VCC = 5000 mV / 1024 = 4,8828125
ACS712-30A - Coeficiente estimado = 65,8 mV / A
===========================================
Medição sem carga
Medicao Maxima = 512Tensao de Pico = 2500 mVVmax ACS712 = 0 mVV RMS ACS712 = 0 mVI RMS ACS712 = 0.000 A
===========================================
Lampada Phillips 127 V - 60 W - I Medido = 0,472 A
Medicao Maxima = 520Tensao de Pico = 2539 mVVmax ACS712 = 39 mVV RMS ACS712 = 28 mVI RMS ACS712 = 0.420 A
Medicao Maxima = 521Tensao de Pico = 2544 mVVmax ACS712 = 44 mVV RMS ACS712 = 31 mVI RMS ACS712 = 0.472 A >>> Que beleza !!!
======================================================
Lampada GE 127 V - 40 W - I Medido = 0,326 A
Medicao Maxima = 518Tensao de Pico = 2529 mVVmax ACS712 = 29 mVV RMS ACS712 = 21 mVI RMS ACS712 = 0.315 A
Medicao Maxima = 517Tensao de Pico = 2524 mVVmax ACS712 = 24 mVV RMS ACS712 = 17 mVI RMS ACS712 = 0.262 A
======================================================
Lampada GE 220 V - 50 W - I medido = 0,166 A
Medicao Maxima = 515Tensao de Pico = 2515 mVVmax ACS712 = 15 mVV RMS ACS712 = 10 mVI RMS ACS712 = 0.157 A
=======================================================
Ferro de passar Arno 127 V - 1100 W
I = 1100 / 127 = 8,661 A
Medicao Maxima = 675Tensao de Pico = 3296 mVVmax ACS712 = 796 mVV RMS ACS712 = 563 mVI RMS ACS712 = 8.553 A
Medicao Maxima = 674Tensao de Pico = 3291 mVVmax ACS712 = 791 mVV RMS ACS712 = 559 mVI RMS ACS712 = 8.500 A…