Controlando inversor cfw10 com arduino

Fórum sobre plataforma Arduino

Moderadores: andre_luis, 51, guest2003, Renie

Re: Controlando inversor cfw10 com arduino

Mensagempor Maffeis » 24 Out 2014 21:12

Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Re: Controlando inversor cfw10 com arduino

Mensagempor carlucio » 28 Out 2014 15:48

Pessoal,

Ainda ando testando, mas como ainda sou novato com arduino estou com dificuldades para implementar a seguinte função:

* Se apertar um botão ele deve ligar e ficar rodando initerruptamente ate eu apertar outro botão para parar. Não estou sabendo fazer isso, alguem me ajuda?


Código: Selecionar todos

void setup(){
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (8, OUTPUT);
  pinMode (9, OUTPUT);
  digitalWrite (2 , 1);
  digitalWrite (3 , 1);
 
}


void loop(){
  int rodamotor = digitalRead (2);
 // for(;;)
  if (rodamotor == 0){
    digitalWrite (8,1);
    delay (10000);
    delay (10000);
    digitalWrite (8,0);
    delay (15000);
    digitalWrite (9,1);
    delay (10000);
    delay (10000);
    digitalWrite (9,0);
   
  }
}



carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Controlando inversor cfw10 com arduino

Mensagempor edsont » 29 Out 2014 11:03

carlucio escreveu:Pessoal,

Ainda ando testando, mas como ainda sou novato com arduino estou com dificuldades para implementar a seguinte função:

* Se apertar um botão ele deve ligar e ficar rodando initerruptamente ate eu apertar outro botão para parar. Não estou sabendo fazer isso, alguem me ajuda?



Eu (ou alguém) poderia fazer, mas aí você não aprenderia.
Mas olhando rapidamente, posso dizer que a lógica atual não está legal.
Evite usar delays. Se alguém apertar emergência durante os delays o programa não tem como verificar, a não ser que use interrupções para as entradas.
Uma opção é usar milis() para ver o tempo decorrido em cada iteração do loop sem ficar com o loop travado.
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Controlando inversor cfw10 com arduino

Mensagempor carlucio » 29 Out 2014 11:21

Eu quero aprender, cara não importa o jeito.
Sera que não pode pelo menos fazer um rascunho de como deveria fazer, ja ajudaria bastante.
Não sei com funciona ainda as interrupçoes do arduino e nem a funçã milis().
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Controlando inversor cfw10 com arduino

Mensagempor edsont » 29 Out 2014 11:53

carlucio escreveu:Eu quero aprender, cara não importa o jeito.
Sera que não pode pelo menos fazer um rascunho de como deveria fazer, ja ajudaria bastante.
Não sei com funciona ainda as interrupçoes do arduino e nem a funçã milis().


Eu sei quase nada de Arduino. Eu sempre procuro informação nos exemplos e na internet quando vou programar.
Esqueça interrupção por enquanto. Só iria complicar.
Na IDE do Arduino tem um exemplo do uso de milis(). Está em Files>Examples>02.Digital>BlinkWithoutDelay
A função milis() retorna os milisegundos decorridos desde que o Arduino foi ligado (o tempo que programa está funcionando).
Eu não vou colocar código agora porque não tenho Arduino aqui comigo e não quero passar um código que não funcione.
Dica: sempre coloque comentários no programa. Hoje você sabe o que faz cada linha do programa (pelo menos deveria). Amanhã talvez esqueça.
Você lê inglês?
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Controlando inversor cfw10 com arduino

Mensagempor carlucio » 29 Out 2014 21:33

Algumas coisas de ingles, se for para ler algumas informações do arduino fica mais dificil ler as informações de alguns manuais.

Meu ide neste momento deu pau, não compila e aparece um erro de tempo excedido, não no compilador mas em uma janela do windows com a seguinte mensagem :
Runtime error! R6016 not enough space for thread data.

Ja apaguei e instalei de novo e continua o problema.

Vou tentar consertar e ver no que da!
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Controlando inversor cfw10 com arduino

Mensagempor edsont » 30 Out 2014 07:48

carlucio escreveu:Meu ide neste momento deu pau, não compila e aparece um erro de tempo excedido, não no compilador mas em uma janela do windows com a seguinte mensagem :
Runtime error! R6016 not enough space for thread data.


O problema tem a ver com a biblioteca C do Windows.
Você reiniciou o Windows para reinstalar (sem rodar o IDE)?
Uma vez ocorrido o problema, se houver outro programa usando a mesma biblioteca o problema pode persistir. Para liberar teria que reiniciar, pelo menos é o que eu imagino.

Você está fazendo teste com o inversor ou com LED na saída?

Não sei se a WEG melhorou, mas quando eu trabalhei com os inversores dela sempre tive problema de muito ruído. Era comum o inversor derrubar a rede de controle quando acionado principalmente se a rede não estivesse com uma boa blindagem e aterramento.

Escrevi um código mas não tive tempo de testar. Estou postando mesmo assim.

Código: Selecionar todos
//Nao verificado quando contagem de millis sofre rollover.
//Não implementado falha de inversor

//Ajustes do automatico
#define TempoCiclo  15  //Tempo do ciclo em segundos; valido para horario e anti-horario
#define CiclosTotal 3 //Total de ciclos a executar; 1 ciclo = horario + anti-horario

//Entradas
#define BotaoLiga 2 //pino 2 liga maquina; pulso negativo com pull-up
#define BotaoDesliga 3 //pino 3 desliga maquina; pulso negativo com pull-up

//Saidas
#define InversorHorario 8 //pino 8 liga inversor horario
#define InversorAntiHorario 9 //pino 9 liga inversor anti-horario

//estados do inversor
#define Para  0
#define Horario 1
#define AntiHorario 2

long  MillisAnterior = 0;
unsigned long  MillisAtual;
int   CronometroSegundos;
boolean Maquina=0;  //Estado da maquina
int   EstadoInversor = Para;
int   CicloAtual = 0;   //contagem de ciclos completos

// Setup **************************************************************************

void setup(){
  pinMode (BotaoLiga, INPUT_PULLUP);
  pinMode (BotaoDesliga, INPUT_PULLUP);
  pinMode (InversorHorario, OUTPUT);
  pinMode (InversorAntiHorario, OUTPUT);
  //Para teste
  Serial.begin(9600);
}

// Main loop **********************************************************************

void loop(){

//Para teste
  Serial.print("Maq:";Maquina);
  Serial.print(" Ciclo:";CicloAtual);
  Serial.print(" Inv:";EstadoInversor);
  Serial.println(" Crono:";CronometroSegundos);
 
//Liga desliga maquina
  if(!digitalRead(BotaoLiga) && !Maquina){  //liga maquina se estava desligada
    Maquina=1;
    EstadoInversor = Horario;       //inicia inversor sempre em horario
    MillisAnterior = MillisAtual;   //inicia contagem
  }
  if(!digitalRead(BotaoDesliga)) Maquina=0; //desliga maquina

//Contagem de segundos
  MillisAtual = millis();
  CronometroSegundos = (MillisAtual - MillisAnterior) / 1000; //esta linha deve ficar apos liga maquina
                                                              //para que inicio de contagem tenha efeito

//Ciclos
  if(CicloAtual>=CiclosTotal) Maquina=0;
  if(!Maquina){
    CicloAtual = 0;
    EstadoInversor = Para;
  }

//Estados do Inversor 
  switch(EstadoInversor){
    case Para: ParaMotor(); break;
    case Horario: RodaHorario(); break;
    case AntiHorario: RodaAntiHorario(); break;
  }
 
}


// funcnoes do inversor ***********************************************************

void  ParaMotor(){
  digitalWrite(InversorHorario,0);
  digitalWrite(InversorAntiHorario,0);
}


//obs: esta sem delay para inversao

void  RodaHorario(){
  digitalWrite(InversorAntiHorario,0);
  digitalWrite(InversorHorario,1);
  if (CronometroSegundos>=TempoCiclo){
    MillisAnterior = MillisAtual;   //inicia contagem
    EstadoInversor = AntiHorario;   //inverte sentido
  }
}


void  RodaAntiHorario(){
  digitalWrite(InversorHorario,0);
  digitalWrite(InversorAntiHorario,1);
  if (CronometroSegundos>=TempoCiclo){
    MillisAnterior = MillisAtual;   //inicia contagem
    EstadoInversor = Horario;   //inverte sentido
    CicloAtual++;
  }
}
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Controlando inversor cfw10 com arduino

Mensagempor carlucio » 02 Nov 2014 19:26

Quando estou compilando esta aparecendo os seguintes erros abaixo . Ja tentei alterar algumas coisas mas sem sucesso, pois ainda desconheço a dinamica da ementação do arduino.

sketch_nov02a.ino: In function 'void loop()':
sketch_nov02a:44: error: expected `)' before ';' token
sketch_nov02a:44: error: expected `)' before ';' token
sketch_nov02a:44: error: expected `;' before ')' token
sketch_nov02a.ino:44: warning: statement has no effect
sketch_nov02a:45: error: expected `)' before 'CicloAtual'
sketch_nov02a:46: error: expected `)' before ';' token
sketch_nov02a:46: error: expected `;' before ')' token
sketch_nov02a.ino:46: warning: statement has no effect
sketch_nov02a:47: error: expected `)' before ';' token
sketch_nov02a:47: error: expected `;' before ')' token
sketch_nov02a.ino:47: warning: statement has no effect

Edsnot, o que sera que devo fazer para corrigir ?
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Controlando inversor cfw10 com arduino

Mensagempor edsont » 02 Nov 2014 20:30

carlucio escreveu:Quando estou compilando esta aparecendo os seguintes erros abaixo . Ja tentei alterar algumas coisas mas sem sucesso, pois ainda desconheço a dinamica da ementação do arduino.

sketch_nov02a.ino: In function 'void loop()':
sketch_nov02a:44: error: expected `)' before ';' token
sketch_nov02a:44: error: expected `)' before ';' token
sketch_nov02a:44: error: expected `;' before ')' token
sketch_nov02a.ino:44: warning: statement has no effect
sketch_nov02a:45: error: expected `)' before 'CicloAtual'
sketch_nov02a:46: error: expected `)' before ';' token
sketch_nov02a:46: error: expected `;' before ')' token
sketch_nov02a.ino:46: warning: statement has no effect
sketch_nov02a:47: error: expected `)' before ';' token
sketch_nov02a:47: error: expected `;' before ')' token
sketch_nov02a.ino:47: warning: statement has no effect

Edsnot, o que sera que devo fazer para corrigir ?


Exclua as linhas que se referem ao teste. As linhas que tem Serial.begin e Serial.print. Acho que minha sintaxe está errada, mas aqui compilou sem erro.

Qual versão está usando?

Você está com o inversor conectado? Se tiver melhor testar com LEDs primeiro.
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Controlando inversor cfw10 com arduino

Mensagempor edsont » 02 Nov 2014 20:42

Tinha erro mesmo nas linhas do Serial.print. Segue correção.

Obs. Ao conectar o Serial Monitor o Arduino irá resetar.

Código: Selecionar todos
//Nao verificado quando contagem de millis sofre rollover.
//Não implementado falha de inversor

//Ajustes do automatico
#define TempoCiclo  15  //Tempo do ciclo em segundos; valido para horario e anti-horario
#define CiclosTotal 3 //Total de ciclos a executar; 1 ciclo = horario + anti-horario

//Entradas
#define BotaoLiga 2 //pino 2 liga maquina; pulso negativo com pull-up
#define BotaoDesliga 3 //pino 3 desliga maquina; pulso negativo com pull-up

//Saidas
#define InversorHorario 8 //pino 8 liga inversor horario
#define InversorAntiHorario 9 //pino 9 liga inversor anti-horario

//estados do inversor
#define Para  0
#define Horario 1
#define AntiHorario 2

long  MillisAnterior = 0;
unsigned long  MillisAtual;
int   CronometroSegundos;
boolean Maquina=0;  //Estado da maquina
int   EstadoInversor = Para;
int   CicloAtual = 0;   //contagem de ciclos completos

// Setup **************************************************************************

void setup(){
  pinMode (BotaoLiga, INPUT_PULLUP);
  pinMode (BotaoDesliga, INPUT_PULLUP);
  pinMode (InversorHorario, OUTPUT);
  pinMode (InversorAntiHorario, OUTPUT);
  //Para teste
  Serial.begin(9600);
}

// Main loop **********************************************************************

void loop(){

//Para teste
  Serial.print("Maq:");
  Serial.print(Maquina);
  Serial.print(" Ciclo:");
  Serial.print(CicloAtual);
  Serial.print(" Inv:");
  Serial.print(EstadoInversor);
  Serial.print(" Crono:");
  Serial.println(CronometroSegundos);
 
//Liga desliga maquina
  if(!digitalRead(BotaoLiga) && !Maquina){  //liga maquina se estava desligada
    Maquina=1;
    EstadoInversor = Horario;       //inicia inversor sempre em horario
    MillisAnterior = MillisAtual;   //inicia contagem
  }
  if(!digitalRead(BotaoDesliga)) Maquina=0; //desliga maquina

//Contagem de segundos
  MillisAtual = millis();
  CronometroSegundos = (MillisAtual - MillisAnterior) / 1000; //esta linha deve ficar apos liga maquina
                                                              //para que inicio de contagem tenha efeito

//Ciclos
  if(CicloAtual>=CiclosTotal) Maquina=0;
  if(!Maquina){
    CicloAtual = 0;
    EstadoInversor = Para;
  }

//Estados do Inversor 
  switch(EstadoInversor){
    case Para: ParaMotor(); break;
    case Horario: RodaHorario(); break;
    case AntiHorario: RodaAntiHorario(); break;
  }
 
}


// funcnoes do inversor ***********************************************************

void  ParaMotor(){
  digitalWrite(InversorHorario,0);
  digitalWrite(InversorAntiHorario,0);
}


//obs: esta sem delay para inversao

void  RodaHorario(){
  digitalWrite(InversorAntiHorario,0);
  digitalWrite(InversorHorario,1);
  if (CronometroSegundos>=TempoCiclo){
    MillisAnterior = MillisAtual;   //inicia contagem
    EstadoInversor = AntiHorario;   //inverte sentido
  }
}


void  RodaAntiHorario(){
  digitalWrite(InversorHorario,0);
  digitalWrite(InversorAntiHorario,1);
  if (CronometroSegundos>=TempoCiclo){
    MillisAnterior = MillisAtual;   //inicia contagem
    EstadoInversor = Horario;   //inverte sentido
    CicloAtual++;
  }
}
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Re: Controlando inversor cfw10 com arduino

Mensagempor carlucio » 03 Nov 2014 22:31

Realmente funcionou e bem.
Agora quero ver se consigo apresentar aquela informação do serial monitor em um display.
Para aumentar o tempo de templo de ciclo de 15 segundos par 2 minutos simplesmente colocar 120, certo? E pode ir ate quanto? 65535?
No meu caso não sera preciso colocar o templo de ciclo total, a não ser uma necessidade exigida? Posso simplesmente comentar? E esse valor chega tambem até os 65536?

Quando for utilizar o inversor estarei usando reles para fazer o serviço, por enquanto a carga é somente led's!
carlucio
Byte
 
Mensagens: 118
Registrado em: 05 Jan 2014 15:07

Re: Controlando inversor cfw10 com arduino

Mensagempor edsont » 04 Nov 2014 07:30

carlucio escreveu:Realmente funcionou e bem.
Agora quero ver se consigo apresentar aquela informação do serial monitor em um display.
Para aumentar o tempo de templo de ciclo de 15 segundos par 2 minutos simplesmente colocar 120, certo? E pode ir ate quanto? 65535?
No meu caso não sera preciso colocar o templo de ciclo total, a não ser uma necessidade exigida? Posso simplesmente comentar? E esse valor chega tambem até os 65536?

Quando for utilizar o inversor estarei usando reles para fazer o serviço, por enquanto a carga é somente led's!


As linhas de teste com Serial.print talvez interfira um pouco na resposta das entradas do Arduíno, mas acho que não chega a ser um problema.
O valor máximo para o tipo int (tempo do ciclo) é de 32767, mas você pode alterar o tipo para long por exemplo, que vai até 2.147.483.647. O unsigned int vai até 65535.
Este valor não precisa necessariamente ser constante, pode ser configurável ou selecionável no painel da sua máquina. O mesmo para o numero de ciclos.
Também dá pra usar vários contadores, por exemplo um para segundos, outro para minutos, etc. Talvez ficasse mais fácil até para exibir num display.
No caso do display é melhor atualizar os dados somente quando houver alteração, em vez de enviar repetidas vezes como eu fiz no Serial.print.
O Serial.print não serve para LCD, apesar que alguns LCDs sejam seriais. No IDE deve ter exemplos do uso do LCD.
O Serial.print deve ser excluído ou comentado quando concluído para não interferir no funcionamento.
Quando for usar o inversor não esqueça de configurar as rampas nele.
O programa é só para você ter uma idéia. Existem infinitas formas de implementar a mesma tarefa. E ainda falta muita coisa para ficar prático e seguro.
Avatar do usuário
edsont
Word
 
Mensagens: 555
Registrado em: 22 Mai 2007 17:19
Localização: Araraquara-SP Brasil - Terra - Sistema Solar - Via Láctea

Anterior

Voltar para ARDUINO

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x