collapse

* Links de Robótica

* Posts Recentes

Ligar Células de Lithium por Hugu
[Hoje às 02:00]


Encomenda Colectiva N3-2016[@Mouser - Aberta a pedidos!] por Hugu
[Hoje às 01:53]


Printer 3D barata por xmatias
[Ontem às 03:56]


Servidor por almamater
[09 de Dezembro de 2016, 21:39]


mysql server error por andre_f_carvalho
[09 de Dezembro de 2016, 18:56]


Cortar plástico ABS por msr
[05 de Dezembro de 2016, 17:27]


MOVIDO: FPV Drone Racing? por metRo_
[05 de Dezembro de 2016, 10:49]


Módulo gsm por dio123
[04 de Dezembro de 2016, 23:06]


Procuro resistências 220 Ohm de 1% por brunus
[02 de Dezembro de 2016, 15:50]


Package de cond 10uF 35V smd? por KammutierSpule
[02 de Dezembro de 2016, 11:19]

Autor Tópico: Iniciante - juntar codigos  (Lida 8472 vezes)

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

barrma

  • Visitante
Iniciante - juntar codigos
« em: 16 de Janeiro de 2015, 16:43 »
Boa tarde a todos,

Estou a tentar desenvolver um pequeno projecto, que tem como objectivo, controlar temperaturas de um aquário. Controlar equipamentos através de reles e botões em um tft touch.

Para muitos  isto não é difícil,  mas na verdade eu não estou a conseguir adaptar os códigos que encontrei, já testei o RTC, TFT, e o sensor de temperatura. Todos funcionam e estão actualmente ligados no arduino mega.  Ainda não tenho os reles, mas isso não me preocupa agora. 


A duvida que tenho é como vou adaptar os códigos, tenho o código do layout ou da "primeira página", onde vou colocar a data, hora e temperatura. 

O problema é que não estou a conseguir juntar estes códigos. Deixo aqui um exemplo do que pretendo fazer e os códigos que tenho. Quem me poder ajudar a juntar os códigos agradecia.

Obrigado


Código: [Seleccione]
Código do layout:


#include <UTFT.h>


extern uint8_t SmallFont[];

UTFT myGLCD(ITDB32S,38,39,40,41);   
void setup()
{
  randomSeed(analogRead(0));
 

  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
}

void loop()
{
  int buf[318];
  int x, x2;
  int y, y2;
  int r;


  myGLCD.clrScr();

  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 319, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print(" Data     Relogio    Temperatura", CENTER, 1);
 

  delay (10000);
}


Sensor da temperatura:

 
#include <OneWire.h>

const int sensors = 1; //number of temperature sensors on the bus
int sensors_pin = 10; //the pin where the bus its connected to arduino
uint8_t sensors_address[sensors][8]; //here will store the sensors addresses for later use

OneWire  sensor_bus(sensors_pin);

float get_temperature (uint8_t *address);

void setup(void) {
  Serial.begin(9600);
  int x,y,c=0;
  Serial.println("Starting to look for sensors...");
  for(x=0;x<sensors;x++){
    if(sensor_bus.search(sensors_address[x]))
      c++;
  }
  if(c > 0) {
    Serial.println("Found this sensors : ");
    for(x=0;x<sensors;x++) {
      Serial.print("\tSensor ");
      Serial.print(x+1);
      Serial.print(" at address : ");
      for(y=0;y<8;y++){
        Serial.print(sensors_address[x][y],HEX);
        Serial.print(" ");
      }
      Serial.println();
    }
  } else
    Serial.println("Didn't find any sensors");
}

void loop(void) {
   
    for(int x=0;x<sensors;x++) {
      Serial.print("Sensor ");
      Serial.print(x+1);
      Serial.print(" ");
      Serial.print(get_temperature(sensors_address[x]));
      Serial.println(" C");
    }
    delay(2000);
}

float get_temperature(uint8_t *address) {
  byte data[12];
  int x;
  sensor_bus.reset();
  sensor_bus.select(address);
  sensor_bus.write(0x44,1);
 
  sensor_bus.reset();
  sensor_bus.select(address);
  sensor_bus.write(0xBE,1);
 
  for(x=0;x<9;x++){
    data[x] = sensor_bus.read();
  }
   
  unsigned short tr = data[0];
  tr = tr + data[1]*256;
 
    //For testing purpuses only
  /*
  for(x=0;x<9;x++){
    Serial.print(data[x],DEC );
    Serial.print(" ");
  }
 
  Serial.print(" tr=");
  Serial.print(tr, DEC);
  Serial.print("; ");
  */
 
  if(tr > 0xF000){
    tr = 0 - tr;
  }
 
 
  float temperature = (float)tr*(float)0.0625 ;

  return temperature;
}


Relógio:
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  setDS3231time(30,47,18,5,15,01,15);
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  // setDS3231time(30,40,18,5,26,11,14);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Dia da Semana: ");
  switch(dayOfWeek){
  case 1:
    Serial.println("Dom");
    break;
  case 2:
    Serial.println("Seg");
    break;
  case 3:
    Serial.println("Ter");
    break;
  case 4:
    Serial.println("Qua");
    break;
  case 5:
    Serial.println("Qui");
    break;
  case 6:
    Serial.println("Sex");
    break;
  case 7:
    Serial.println("Sab");
    break;
  }
}
void loop()
{
  displayTime(); // display the real-time clock data on the Serial Monitor,
  delay(1000); // every second
}





« Última modificação: 17 de Janeiro de 2015, 18:25 por barrma »

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 2.843
    • Tróniquices
Re: Iniciante - juntar codigos
« Responder #1 em: 16 de Janeiro de 2015, 17:17 »
Tens literalmente que fundir tudo. Juntar todas as declarações no mesmo programa, fundir o conteúdo dos setup() e o dos loop() num só, acrescentar todas as restantes funções dos vários programas no mesmo. Ficarão adaptações para fazer dentro da loop. Mas para esta tarefa precisas de saber programar; este projecto é bastante avançado para alguém no teu nível de conhecimento, devias começar por coisas mais simples.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 2.843
    • Tróniquices
Re: Iniciante - juntar codigos
« Responder #2 em: 16 de Janeiro de 2015, 17:57 »
Se tiveres alguma pergunta mais especifica.... força!

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 2.843
    • Tróniquices
Re: Iniciante - juntar codigos
« Responder #3 em: 16 de Janeiro de 2015, 18:11 »
Tens que procurar que funções é que a biblioteca do LCD tem para imprimir texto ou números no LCD. Parece que existe a print, terás que ver que outras existem, nomeadamente para imprimir números. Se não tiver funções para imprimir números, então tens que converter os teus números para texto (string) e depois já podes usar as funções de texto. Depois é mais ou menos traduzir o que tens para a porta série (os Serial.print....) para chamadas às funções do LCD.

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #4 em: 16 de Janeiro de 2015, 18:58 »
Boas,

Se bem entendi, o que queres é que a data hora que é escrita no serial que vem da função displayTime() passe para o display certo?

Se for isso é relativamente simples, o que tens de fazer, é:

Alterar o tipo de void para string da função displayTime()
Seguidamente, crias uma variavel dentro da funcao para ir "colando" os dados. (no codigo chamei de buf)
Alterei a função abaixo com a variavel buf incluida para construir a "frase" para enviar para o ecra. (acho que esta tudo, mas pode faltar alguma coisa que me tenha escapado visto que aqui não consigo testar).
E no fim devolves essa string como resultado.

Se substituires a função que coloquei abaixo, pela do teu codigo (e eventualmente corrigir algum erro que possa ter deixado)

basta chamares no LOOP a seguinte linha :

 myGLCD.print(displayTime(), CENTER, 1) ;

Isto deve resolver o teu problema.

P.S. - Deixei o texto que inclui na função "desindentado" para veres o que adicionei.

Código: [Seleccione]

String displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
String buf = "";
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
buf += hour;
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
buf += ":";
  if (minute<10)
  {
    Serial.print("0");
buf += "0";
  }
  Serial.print(minute, DEC);
buf += minute;
  Serial.print(":");
buf += ":";
  if (second<10)
  {
    Serial.print("0");
buf += "0";
  }
  Serial.print(second, DEC);
buf += second;
  Serial.print(" ");
buf += " ";
  Serial.print(dayOfMonth, DEC);
buf += dayOfMonth;
  Serial.print("/");
buf += "/";
  Serial.print(month, DEC);
buf += month;
  Serial.print("/");
buf += "/";
  Serial.print(year, DEC);
buf += year;
  Serial.print(" Dia da Semana: ");
buf += " Dia da Semana: ";
  switch(dayOfWeek){
  case 1:
    Serial.println("Dom");
buf += "Dom";
    break;
  case 2:
    Serial.println("Seg");
buf += "Seg";
    break;
  case 3:
    Serial.println("Ter");
buf += "Ter";
    break;
  case 4:
    Serial.println("Qua");
buf += "Qua";
    break;
  case 5:
    Serial.println("Qui");
buf += "Qui";
    break;
  case 6:
    Serial.println("Sex");
buf += "Sex";
    break;
  case 7:
    Serial.println("Sab");
buf += "Sab";
    break;
  }
return buf;
}
« Última modificação: 16 de Janeiro de 2015, 19:02 por MRData »
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #5 em: 16 de Janeiro de 2015, 19:48 »
Falta-te a linha que adicionei aqui no teu codigo a seguir

      Serial.print(get_temperature(sensors_address));
buf += get_temperature(sensors_address);

E tambem tens de colocar a linha return buf; na ultima linha da função.
No pode ficar a meio, essa tem de ser a ultima linha de codigo daquela função sempre.
« Última modificação: 16 de Janeiro de 2015, 19:50 por MRData »
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #6 em: 16 de Janeiro de 2015, 20:38 »
Troca a função por esta.

String displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
String buf = "";
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
buf += hour;
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
buf += ":";
  if (minute<10)
  {
    Serial.print("0");
buf += "0";
  }
  Serial.print(minute, DEC);
buf += minute;
  Serial.print(":");
buf += ":";
  if (second<10)
  {
    Serial.print("0");
buf += "0";
    buf += "0";
  }
  Serial.print(second, DEC);
buf += second;
  Serial.print(" ");
buf += " ";
  Serial.print(dayOfMonth, DEC);
buf += dayOfMonth;
  Serial.print("/");
buf += "/";
  Serial.print(month, DEC);
buf += month;
  Serial.print("/");
buf += "/";
  Serial.print(year, DEC);
buf += year;
  Serial.print(" ");
buf += " ";
  switch(dayOfWeek){
  case 1:
    Serial.println("Domingo");
buf += "Domingo";
    break;
  case 2:
    Serial.println("Segunda");
buf += "Segunda";
    break;
  case 3:
    Serial.println("Terça");
buf += "Terça";
    break;
  case 4:
    Serial.println("Quarta");
buf += "Quarta";
    break;
  case 5:
    Serial.println("Quinta");
buf += "Quinta";
    break;
  case 6:
    Serial.println("Sexta");
buf += "Sexta";
    break;
  case 7:
    Serial.println("Sabado");
buf += "Sabado";
    break;
  }

buf += "\r\n";

for(int x=0;x<sensors;x++) {
      Serial.println("Sensor ");
buf += "Sensor ";
      break;
     
      Serial.print(x+1);
buf += x+1;
      Serial.print(" ");
buf += " ";
      Serial.print(get_temperature(sensors_address));
buf += get_temperature(sensors_address);

      Serial.println(" C");
buf += " C\r\n";
    }
    delay(2000);
return buf;
}
« Última modificação: 16 de Janeiro de 2015, 20:42 por MRData »
"We are legion"

StarRider

  • Visitante
Re: Iniciante - juntar codigos
« Responder #7 em: 16 de Janeiro de 2015, 21:02 »

Numa linguagem normal (expecto C#) essa função nunca vai funcionar, pelo simples facto
de que a variável "buf" declarada dentro da função "displayTime" sai fora de scope assim que
a função retorna, o que faz com que o seu destructor seja chamado e o espaço de memória que
a mesma ocupava no stack seja reclamado.
Logo, essa função "displayTime" retorna um ponteiro (em C uma referencia a um membro de
a classe é um ponteiro para esse mesmo membro) para uma zona de memória onde ESTAVA
esse tal "buf". Por vezes pode parecer funcionar pois possivelmente o stack onde estava o
membro da classe String pode ainda não ter sido reutilizado e o seu conteúdo ainda reflecte o
conteúdo da "buf", mas basta existir uma outra chamada a uma qualquer função entretanto e pufff.

O "arduino" faz uma implementação do C++ "estranha", não tem o operador "new" nem "delete" e
como não tem um garbage collector sofisticado como o C# , assumo que o compilador por detrás
(avr-gcc) tem o comportamento que descrevi ...

Abraços,
PA

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #8 em: 16 de Janeiro de 2015, 21:15 »

Numa linguagem normal (expecto C#) essa função nunca vai funcionar, pelo simples facto
de que a variável "buf" declarada dentro da função "displayTime" sai fora de scope assim que
a função retorna, o que faz com que o seu destructor seja chamado e o espaço de memória que
a mesma ocupava no stack seja reclamado.
Logo, essa função "displayTime" retorna um ponteiro (em C uma referencia a um membro de
a classe é um ponteiro para esse mesmo membro) para uma zona de memória onde ESTAVA
esse tal "buf". Por vezes pode parecer funcionar pois possivelmente o stack onde estava o
membro da classe String pode ainda não ter sido reutilizado e o seu conteúdo ainda reflecte o
conteúdo da "buf", mas basta existir uma outra chamada a uma qualquer função entretanto e pufff.

O "arduino" faz uma implementação do C++ "estranha", não tem o operador "new" nem "delete" e
como não tem um garbage collector sofisticado como o C# , assumo que o compilador por detrás
(avr-gcc) tem o comportamento que descrevi ...

Abraços,
PA

StarRider,

Até te podia dar alguma razão simplesmente pela forma como eu lhe disse para chamar a função, mas....
Primeiro o metodo devolve uma string (não é do tipo void), logo passa para a "main" o pointer para o buf.
Segundo e se realmente isso fosse um issue, bastava ele fazer " String newbuf = displayTime(); " e "copiava" a referencia do pointer para a nova variavel, depois fazendo o print, caso alguma vez falhasse...
Terceiro, como passa a função como ref para o pointer, para uma outra função que vai escrever o conteudo num display, mesmo que perca o conteudo da var, ela já vai estar escrita e não é usada para nada.

Que era o que ele queria.

Seja como for, ele disse que testou e funcionou, depois quis adicionar a temperatura e deixou de funcionar porque ele colocou as coisas de forma errada.
« Última modificação: 16 de Janeiro de 2015, 21:20 por MRData »
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #9 em: 16 de Janeiro de 2015, 21:15 »
MRData, Agora dá erro na compilação  :( o melhor é ir jantar e voltar com mais paciência :D obrigado a todos pela ajuda!
Código: [Seleccione]
#include "Wire.h"
#include <UTFT.h>
#include <OneWire.h>


extern uint8_t SmallFont[];

#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
const int sensors = 1; //number of temperature sensors on the bus
int sensors_pin = 10; //the pin where the bus its connected to arduino
uint8_t sensors_address[sensors][8]; //here will store the sensors addresses for later use

OneWire  sensor_bus(sensors_pin);

float get_temperature (uint8_t *address);


UTFT myGLCD(ITDB32S,38,39,40,41);

byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  setDS3231time(30,21,19,6,6,01,15);
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  // setDS3231time(30,40,18,5,26,11,14);
  randomSeed(analogRead(0));


  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);

  int x,y,c=0;
  Serial.println("Starting to look for sensors...");
  for(x=0;x<sensors;x++){
    if(sensor_bus.search(sensors_address[x]))
      c++;
  }
  if(c > 0) {
    Serial.println("Found this sensors : ");
    for(x=0;x<sensors;x++) {
      Serial.print("\tSensor ");
      Serial.print(x+1);
      Serial.print(" at address : ");
      for(y=0;y<8;y++){
        Serial.print(sensors_address[x][y],HEX);
        Serial.print(" ");
      }
      Serial.println();
    }
  }
  else
    Serial.println("Didn't find any sensors");
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

String displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  String buf = "";
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  buf += hour;
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  buf += ":";
  if (minute<10)
  {
    Serial.print("0");
    buf += "0";
  }
  Serial.print(minute, DEC);
  buf += minute;
  Serial.print(":");
  buf += ":";
  if (second<10)
  {
    Serial.print("0");
    buf += "0";
    buf += "0";
  }
  Serial.print(second, DEC);
  buf += second;
  Serial.print(" ");
  buf += " ";
  Serial.print(dayOfMonth, DEC);
  buf += dayOfMonth;
  Serial.print("/");
  buf += "/";
  Serial.print(month, DEC);
  buf += month;
  Serial.print("/");
  buf += "/";
  Serial.print(year, DEC);
  buf += year;
  Serial.print(" ");
  buf += " ";
  switch(dayOfWeek){
  case 1:
    Serial.println("Domingo");
    buf += "Domingo";
    break;
  case 2:
    Serial.println("Segunda");
    buf += "Segunda";
    break;
  case 3:
    Serial.println("Terça");
    buf += "Terça";
    break;
  case 4:
    Serial.println("Quarta");
    buf += "Quarta";
    break;
  case 5:
    Serial.println("Quinta");
    buf += "Quinta";
    break;
  case 6:
    Serial.println("Sexta");
    buf += "Sexta";
    break;
  case 7:
    Serial.println("Sabado");
    buf += "Sabado";
    break;
  }

  for(int x=0;x<sensors;x++) {
    Serial.println("Sensor ");
    buf += "Sensor";
    break;

    Serial.print(x+1);
    buf += x+1;
    Serial.print(" ");
    buf += " ";
    Serial.print(get_temperature(sensors_address));
    buf += get_temperature(sensors_address);

    Serial.println(" C");
    buf += " C";
  }
  delay(2000);
  return buf;
}

float get_temperature(uint8_t *address) {
  byte data[12];
  int x;
  sensor_bus.reset();
  sensor_bus.select(address);
  sensor_bus.write(0x44,1);

  sensor_bus.reset();
  sensor_bus.select(address);
  sensor_bus.write(0xBE,1);
  for(x=0;x<9;x++){
    data[x] = sensor_bus.read();
  }


  unsigned short tr = data[0];
  tr = tr + data[1]*256;

  if(tr > 0xF000){
    tr = 0 - tr;
  }


  float temperature = (float)tr*(float)0.0625 ;

  return temperature;
}



void loop()
{
  displayTime(); // display the real-time clock data on the Serial Monitor,
  delay(1000); // every second

  int buf[318];
  int x, x2;
  int y, y2;
  int r;


  myGLCD.clrScr();

  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 319, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print(displayTime(), LEFT, 1) ;



  delay (10000);

}



Coloca o erro pff.
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #10 em: 16 de Janeiro de 2015, 21:29 »
Substitui a tua por esta.
Suponho que tenhas mais que um sensor de temperatura?
O erro que estavas a ter parece estar relacionado com o "for" que colocaste dentro dessa função para construir a "frase" com a temperatura, pois não referenciavas qual o indice do array do sensor, e estas a passar o array completo para cada count.

Isto deve resolver, se tiveres problemas diz.

Código: [Seleccione]
String displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  String buf = "";
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  buf += hour;
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  buf += ":";
  if (minute<10)
  {
    Serial.print("0");
    buf += "0";
  }
  Serial.print(minute, DEC);
  buf += minute;
  Serial.print(":");
  buf += ":";
  if (second<10)
  {
    Serial.print("0");
    buf += "0";
    buf += "0";
  }
  Serial.print(second, DEC);
  buf += second;
  Serial.print(" ");
  buf += " ";
  Serial.print(dayOfMonth, DEC);
  buf += dayOfMonth;
  Serial.print("/");
  buf += "/";
  Serial.print(month, DEC);
  buf += month;
  Serial.print("/");
  buf += "/";
  Serial.print(year, DEC);
  buf += year;
  Serial.print(" ");
  buf += " ";
  switch(dayOfWeek){
  case 1:
    Serial.println("Domingo");
    buf += "Domingo";
    break;
  case 2:
    Serial.println("Segunda");
    buf += "Segunda";
    break;
  case 3:
    Serial.println("Terça");
    buf += "Terça";
    break;
  case 4:
    Serial.println("Quarta");
    buf += "Quarta";
    break;
  case 5:
    Serial.println("Quinta");
    buf += "Quinta";
    break;
  case 6:
    Serial.println("Sexta");
    buf += "Sexta";
    break;
  case 7:
    Serial.println("Sabado");
    buf += "Sabado";
    break;
  }

  buf += "\r\n";

  for(int x=0;x<sensors;x++) {
    Serial.println("Sensor ");
    buf += "Sensor ";
    break;

    Serial.print(x+1);
    buf += x+1;
    Serial.print(" ");
    buf += " ";
    Serial.print(get_temperature(sensors_address[x]));
    buf += get_temperature(sensors_address[x]);

    Serial.println(" C");
    buf += " C\r\n";
  }
  delay(2000);
  return buf;
}
« Última modificação: 16 de Janeiro de 2015, 21:32 por MRData »
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #11 em: 16 de Janeiro de 2015, 21:55 »
Colocaste um break a seguir a palavra sensor... ele ai sai do for ...
Testa com esta.

Código: [Seleccione]
String displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  String buf = "";
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  buf += hour;
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  buf += ":";
  if (minute<10)
  {
    Serial.print("0");
    buf += "0";
  }
  Serial.print(minute, DEC);
  buf += minute;
  Serial.print(":");
  buf += ":";
  if (second<10)
  {
    Serial.print("0");
    buf += "0";
    buf += "0";
  }
  Serial.print(second, DEC);
  buf += second;
  Serial.print(" ");
  buf += " ";
  Serial.print(dayOfMonth, DEC);
  buf += dayOfMonth;
  Serial.print("/");
  buf += "/";
  Serial.print(month, DEC);
  buf += month;
  Serial.print("/");
  buf += "/";
  Serial.print(year, DEC);
  buf += year;
  Serial.print(" ");
  buf += " ";
  switch(dayOfWeek){
  case 1:
    Serial.println("Domingo");
    buf += "Domingo";
    break;
  case 2:
    Serial.println("Segunda");
    buf += "Segunda";
    break;
  case 3:
    Serial.println("Terça");
    buf += "Terça";
    break;
  case 4:
    Serial.println("Quarta");
    buf += "Quarta";
    break;
  case 5:
    Serial.println("Quinta");
    buf += "Quinta";
    break;
  case 6:
    Serial.println("Sexta");
    buf += "Sexta";
    break;
  case 7:
    Serial.println("Sabado");
    buf += "Sabado";
    break;
  }

  for(int x=0;x<sensors;x++) {
    Serial.println("Sensor ");
    buf += " Sensor ";

    Serial.print(x+1);
    buf += x+1;
    Serial.print(" ");
    buf += " ";
    Serial.print(get_temperature(sensors_address[x]));
    buf += get_temperature(sensors_address[x]);

    Serial.println(" C");
    buf += " C";
  }
  delay(2000);
  return buf;
}
« Última modificação: 16 de Janeiro de 2015, 22:04 por MRData »
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #12 em: 16 de Janeiro de 2015, 21:59 »
Os caracteres esquisitos antes, é porque eu estava a dar o equivalente a um "ENTER" para iniciar numa nova linha, mas já vi que essa funcao que escreve para o display ignora isso.
Se quiseres colocar uma linha nova para o resultado de cada sensor tens de fazer algumas alterações a essa função.
"We are legion"

StarRider

  • Visitante
Re: Iniciante - juntar codigos
« Responder #13 em: 16 de Janeiro de 2015, 22:06 »
StarRider,

Até te podia dar alguma razão simplesmente pela forma como eu lhe disse para chamar a função, mas....
Primeiro o metodo devolve uma string (não é do tipo void), logo passa para a "main" o pointer para o buf.

Não, o problema é mesmo esse, nos tipos compostos o C devolve um ponteiro, neste caso um
ponteiro para "nada" pois a tal string já não existe.

Segundo e se realmente isso fosse um issue, bastava ele fazer " String newbuf = displayTime(); " e "copiava" a referencia do pointer para a nova variavel, depois fazendo o print, caso alguma vez falhasse...
Não, uma referencia para um ponteiro é um duplo ponteiro (definido como ** em C), existe ai alguma
confusão, o que acontecia era que a novo membro do classe string recebia o conteúdo de deferência
do suposto ponteiro, mais uma vez podia funcionar somente por pura SORTE.


Terceiro, como passa a função como ref para o pointer, para uma outra função que vai escrever o conteudo num display, mesmo que perca o conteudo da var, ela já vai estar escrita e não é usada para nada.

Esta não percebi, uma função como referencia ? ? ?
Em C uma chamada do tipo "FuncXpto(FuncXXX(), qualquercoisa)" implica que a o compilador execute
os seguintes passos:
-pop stack
-chamar FuncXXX()
-push stack (returno de FuncXXX() num registo, possivelmente R1)
-chamar FuncXpto(R1, qualquercoisa)

Não existe qualquer passagem de "função como referencia" ... por isso não estou a perceber essa
afirmação ... mas em frente.

O que se passa é que esse erro é comum, e como por vezes as coisas até funcionam só com mais
experiência é que se dá por ele, mas quando dá para o torto é que são elas.
De qualquer forma é uma má pratica de programação que devemos alertar para que as pessoas
possam evoluir.

Existem formas mais simples e compactas de resolver a questão, e por vezes usar classes para
tarefas simples (ainda por cima num MCU limitado) nem sempre é a melhor opção, mas como é óbvio
cada cabeça sua sentença, e esta é somente a minha opinião.

Se fosse eu, optava por algo no género, e resolvia a questão com 3 linhas de código:

Código: [Seleccione]
char *daynames[] = {"Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sabado"};

void displayTime(char *destbuf)
{
   readDS3231time(&sec, &min, &hour, &dow, &dom, &mon, &year);
   sprintf(destbuf,"%02d:%02d:%02d  %02d/%02d/%04d %s\r\n",hour,min,sec,dom,mon,year,dayname[dow]); 
   Serial.println(destbuf);
}


Abraços,
PA
« Última modificação: 16 de Janeiro de 2015, 22:14 por StarRider »

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #14 em: 16 de Janeiro de 2015, 22:06 »
Diz 1 19C porque tu fizeste um Serial.Print(x+1); e eu assumi que querias isso no texto, para destinguires que sensor é que te esta a dar essa leitura.
Se quiseres eliminar, basta apagares a linha : buf += x+1;

Já esta melhor :D mas continua a dizer "Sensor 1 19C" em vez de 19C
"We are legion"