collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Serial Call Response  (Lida 4755 vezes)

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

Offline magtaem

  • Mini Robot
  • *
  • Mensagens: 25
Serial Call Response
« em: 18 de Junho de 2014, 23:05 »
Boa noite caros amigos, tenho uma dúvida relativamente a obtenção de dados de vários sensores ao mesmo tempo no arduino. De que forma o posso fazer?
A linguagem que estou a utilizar é VB.Net .

Para retirar o valor de um sensor eu sei, faço um readline á serial port mas para retirar vários valores não sei, sou novato nisto do arduino e gostava de me instruir mais.

Desde já obrigado,

Cumprimentos
"O mundo pertence a quem se atreve"

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Serial Call Response
« Responder #1 em: 18 de Junho de 2014, 23:46 »
há várias maneiras de fazer, eu normalmente tendo a complicar as coisas.
Uma das maneiras é colocar um numero de indentificação no valor e no vb.net tiras.

Ou seja no arduino.
nr_sensor1 = 1000;
val_sensor1 = analog read(1);
Serial.print(nr_sensor1+val_sensor1);

no VB.NET
Ver se chegou alguma;
identificar sensor if val>=1000 <2000
retirar 1000 ao valor e já esta.

Agora em prencipio consegues enviar varios e apanhar e tratar no vb.net. Se quiseres envia tudo de num só Serial.print e separas por ; entre os valores e depois tratas da separação no vb ex:serial.print(nr_val_sensor";"nr_val_sensor2";"); 
No vb chega lá ex:1123;2022;3255 depois tiras e tens:

sensor 1 = 123;
sensor 2 = 022;
sensor3 = 233;

Offline magtaem

  • Mini Robot
  • *
  • Mensagens: 25
Re: Serial Call Response
« Responder #2 em: 18 de Junho de 2014, 23:57 »
Um muito obrigado pela dica irei testar e colocar um feedback.

Cumprimentos
"O mundo pertence a quem se atreve"

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: Serial Call Response
« Responder #3 em: 19 de Junho de 2014, 00:06 »
Podes fazer uma coisa deste género (como exemplo, supõe que tens 3 valores que queres enviar):

Código: [Seleccione]
char buf[64];
int val1,val2,val3;
sprintf(buf, "%d,%d,%d\n", val1, val2, val3);
Serial.print(buf);

Assim envias uma linha (terminada pelo caracter '\n') com três inteiros separados por virgulas.
Em VB.NET lês essa linha e fazes "split" indicando o caracter da virgula como elemento separador.

Um bocadinho offtopic, mas que te poderá vir a interessar:
Fica atento a isto: qkthings.com (uma nova plataforma que vai tornar esse tipo de interação entre hardware de baixos recursos, como o Arduino, e PCs/smartphones/tables, trivial)

Offline magtaem

  • Mini Robot
  • *
  • Mensagens: 25
Re: Serial Call Response
« Responder #4 em: 19 de Junho de 2014, 08:38 »
Podes fazer uma coisa deste género (como exemplo, supõe que tens 3 valores que queres enviar):

Código: [Seleccione]
char buf[64];
int val1,val2,val3;
sprintf(buf, "%d,%d,%d\n", val1, val2, val3);
Serial.print(buf);

Assim envias uma linha (terminada pelo caracter '\n') com três inteiros separados por virgulas.
Em VB.NET lês essa linha e fazes "split" indicando o caracter da virgula como elemento separador.

Um bocadinho offtopic, mas que te poderá vir a interessar:
Fica atento a isto: qkthings.com (uma nova plataforma que vai tornar esse tipo de interação entre hardware de baixos recursos, como o Arduino, e PCs/smartphones/tables, trivial)


Esse teu código tem lógica o problema é saber fazer o split no vb.net :)

Obrigado desde já
"O mundo pertence a quem se atreve"

Offline magtaem

  • Mini Robot
  • *
  • Mensagens: 25
Re: Serial Call Response
« Responder #5 em: 19 de Junho de 2014, 09:32 »
Mais outra coisa pessoal, tenho o seguinte código:
Código: [Seleccione]
#include <DHT11.h>

// É importante fazer a importação da library DH11, se o stor quiser testar não se esqueça de incluir.
#include <dht.h>

#define dht_dpin A1 //Pino DATA do Sensor ligado na porta Analogica A1

#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin

dht DHT; //Inicializa o sensor
int pirPin = 4; //digital 2

int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance


//----------GAS SENSOR-----------------



const int analogInPin = A2; 
       

int sensorValue = 0; 



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

//--------------------- FLOW SENSOR ------------------



volatile int NbTopsFan;            //measuring the rising edges of the signal
int Calc;
int hallsensor = 2;                //The pin location of the sensor

void rpm ()                        //This is the function that the interupt calls
{
  NbTopsFan++;                     //This function measures the rising and falling edge of signal
}                                  //The setup() method runs once, when the sketch starts




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

void setup()
{
  Serial.begin(9600);
  delay(1000);// 1 segundo de espera para aceder ao sensor( dados)
 pinMode(pirPin, INPUT);
pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 //--------------------- FLOW SENSOR ------------------
 
 
 
 pinMode(hallsensor, INPUT);       //initializes digital pin 2 as an input
 Serial.begin(9600);               //This is the setup function where the serial port is initialised
 attachInterrupt(0, rpm, RISING);  //and the interrupt is attached
 
 

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

}


void loop()
{
 
 
 
 
 
   
 
  //DISTANCE READER


/* The following trigPin/echoPin cycle is used to determine the
 distance of the nearest object by bouncing soundwaves off of it. */
 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
 //Calculate the distance (in cm) based on the speed of sound.
 distance = duration/58.2;
 
 if (distance >= maximumRange || distance <= minimumRange){
 /* Send a negative number to computer and Turn LED ON
 to indicate "out of range" */
 Serial.println("-1");

 }
 else {
 /* Send the distance to the computer using Serial protocol, and
 turn LED OFF to indicate successful reading. */
 Serial.println(distance);

 }
 
 //Delay 50ms before next reading.
 delay(50);

//--------------GAS SENSOR--------------------------

// read the analog in value:
  sensorValue = analogRead(analogInPin);           
  // determine alarm status
 // if (sensorValue >= 750)
  //{
    //Serial.print("ALERTA DE GAS");   
  //}
  //else
  //{
  //Serial.print("");   
  //}

  // print the results to the serial monitor:
  Serial.print("sensor = " );                       
  Serial.println(sensorValue);     


  delay(10);             


// - - - - - - - - - - - - - - - - -   
  DHT.read11(dht_dpin); //Lê as informações do sensor
  Serial.print("Humidade = ");
  Serial.print(DHT.humidity);
  Serial.print(" %  ");
  Serial.print("Temperatura = ");
  Serial.print(DHT.temperature);
  Serial.println(" Celsius  ");
 
  //Tempo a cada leitura
  delay(2000);
 
 
 
 
 
 
  int pirVal = digitalRead(pirPin);

  if(pirVal == LOW){ //Tem movimento
    Serial.println("movimento");
    delay(2000);
 
   //--------------------- FLOW SENSOR ------------------
 
 
 
  sei();                            //Enables interrupts
 delay (1000);                     //Wait 1 second
 cli();                            //Disable interrupts
 Calc = (NbTopsFan * 60 / 7.5);    //(Pulse frequency x 60) / 7.5Q = flow rate in L/hour
 Serial.print (Calc, DEC);         //Prints the number calculated above
 Serial.print (" L/hour\r\n");     //Prints "L/hour" and returns a new line
 
 
 // - - - - - - - - - - - - - - - - - 

 
}
}

Tudo funciona se eu retirar o código do flow sensor, mas quando o tenho incluido como é o caso, todo o outro código não funciona quando é detetado movimento ou quando é detetado algum valor no flow sensor.

O que será?

Já pensei que fosse o interrupt estar no pino errado, mas no arduino uno o pino 2 aceita interrupt.

Muito obrigado a todos o que me têm tentado ajudar
"O mundo pertence a quem se atreve"

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: Serial Call Response
« Responder #6 em: 19 de Junho de 2014, 12:19 »
Split da string em VB.NET: http://www.dotnetperls.com/split-vbnet

Em relação às interrupções, uma alternativa:
Faz enable das interrupções apenas uma vez no codigo (na função setup). Assim a função rpm é chamada sempre que haja interrupção. Utiliza uma variavel do tipo booleana (uma "flag") para decidires quando queres incrementar ou não o counter, ou fazer reset. Por exemplo, implementas estas funções:
rpm_reset(); // NbTopsFan = 0;
rpm_start_count(); // rpm_count = 1
rpm_stop_count(); // rpm_count = 0

E na rotina da interrupção ficas com:
void rpm()
{
 if(rpm_count)
  NbTopsFan++;
}

Como a instrução "pm_count = <valor>" não deve ser atómica (executar num unico ciclo de relogio - não tenho a certeza se é ou não, mas é boa prática fazer o seguinte) deves desactivar/activar as interrupções antes/depois dessa linha de código.

Offline magtaem

  • Mini Robot
  • *
  • Mensagens: 25
Re: Serial Call Response
« Responder #7 em: 19 de Junho de 2014, 14:07 »
Split da string em VB.NET: http://www.dotnetperls.com/split-vbnet

Em relação às interrupções, uma alternativa:
Faz enable das interrupções apenas uma vez no codigo (na função setup). Assim a função rpm é chamada sempre que haja interrupção. Utiliza uma variavel do tipo booleana (uma "flag") para decidires quando queres incrementar ou não o counter, ou fazer reset. Por exemplo, implementas estas funções:
rpm_reset(); // NbTopsFan = 0;
rpm_start_count(); // rpm_count = 1
rpm_stop_count(); // rpm_count = 0

E na rotina da interrupção ficas com:
void rpm()
{
 if(rpm_count)
  NbTopsFan++;
}

Como a instrução "pm_count = <valor>" não deve ser atómica (executar num unico ciclo de relogio - não tenho a certeza se é ou não, mas é boa prática fazer o seguinte) deves desactivar/activar as interrupções antes/depois dessa linha de código.

Obrigadão vou tentar fazer isso :)
"O mundo pertence a quem se atreve"

Offline magtaem

  • Mini Robot
  • *
  • Mensagens: 25
Re: Serial Call Response
« Responder #8 em: 19 de Junho de 2014, 14:55 »
Bem de volta, comecei a fazer aquilo que o msr me disse, mas tenho uma dúvida, e peço desculpa pela ignorância. A variavél boleana será aquela que deste no código ?

rpm_count?


Abraço.

"O mundo pertence a quem se atreve"

Offline magtaem

  • Mini Robot
  • *
  • Mensagens: 25
Re: Serial Call Response
« Responder #9 em: 19 de Junho de 2014, 18:54 »
Graças ao MSR , consegui resolver o problema do Flow sensor, um muito obrigado a quem em ajudou
"O mundo pertence a quem se atreve"