collapse

* Links de Robótica

* Posts Recentes

Sensor de corrente AC - alternativas? por senso
[Ontem às 20:42]


The latest "nightmare inducing" Boston Dynamics robots por LVirtual
[Ontem às 14:39]


Fonte avariada Delta por jm_araujo
[Ontem às 10:48]


"Direitos Humanos" para robôs... por LVirtual
[Ontem às 08:05]


Encomenda Colectiva à Farnell por Hugu
[20 de Fevereiro de 2017, 22:55]


Estação de Soldar Parkside PLS 48 B1 por Hugu
[20 de Fevereiro de 2017, 18:51]


Encomenda à PCBWay por Hugu
[20 de Fevereiro de 2017, 01:20]


Printer 3D barata por tiagoxefe
[19 de Fevereiro de 2017, 17:12]


Métodos de protecção dos circuitos electrónicos por KammutierSpule
[18 de Fevereiro de 2017, 23:27]


Pós-processador Smoothieboard por jm_araujo
[18 de Fevereiro de 2017, 12:56]

Autor Tópico: Sistema Rega Automático com interface VB  (Lida 8778 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline danuca

  • Mini Robot
  • *
  • Mensagens: 31
Sistema Rega Automático com interface VB
« em: 07 de Setembro de 2012, 14:40 »
Boas
Estou a fazer um Sistema de rega automático com interface VB para facilitar a interacçao com o utilizador.

A programação tem de ser em arduino UNO, ou seja nao precisamos do pc ligado para funcionar.
Fiz um relógio em arduino, que funciona bem, o meu problema para já é como fazer para acertar o relógio.

O meu programa é este:

char hor,*hor2;
int horas;

int seg=0;
int minu=0;
 

void setup()
{
  Serial.begin(9600);
 
}

void loop()

 
    processSyncMessage();
 

if(horas < 24 && horas >0){ 
static unsigned long ult_tempo=0;
int tempo = millis();
if(tempo - ult_tempo >= 1000){
  ult_tempo=tempo;
  seg++;
}
if (seg>=60) {
   seg=0;
   minu++;
}

if (minu>=60) {
   minu=0;
   horas++;
}

if (horas>=24) {
   horas=0;
   minu=0;
}
Serial.print(horas);
Serial.print(":");
Serial.print(minu);
Serial.print(":");
Serial.println(seg);
delay(1000);
}

}


void processSyncMessage() {

      if(Serial.available()>0 )
    {
      for(int i=0; i<2; i++) {
      hor=Serial.read();
      if( hor >= '0' && hor <= '9'){ 
      *hor2=hor;
      horas=atoi(hor2);
      }
     
    }
    //Serial.println(horas);
    }
}



O problema é que inserindo por exemplo 22 no serial monitor, o relógio apenas fica com o valor de horas 2, e eu nao percebo porquê.

Desde já obrigado.
Cumprimentos

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Sistema Rega Automático com interface VB
« Responder #1 em: 07 de Setembro de 2012, 15:44 »
Isso assim vai atrasar rapidamente.
O melhor é comprares um módulo "real time clock" ou então podes usar esta biblioteca:
http://arduino.cc/playground/Code/Time

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 1.883
Re: Sistema Rega Automático com interface VB
« Responder #2 em: 07 de Setembro de 2012, 16:00 »
Sim, sem um RTC não vais longe, comunicam via I²C e o acerto pode ser realizado por interface do arduino ao PC.
Deve-se manter o RTC em funcionamento quando o arduino está desligado, o consumo é insignificante pelo que funciona com pilha tipo botão de 3V ou supercap (em caso de falha de alimentação).

Offline danuca

  • Mini Robot
  • *
  • Mensagens: 31
Re: Sistema Rega Automático com interface VB
« Responder #3 em: 07 de Setembro de 2012, 16:33 »
Pois, mas não posso mesmo comprar o RTC, eu já tinha visto muito pessoal a dizer que era muito porreiro mas o máximo que posso fazer é usar a biblioteca TIMER. Eu também já tinha tentado fazer o relógio com a biblioteca Time, mas usando o exemplo que eles têm do TimeSerial, nao consigo acerta-lo.

Por exemplo: usando a biblioteca deles do TimeSerial, eles têm esta função que calcula o tempo:


void processSyncMessage() {
  // if time sync available from serial port, update time and return true
  while(Serial.available() >=  TIME_MSG_LEN ){  // time message consists of a header and ten ascii digits
    char c = Serial.read() ;
    Serial.print(c); 
    if( c == TIME_HEADER ) {       
      time_t pctime = 0;
      for(int i=0; i < TIME_MSG_LEN -1; i++){   
        c = Serial.read();         
        if( c >= '0' && c <= '9'){   
          pctime = (10 * pctime) + (c - '0') ; // convert digits to a number   
        }
      }   
      setTime(pctime);   // Sync Arduino clock to the time received on the serial port
    } 
  }
}

Só que esta função pelo que eu entendo transforma 10 caracteres ascii numa data e o que eu queria era que por exemplo ao escrever no serial monitor 23:10:00 12/12/2012
acertasse a hora, e nao como eles têm.

Obrigado pelas rápidas respostas.
Cumprimentos

Offline Sextafeira

  • Mini Robot
  • *
  • Mensagens: 75
Re: Sistema Rega Automático com interface VB
« Responder #4 em: 07 de Setembro de 2012, 17:04 »
uma duvida isso vais estar sempre ligado a um pc ? (ou seja para realizar a comunicação com o visual basic ?)

Offline danuca

  • Mini Robot
  • *
  • Mensagens: 31
Re: Sistema Rega Automático com interface VB
« Responder #5 em: 07 de Setembro de 2012, 17:08 »
Vai estar sempre ligado ao pc, mas se desligares o pc o objectivo é que ele continue a funcionar, daí eu precisar de fazer o relógio e as comparações no arduino. Ou seja, marcamos uma hora com o pc para ele regar, e mesmo despois do pc desligado, o objectivo é ele continuar a funcionar. Mas eu pra já apenas queria era fazer o relógio com o TimeSerial e conseguir acerta-lo.

Cumprimentos

Offline danuca

  • Mini Robot
  • *
  • Mensagens: 31
Re: Sistema Rega Automático com interface VB
« Responder #6 em: 07 de Setembro de 2012, 21:45 »
Boas

Consegui resolver o primeiro problema: ou seja, tennho um relógio e consigo programa-lo pelo serial monitor:

#include <Time.h> 


String readString;


void setup()  {
  Serial.begin(9600);
  Serial.println("Waiting for sync message");
}

void loop(){   
  if(Serial.available() )
  {
    processSyncMessage();
  }
  delay(1000);
  digitalClockDisplay();
 
 }
 
 
 void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}


void processSyncMessage() {
 
 
if(Serial.available() >=  8 ){
   char number1[3] = { Serial.read(), Serial.read() , ':'};
   Serial.read();//flush the delim
   char number2[3] = { Serial.read(), Serial.read() , ':' };
   Serial.read();//flush the delim
   char number3[3] = { Serial.read(), Serial.read() , '-' };
   Serial.read();//flush the delim
   char number4[3] = { Serial.read(), Serial.read() , '/' };
   Serial.read();//flush the delim
   char number5[3] = { Serial.read(), Serial.read() , '/' };
   Serial.read();//flush the delim
   char number6[5] = { Serial.read(), Serial.read() , Serial.read(), Serial.read(), '\0' };
 
   int number10=atoi(number1);
   Serial.println(number10);
   int number11=atoi(number2);
   Serial.println(number11);
   int number12=atoi(number3);
   Serial.println(number12);
   int number13=atoi(number4);
   Serial.println(number13);
   int number14=atoi(number5);
   Serial.println(number14);
   int number15=atoi(number6);
   Serial.println(number15);
   setTime(number10,number11,number12,number13,number14,number15);
 }
}


e com este programa fico com este output:
0:00:17 1 1 1970
0:00:18 1 1 1970
0:00:19 1 1 1970
22
10
2
9
10
2011
22:10:03 9 10 2011
22:10:04 9 10 2011
22:10:05 9 10 2011
22:10:06 9 10 2011

O problema é que agora eu precisava de enviar uma string pelo visual basic ( ex: uma textbox) e depois precisava de guardar essa string para depois o programa inicializar com o novo horário.

Alguém tem alguma ideia ?

Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Sistema Rega Automático com interface VB
« Responder #7 em: 07 de Setembro de 2012, 21:49 »
Acho que é melhor pores um botão (ou então mesmo no início do programa VB) com uma função que vê a hora do PC e envia-a para o Arduino.

Offline danuca

  • Mini Robot
  • *
  • Mensagens: 31
Re: Sistema Rega Automático com interface VB
« Responder #8 em: 07 de Setembro de 2012, 22:31 »
Sim e eu coloquei um botão no VB. Só que eu nao quero enviar a hora do pc para o arduino, apenas quero enviar uma string que acerta a hora.

Porque eu já tenho um relógio em arduino, que começa por defeito em 1970. Só que interessa-me agora que seja o utilizador e acertar o relógio, a dizer a que horas é que o sistema activa a rega, essas coisas.. mas isso em VB, para ser mais fácil para o utilizador.

Só que já fiz uma pesquisa e não encontro nada de como enviar uma string do VB para o arduino.


Offline Pedrock

  • Mini Robot
  • *
  • Mensagens: 279
Re: Sistema Rega Automático com interface VB
« Responder #9 em: 07 de Setembro de 2012, 22:36 »
Não sei se é bem isso que queres, mas não seria melhor acertar o relógio do Arduino com o do PC, e depois o utilizador dizia a que horas era para ligar? Horas estas que eram enviadas para o Arduino.
Quando ao enviar dados do VB.net para o Arduino, tens este tutorial aqui:
http://www.instructables.com/id/Using-Visual-Basic-to-control-Arduino-Uno/

Offline Sextafeira

  • Mini Robot
  • *
  • Mensagens: 75
Re: Sistema Rega Automático com interface VB
« Responder #10 em: 07 de Setembro de 2012, 22:45 »
acho que primeiro tens de fazer a leitura do relógio do arduino para uma label no visual basic e depois enviar o acerto para la.

eu também tive este problema mas acabei por resolver, sem querer eu comprei um Magalhães 10€ liguei la o arduino e estou a fazer uma aplicação com as comunicações serial e tcp/ip este é para depois comunicar com uma web form, e os tempos é dado pela minha aplicação em vb como esta sempre ligado

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 525
Re: Sistema Rega Automático com interface VB
« Responder #11 em: 07 de Setembro de 2012, 23:49 »
Para não estares sempre preocupado a ver a porta a que o arduino está ligado podes através da função Serialportx.getportnames() (não tenho a certeza se é assim, mas é algo parecido) e obter todas as portas seriais ligadas ao computador. Depois com um for loop envias para todas as portas um byte qualquer ou vários bytes.
Programas o arduino para quando receber x byte ou x bytes enviar outro byte/s de resposta e o software que criares vai identificar a porta a que o arduino está ligado assim. No outro dia fiz isto e ficou fixe, detectava sempre a porta. Acho que não guardei o código, mas não é complicado.

Offline danuca

  • Mini Robot
  • *
  • Mensagens: 31
Re: Sistema Rega Automático com interface VB
« Responder #12 em: 08 de Setembro de 2012, 16:19 »
Boas pessoal

Com as vossas sugestões estive a tentar concluir este problema mas não consegui.
O que eu queria para já, era enviar uma data e hora pelo Visual basic usando a porta série, e depois, usando o serial monitor do arduino, verificar se o meu relógio fica ou não acertado. Pelo que percebi é impossível, pois vai-me dar conflitos entre portas.

Porque como estou com o serial monitor aberto, ao carregar no botao que supostamente envia a hora do textbox ele da-me logo erro de conflitos de porta.

Alguém tem alguma solução para isto ?


Deixo aqui os dois programas de teste que estive a fazer:

VB

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SerialPort1.Close()

        SerialPort1.BaudRate = 9600

        SerialPort1.DataBits = 8

        SerialPort1.StopBits = IO.Ports.StopBits.One

        SerialPort1.Parity = IO.Ports.Parity.None

        SerialPort1.PortName = "COM7"





    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim horario As String
        horario = TextBox1.Text


        SerialPort1.Open()
        SerialPort1.Write("horario")
        SerialPort1.Close()


    End Sub
End Class

----------------------------------------------------------------//------------------------------------------------------------

ARDUINO

void setup()  {
  Serial.begin(9600);
  Serial.println("Waiting for sync message");
}


void loop(){   
  if(Serial.available() )
  {
    int val= Serial.read() - '0';
    Serial.println(val);
   }
  Serial.flush();
}


PEDROCK: o toturial que me deste tá muito porreiro, mas o gajo diz mesmo que para conseguir correr os programas, teve de deixar o serial monitor desligado, senao dáva conflitos.

Se alguém tiver alguma sugestão como dar a volta a isto agradecia.

Cumprimentos
   

Offline Sextafeira

  • Mini Robot
  • *
  • Mensagens: 75
Re: Sistema Rega Automático com interface VB
« Responder #13 em: 08 de Setembro de 2012, 16:22 »
porta fechada

   SerialPort1.Close()

mete em open ou primeiro fecha e abre a seguir

Online senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.100
  • Helpdesk do sitio
Re: Sistema Rega Automático com interface VB
« Responder #14 em: 08 de Setembro de 2012, 16:23 »
Não podes ter duas aplicações a aceder á mesma porta COM/serial, porque é que não lês o tempo no programa em VB ou então envias tudo pelo Monitor Serial, se bem que esse monitor não é grande coisa.
Avr fanboy