Go Down

Topic: Ajuda com programação entre o Arduino E o Visual Basic (Read 476 times) previous topic - next topic

SuperAndre

Boas,
estou a realizar um projeto em que criei uma form no visual basic onde tenho que acionar um ventilador de forma manual e automatica atraves de reles que estão ligados ao arduino.

Para já tenho os botoes no visual basic que quando clico aciona o rele desejado.
O problema é agora colocar o modo automatico no mesmo codigo do manual ou seja, tenho o botao para ligar a ventoinha quando quero, e agora no automatico quando a temperatura está acima de X graus ela aciona..

Queria saber se tenho alguma maneira de colocar um botao no visual basic para apenas ler os codigos que estao no arduino quando quero..

Vou deixar oq tenho feito:

ARDUINO:
int temperatura;
#define RELAY1  2 //Pino onde o Relay está conectado ao Arduino
#define RELAY2  3
#define RELAY3  4
String estado1 = "Desligado1"; //estado default será desligado pois é inicializado também como desligada a luz
String estado2 = "Desligado2";
String estado3 = "Desligado3";
int aux;

void setup()

{
  Serial.begin(9600);
   pinMode(RELAY1, OUTPUT);
  digitalWrite(RELAY1, LOW); //Por default vamos deixar a luz apagada
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY2, LOW); //Por default vamos deixar a luz apagada
  pinMode(RELAY3, OUTPUT);
  digitalWrite(RELAY3, LOW); //Por default vamos deixar a luz apagada

}

void loop()
{

aux = Serial.read(); //leitura da porta serial dos valores que sao inseridos

 if (aux == '1')
  {
    digitalWrite(RELAY1, HIGH); //liga o pino 8
    estado1 = "Ligado1"; //Envia para o pc o estado ligado
    Serial.println(estado1); //imprime a variavel estado1 com o valor dela

  }
  if (aux == '2')
  {
    digitalWrite(RELAY1, LOW); //desliga o pino 8
    estado1 = "Desligado1"; //Envia para o pc o estado desligado
    Serial.println(estado1); //imprime a variavel estado1 com o valor dela

  }
  if (aux == '3')
  {
    digitalWrite(RELAY2, HIGH); //liga o pino 8
    estado2 = "Ligado2"; //Envia para o pc o estado ligado
    Serial.println(estado2); //imprime a variavel estado1 com o valor dela

  }
  if (aux == '4')
  {
    digitalWrite(RELAY2, LOW); //desliga o pino 8
    estado2 = "Desligado2"; //Envia para o pc o estado desligado
    Serial.println(estado2); //imprime a variavel estado1 com o valor dela
}
if (aux == '5')
  {
    digitalWrite(RELAY3, HIGH); //liga o pino 8
    estado3 = "Ligado3"; //Envia para o pc o estado ligado
    Serial.println(estado3); //imprime a variavel estado1 com o valor dela

  }
  if (aux == '6')
  {
    digitalWrite(RELAY3, LOW); //desliga o pino 8
    estado3 = "Desligado3"; //Envia para o pc o estado desligado
    Serial.println(estado3); //imprime a variavel estado1 com o valor dela
}

    //Serial.print("temperatura");
    char ler='n';
    if(Serial.available()>0)
    {
      ler=Serial.read();
    }
    if(ler=='a')
    {
      temperatura = analogRead(0);
      temperatura= (5* temperatura * 100)/1024;
      Serial.print(temperatura);
    }

if(temperatura > 19)
  {
    digitalWrite(RELAY3, HIGH);
  }

if(temperatura < 18)
  {
    digitalWrite(RELAY3, LOW);
  }
   
}


Como podem ver os relays teem o mesmo pino e talvez seja esse o problema, preciso mesmo de ajuda :/

luisilva

Boa a tarde. Antes de postar devia ler as regras do fórum. Quem tem que gerir o modo automático o Arduino ou o PC?

bubulindo

Tens de pesquisar por protocolos de comunicação... E apenas ler a porta série quando lá existe algo.
This... is a hobby.

SuperAndre

Olha sabes como faço para o meu botao do visual basic sempre que eu clico nele aquilo clicar mais vezes? por exemplo sempre que eu clico nele aquilo lê os valores do automatico que estão no arduino mas apenas lê 1 vez porque so clico 1 vez se eu clicar 2 vezes aquilo lia 2 vezes, nao sabes como faço para aquilo ficar sempre a clicar como se fosse uma macro ou assim?

luisilva

Olha sabes como faço para o meu botao do visual basic sempre que eu clico nele aquilo clicar mais vezes? por exemplo sempre que eu clico nele aquilo lê os valores do automatico que estão no arduino mas apenas lê 1 vez porque so clico 1 vez se eu clicar 2 vezes aquilo lia 2 vezes, nao sabes como faço para aquilo ficar sempre a clicar como se fosse uma macro ou assim?
Isto´é o fórum Arduino, não é o fórum Visual Basic. No entanto, basta alterar o programa do Arduino para que este entre num estado em que vá enviando as mensagens para o PC regulamente e com intervalos fixos. Tem que criar mais uma mensagem que seja lida pelo programa do Aduino que coloque este nesse estado.

SuperAndre

Sim mas o Visual Basic já lê os valores do monitor serie, o problema é que eu queria que so lesse quando eu apertar um botao.. So lia os valores dos sensores quando eu apertasse o botao se me faço entender

luisilva

Sim mas o Visual Basic já lê os valores do monitor serie, o problema é que eu queria que so lesse quando eu apertar um botao.. So lia os valores dos sensores quando eu apertasse o botao se me faço entender
Não, não entendo o que está a dizer.

SuperAndre

Por exemplo imagina
Eu tenho botoes numa form do Visual Basic, cada botao lê o que eu mando para o monitor serie do arduino
if (aux == '1')
Vai ligar o relay1 que é o da luz
if (aux == '2')
Vai desligar o relay 1 que é da luz..

Isto é o manual que eu tenho a dar

Agora tudo que é automatico e lê o valor dos sensores por exemplo o luminusidade
Quando tá escuro por exeplo
If luminusidade < 200 o relay 1 liga (HIGH)

O problema é que eu queria separar o manual do automatico, porque quando escrevo 2 no monitor serie que é o do if (aux == '2') que faz desligar o Relay1 aquilo nao se vai manter desligado porque está o automatico que lê o valor do sensor If luminusidade < 200 o relay 1 liga (HIGH)

Queria separar isso para só quando escrevo por exemplo "a" vai funcionar todos os codigos manuais e "b" o automatico para ligar ou desligar os relays atraves do que lêr o sensor...

bubulindo

Code: [Select]

unsigned char automatico = 0;

...
if (aux == '9')
  {
    if (automatico ==1) automatico = 0;
    else automatica = 1;
    Serial.print("automatico "); //imprime a variavel estado1 com o valor dela
    Serial.println(automatico);
}
 if (aux == '1')
  {
    if(automatico == 0) {
       digitalWrite(RELAY1, HIGH); //liga o pino 8
       estado1 = "Ligado1"; //Envia para o pc o estado ligado
       Serial.println(estado1); //imprime a variavel estado1 com o valor dela
    } else {
       Serial.println("automatico ligado");
    }
  }


Isto?
This... is a hobby.

SuperAndre

Desculpa a ignorancia mas o aux 9 o que vai fazer? tenho que colocar os codigos que sao automaticos dentro desse if?

bubulindo

Tu perguntaste como podias controlar o automático... eu coloquei uma maneira de o fazeres enviando um nove pela porta série.

Que mais queres que faça?
This... is a hobby.

SuperAndre

Sim mas isto é o manual: "if (aux == '1')
Vai ligar o relay1 que é o da luz
if (aux == '2')
Vai desligar o relay 1 que é da luz.."

E Isto é o automatico

If luminusidade < 200 o relay 1 liga (HIGH)


bubulindo

Acho que tu deverias passar um pouco mais a estudar aparelhos que tem a função manual e automático.

Já viste como funciona o cruise control dum carro? Imagina agora que o cruise control apenas desliga quando carregas no botão de desligar e não quando tocas no acelerador ou travão.

Se activas o cruise control, o carro controla a velocidade. Tu não podes fazer mais nada.
Se desactivas o cruise control, controlas tu a velocidade. Ou seja, podes carregar no travão e acelerador quantas vezes quiseres.

A lógica que coloquei implementa o que descrevi acima. O que podes fazer é desactivar o modo automático quando enviares um comando manual (que é como o cruise control funciona na realidade), mas isso é uma mudança tão pequena no código anterior que deixo para tu fazeres.
This... is a hobby.

Go Up