LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: magtaem 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
-
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;
-
Um muito obrigado pela dica irei testar e colocar um feedback.
Cumprimentos
-
Podes fazer uma coisa deste género (como exemplo, supõe que tens 3 valores que queres enviar):
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 (http://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)
-
Podes fazer uma coisa deste género (como exemplo, supõe que tens 3 valores que queres enviar):
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 (http://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á
-
Mais outra coisa pessoal, tenho o seguinte código:
#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
-
Split da string em VB.NET: http://www.dotnetperls.com/split-vbnet (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.
-
Split da string em VB.NET: http://www.dotnetperls.com/split-vbnet (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 :)
-
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.
-
Graças ao MSR , consegui resolver o problema do Flow sensor, um muito obrigado a quem em ajudou