Hi everyone, need your very important help again... i have a ultrasonic sensor from Maxbotix(mb7060) which output delivers asynchronous serial with an RS232 format, except voltages are 0-Vcc. The output is an ASCII capital “R”, followed by three ASCII character digits representing the range in centimeters up to a maximum of 765, followed by a carriage return (ASCII 13). The baud rate is 9600, 8 bits, no parity, with one stop bit.
Because of RS232 format with TTL level (5 volts its a '0' and 0 volts its a '1') i have to put an TTL inverter to invert this voltages to arduino to understand it when it receives the readings on RX pin.
Sometimes i get some strange characters reading (maybe because i was disable the sensor in the middle of reading sended by sensor) so i make some changes in my code, that follows:
#include <SPI.h>
#include <VirtualWire.h>
#define TEMPO_LIMITE 200 //Tempo de espera por dados na serie
//DECLARAÇÃO DAS VARIÁVEIS GLOBAIS
//ENABLE/DISABLE PARA O SENSOR
const int sensor = 7;
//LED'S
const int ledTransmissao = 4;
const int ledActivacao = 5;
//ENABLE/DISABLE DO TRANSMISSOR E PINO DE TRANSMISSÃO
const int pinoTransmissao = 8;
const int pinoActTransm = 3;
//VARIÁVEL QUE GUARDA A MENSAGEM A TRANSMITIR
char mensagem[5];
//VARIÁVEIS PARA DADOS LIDOS DO SENSOR
int dados;
char buffer[4];
boolean estado = false;
unsigned long inicioContagem;
void setup(){
//DEFINIÇÃO DOS PINOS DE ENTRADA E DE SAÍDA
pinMode(sensor, OUTPUT);
pinMode(ledTransmissao, OUTPUT);
pinMode(ledActivacao, OUTPUT);
digitalWrite(sensor, LOW);
//digitalWrite(pinoActTransm, LOW);
digitalWrite(ledTransmissao, LOW);
digitalWrite(ledActivacao, LOW);
//CONFIGURAÇÃO DO VIRTUALWIRE -TRANSMISSÃO-
vw_set_tx_pin(pinoTransmissao);
vw_set_ptt_pin(pinoActTransm);
vw_setup(2000); //VELOCIDADE DE TRANSMISSÃO DE 2000 BITS POR SEGUNDO
//INICIAR A UART PARA DEBUG
Serial.begin(9600);
delay(1000);
}
void loop() {
//ENABLE DO SENSOR E LED DE ACTIVAÇÃO LIGADO
digitalWrite(sensor, HIGH);
digitalWrite(ledActivacao, HIGH);
//LEITURA DOS DADOS ENVIADOS PELO SENSOR
inicioContagem = millis();
while ((Serial.available () < 5) && ((millis() - inicioContagem) < TEMPO_LIMITE))
{
//Espera que o buffer tenha pelo menos 5 bytes para ler e que não demore mais que 1 segundo
}
if (Serial.available() < 5) {
Serial.println("Não foram recebidos 5 bytes de dados");
Serial.flush();
delay(5000);
} else {
char c = Serial.read();
if (c == 'R') {
Serial.readBytesUntil ('\r', &buffer[0], 4);
//DISABLE DO SENSOR E LED DE ACTIVAÇÃO DESLIGADO
digitalWrite(sensor, LOW);
digitalWrite(ledActivacao, LOW);
Serial.flush();
dados = atoi (buffer); //CONVERSÃO DOS DADOS RECEBIDOS PARA VALORES INTEIROS
//ENVIO PARA A SÉRIE DO VALOR, PARA DEPURAÇÃO
Serial.print("BUFFER:");
Serial.print(buffer);
Serial.print(" ");
Serial.print("DADOS:");
Serial.println(dados);
memset(&buffer, 0, sizeof(buffer)); //LIMPEZA DO BUFFER
Serial.print("BUFFER:");
Serial.println(buffer);
/*VERIFICAÇÃO SE OS DADOS RECEBIDOS DO SENSOR SÃO VÁLIDOS. O MÁXIMO
VALOR É 465 -ALTURA MÁXIMA DA ÁGUA- E O MÍNIMO É ZERO -TANQUE VAZIO-*/
if(dados >= 1 && dados <= 465) {
mensagem[0] = 'R';
itoa (dados, &mensagem[1], 10);
Serial.print("MENSAGEM A TRANSMITIR:");
Serial.println(mensagem);
//LED DE TRANSMISSÃO ACTIVA LIGADO
digitalWrite(ledTransmissao, HIGH);
//ENVIO DA MENSAGEM 2 VEZES PARA GARANTIR QUE É RECEBIDA
for (int i = 0; i<2; i++) {
vw_send ((uint8_t*)mensagem, strlen(mensagem)); //ENVIO DA MENSAGEM
vw_wait_tx(); //ESPERA QUE MENSAGEM SEJA TOTALMENTE ENVIADA
delay(2000);
}
digitalWrite(ledTransmissao, LOW);
memset(&mensagem, 0, sizeof(mensagem)); //LIMPA O BUFFER DA MENSAGEM ENVIADA
}
//LED DE TRANSMISSÃO ACTIVA DESLIGADO
Serial.print("MENSAGEM:");
Serial.println(mensagem);
Serial.flush();
delay(5000);
}
}
}
/*FIM DO PROGRAMA*/
I expected to get good data from serial, but sometimes it doesn't.
I'm asking if you could help me to do some changes to the code to prevent receiving strange characters.
Adding to this i realize that somethimes i get in serial monitor the same reads (like 8 or 9 times) even pointing sensor to another object at another distance... Got no clues at this time that what could be do this.
Thanks in advance!