serial printer na mesma linha

Ola a todos,
sou o que se chama um verdadeiro iniciante (maçarico) :grin: por isso precisava da vossa ajuda para o seguinte:
tenho 3 sensores de temperatura (DS18B20) se estão a criar um ficheiro .txt de x em x segundos, agora precisava da vossa ajuda para o seguinte, em vez de ter as leituras de cada sensor na sua linha ou todos de seguida (horizontal), queria ter uma linha com os 3 valores, a proxima leitura na linha por baixo e assim sucessivamente.
neste momento uso este código que me faz os 3 valores na mesma linha, mas os seguintes, ficam a seguir e não mudam de linha

{
delay(10000);
// Serial.print("Lendo temperaturas...\n\r");
sensors.requestTemperatures();

// Serial.print("Temperatura Sensor 1: ");
printTemperature(insideThermometer);
Serial.print(" \r");
// Serial.print("Temperatura Sensor 2: ");
printTemperature(outsideThermometer);
Serial.print(" \r");
//Serial.print("Temperatura Sensor 3s: ");
printTemperature(dogHouseThermometer);
Serial.print(" \r");
}

o serial printer :

31.25 33.00 34.75 31.25 33.00 34.75 31.25 33.00 34.75 31.25 33.00 34.75

Alguma idea ?

obrigado

{ 
  delay(10000);
 // Serial.print("Lendo temperaturas...\n\r");
  sensors.requestTemperatures();
  
// Serial.print("Temperatura Sensor 1: ");
 printTemperature(insideThermometer);
 Serial.println();
 // Serial.print("Temperatura Sensor 2: ");
  printTemperature(outsideThermometer);
Serial.println();
  //Serial.print("Temperatura Sensor 3s: ");
  printTemperature(dogHouseThermometer);
Serial.println();
}

Boas @bubulindo

mas não funciona !! fica assim :

30.25
32.50
31.00
30.25
32.50
31.00

o que eu pretendia era algo assim :

30.25 32.50 31.00
30.25 32.50 31.00

{ 
  delay(10000);
 // Serial.print("Lendo temperaturas...\n\r");
  sensors.requestTemperatures();
  
// Serial.print("Temperatura Sensor 1: ");
 printTemperature(insideThermometer);
 Serial.print(" ");
 // Serial.print("Temperatura Sensor 2: ");
  printTemperature(outsideThermometer);
Serial.print(" ");
  //Serial.print("Temperatura Sensor 3s: ");
  printTemperature(dogHouseThermometer);
Serial.println();
}

:slight_smile: és uma maquina, funciona as mil maravilhas

obrigado

Boas,
estou a ficar maluco com isto, então como é que é possivel que os dados na "serial port" do arduino softw. em xp saiam todos direitinhos, mas depois
quando ligo o arduino a pc linux com o comando CAT, os mesmos não saiam iguais.
Passo a explicar, estou a construir um interface com o famoso DS18B20 que neste caso são 3 sensores, tudo funciona certinho em xp com a consola do arduino softw.
Já quando ligo o arduino ao linux e faço um cat a porta serie, só recebo informação de 1 sensor, assim :

Erro ao ler temperatura ! Erro ao ler temperatura ! 22.00
23.75 77.06 Erro ao ler temperatura !

alguem me consegue explicar o que possa ser ?
obrigado

Se meteres aqui o código, facilita imenso...

No entanto, o simples facto que tu consegues receber strings inteiras leva-me a crer que o problema está no circuito dos DS18B20 e não na porta série...

Boas,
mas se fosse dos DS,s como é que funciona em xp e depois em linux não ?
o código é este :

// Programa : Leitor temperatura sensores DS18B20
// Alterações : Arduino & Cia
// Este programa usa o endereço físico de cada sensor para mostrar as
// informações de temperatura no Serial Monitor

#include <OneWire.h>
#include <DallasTemperature.h>

// Conectar o pino central dos sensores ao pino 10 do Arduino
#define ONE_WIRE_BUS 10

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature
DallasTemperature sensors(&oneWire);

DeviceAddress sondaExterior = { 0x28, 0x86, 0x0F, 0xEF, 0x04, 0x00, 0x00, 0x64 };
DeviceAddress sondaAQS = { 0x28, 0x27, 0x9C, 0xEE, 0x04, 0x00, 0x00, 0x79 };
DeviceAddress sondaPaineis = { 0x28, 0xB6, 0x55, 0x8E, 0x04, 0x00, 0x00, 0xBE };

void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(sondaExterior, 10);
sensors.setResolution(sondaAQS, 10);
sensors.setResolution(sondaPaineis, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Erro ao ler temperatura !");
} else {
//Serial.print("C: ");
Serial.print(tempC);
// Serial.print(" F: ");
// Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}

void loop(void)
{
delay(5000);
//Serial.print("Lendo temperaturas...\n\r");
sensors.requestTemperatures();

// Serial.print("Temperatura Sensor 1: ");
printTemperature(sondaExterior);
Serial.print(" ");
// Serial.print("Temperatura Sensor 2: ");
printTemperature(sondaAQS);
Serial.print(" ");
//Serial.print("Temperatura Sensor 3s: ");
printTemperature(sondaPaineis);
Serial.println();

Ola colega
O que dizes não pode estar correcto.Algo te esta a escapar mesmo debaixo do teu nariz.Se dizes que no xp funciona então no linux também tem de dar.Antes de mais faz estes testes
Dizes que no Xp da no arduino soft(presumo que te refiras ao IDE do arduino) então e que tal testares no putty abrindo la a porta Serie?(Conheces o putty? http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe) Saca, escolhes porta serie colocas o numero da serie e defines o baud.
Se ai der igual ok, tens garantido que no xp esta tudo a dar ok.
Agora no linux em vez do CAT instala o GTKTERM (apt-get install gtkterm) e executa em modo root e abre a tty correcta (talvez TTY.USB0) se fores a lista das configuraçoes a porta aparece la.Confirmas o baud e abres
Agora faz as tuas comparaçoes e tira as conclusoes
O teu código parece estar correcto, assim a primeira vista não vejo nada de grave para que isso pudesse acontecer ...

Eu bem me parecia que reconhecia esse comando... cat não é para concatenar ficheiros?
Como é que o cat sabe a tua baud, paridade, etc, etc???

Como é que o cat se comporta quando atinge o fim do ficheiro?

Notas que entre algumas leituras tens menos de 5 segundos de intervalo?

Tens o reset da placa ligado, suponho... já pensaste em adicionar isto:

Serial.println("Setup succeeded");

no final da tua funcão de setup()?

Eu bem me parecia que reconhecia esse comando... cat não é para concatenar ficheiros?

Correctissimo

cat - concatenate files and print on the standard output

Eu no maximo se fosse para ver o que se passava na serial em linha de comandos usaria o screen

screen /dev/ttyUSB0 9600

Ja agora é uma questao pertinente porque é que estas a usar o CAT para veres o output stream do dispositivo Serial?

HugoPT:
Ja agora é uma questao pertinente porque é que estas a usar o CAT para veres o output stream do dispositivo Serial?

A internet está cheia de gente a recomendar o cat... se bem que a recomendacão não termina no cat... estende-se ao stty para configurar a ligacão. Se não me engano existe uma opcão para desligar o DTR que activa o reset.

Boas vocês deixaram me todo baralhado eheheheh

Realmente o CAT pode não ser o comando mais correto para fazer a escuta da serial, mas funciona com os 3 sensores na bancada ...
agora o que realmente mudou (e está debaixo do meu nariz) é que estou a usar uma só resistência junto ao arduino. e na bancada usava uma para cada e todos a mesma distancia. Agora tenho os sensores dispersos pelo cabo, ou seja não estão todos a mesma distancia !!!! hoje vou adicionar uma R 4k7 junto a cada sensor e ver o resultado.

Já agora obrigado pelas vossas respostas são sempre úteis

Realmente tendo por base uma assumpção errada, só com sorte é que te podemos ajudar.

bubulindo:

HugoPT:
Ja agora é uma questao pertinente porque é que estas a usar o CAT para veres o output stream do dispositivo Serial?

A internet está cheia de gente a recomendar o cat... se bem que a recomendacão não termina no cat... estende-se ao stty para configurar a ligacão. Se não me engano existe uma opcão para desligar o DTR que activa o reset.

eu uso este script para criar um log com as temperaturas registadas !! (não sei se será o mais correto, mas funciona)

#!/bin/bash
exec 3<> /dev/ttyACM0
sleep 1
cat <&3>> /var/www/ardu/logtmp
exec 3>&-

Mas continuo achar que o problema está mesmo no linux, Eu estou a usar o Centos5 contra o XP onde tudo corre bem, Logo vou ter que me virar mesmo para o linux e usar outro comando que não o cat de forma a poder gerir as velocidades do baud rate etc de forma a conseguir as leituras sem erros.
outra coisa que me ocorre pode ser o tempo de resposta dos DS´s ...

Podes estar a sofrer de autoreset provocado por cada vez que o cat "Abre a porta"
Tenta colocar como um led a acender 1 segundo e depois apaga-lo no void setup() para veres visualmente se ele esta a reniciar.
Se estiver desactiva o auto-reset (coloca uma resistencia de 120 ohms entre o pino de reset e o VCC do arduino)

Estou a ficar doido :drooling_face:

Alguem me consegue explicar o porque ?

o codigo corre uma maravilha num pc com o putty a fazer escuta ao arduino, basta mudar para o pc com
o linux faço escuta a porta com o cat, ou o picocom e destrambelha logo :~

Já andei a tentar mexer nos delays do onewire.cpp, mas não percebi muito bem onde tinha de mexer ...
mas cada vez chego mais a conclusão que o problema será mesmo das maquinas !!!

que mer****** :0

ardu.JPG

bubulindo:
Tens o reset da placa ligado, suponho... já pensaste em adicionar isto:

Serial.println("Setup succeeded");

no final da tua funcão de setup()?

bubulindo:

bubulindo:
Tens o reset da placa ligado, suponho... já pensaste em adicionar isto:

Serial.println("Setup succeeded");

no final da tua funcão de setup()?

Boas,
Já tinha visto o teu comentário antes, já usei uma resitencia de 120ohm entre o reset e o vcc, no codigo ainda não adicionei pois não sei bem onde
adicionar :frowning:

bubulindo:
Tens o reset da placa ligado, suponho... já pensaste em adicionar isto:

Serial.println("Setup succeeded");

no final da tua funcão de setup()?

// Programa : Leitor temperatura sensores DS18B20
// Alterações : Arduino & Cia
// Este programa usa o endereço físico de cada sensor para mostrar as 
// informações de temperatura no Serial Monitor

#include <OneWire.h>
#include <DallasTemperature.h>

// Conectar o pino central dos sensores ao pino 10 do Arduino
#define ONE_WIRE_BUS 10

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature
DallasTemperature sensors(&oneWire);

DeviceAddress sondaExterior = { 0x28, 0x86, 0x0F, 0xEF, 0x04, 0x00, 0x00, 0x64 };
DeviceAddress sondaAQS = { 0x28, 0x27, 0x9C, 0xEE, 0x04, 0x00, 0x00, 0x79 };
DeviceAddress sondaPaineis = { 0x28, 0xB6, 0x55, 0x8E, 0x04, 0x00, 0x00, 0xBE };

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
 sensors.setResolution(sondaExterior, 10);
 sensors.setResolution(sondaAQS, 10);
 sensors.setResolution(sondaPaineis, 10);



//ISTO É O FINAL DA TUA FUNÇÃO DE SETUP...
Serial.println("Setup succeeded");
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Erro ao ler temperatura !");
  } else {
   //Serial.print("C: ");
   Serial.print(tempC);
  //  Serial.print(" F: ");
 //   Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{ 
  delay(5000);
  //Serial.print("Lendo temperaturas...\n\r");
  sensors.requestTemperatures();
  
// Serial.print("Temperatura Sensor 1: ");
 printTemperature(sondaExterior);
 Serial.print(" ");
 // Serial.print("Temperatura Sensor 2: ");
  printTemperature(sondaAQS);
Serial.print(" ");
  //Serial.print("Temperatura Sensor 3s: ");
  printTemperature(sondaPaineis);
Serial.println();