collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 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: Iniciante - juntar codigos  (Lida 22709 vezes)

0 Membros e 2 Visitantes estão a ver este tópico.

StarRider

  • Visitante
Re: Iniciante - juntar codigos
« Responder #30 em: 17 de Janeiro de 2015, 00:05 »
Yap, estou na corda bamba ... nunca programei para "arduino" ... pelos visto o "Serial.println" não tem overload para uint8_t

Se tiveres pachorra, comenta a linha 51, deve ficar assim:

//Serial.println(sensor_addres);


Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #31 em: 17 de Janeiro de 2015, 00:09 »
O ultimo codigo que te mandei funcionou?

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);

  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 319, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.setBackColor(255, 0, 0);

  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(" ");
    buf += " ";

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

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

  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()
{
  int buf[318];
  int x, x2;
  int y, y2;
  int r;


  myGLCD.clrScr();



  myGLCD.print(displayTime(), CENTER, 1) ;
  delay(1000);
}
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #32 em: 17 de Janeiro de 2015, 00:16 »
Mas faz upload deste codigo e testa pff.

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);

  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 319, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.setBackColor(255, 0, 0);

  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(" ");
    buf += " ";

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

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

  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()
{
  int buf[318];
  int x, x2;
  int y, y2;
  int r;


  myGLCD.clrScr();



  myGLCD.print(displayTime(), CENTER, 1) ;
  delay(1000);
}
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #33 em: 17 de Janeiro de 2015, 00:17 »
MRData, funciona, exibe a infomação no tft, mas pisca. vê como esta no video

Ja tinha visto, fiz uma alteração neste ultimo
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #34 em: 17 de Janeiro de 2015, 00:20 »
Se não der, vou-te pedir só para testar mais uma coisa e desisto  :-\
"We are legion"

StarRider

  • Visitante
Re: Iniciante - juntar codigos
« Responder #35 em: 17 de Janeiro de 2015, 00:24 »
Esse piscar é "quase normal" ... não podes esperar muito desempenho, tendo em conta os 16Mhz e
o GRANDE overhead das libs que estás a usar.

Abraços,
PA

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #36 em: 17 de Janeiro de 2015, 00:26 »
Código: [Seleccione]
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.

StarRider
Já agora explica-me uma coisa, porque é que na referencia do arduino dizem para fazer com returntype?

http://playground.arduino.cc/Code/Function
http://arduino.cc/en/Reference/FunctionDeclaration
« Última modificação: 17 de Janeiro de 2015, 00:30 por MRData »
"We are legion"

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #37 em: 17 de Janeiro de 2015, 00:28 »
Essa era a minha ultima tentativa.
Como não sei como o ecra funciona, nao sabia se era necessario fazer o clear sempre.

O que te estava a fazer piscar era o clear no loop, e estares sempre a escolher os parametros do ecra no loop tambem.

Se reparares coloquei-os no setup.

Código: [Seleccione]
  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 319, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.setBackColor(255, 0, 0);

Este funcionou, mas tive de retirar isto " myGLCD.clrScr();" isto deve causar problemas ao apresentar botões não? Tipo não limpa a imagem...
"We are legion"

StarRider

  • Visitante
Re: Iniciante - juntar codigos
« Responder #38 em: 17 de Janeiro de 2015, 00:49 »
Código: [Seleccione]
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.

StarRider
Já agora explica-me uma coisa, porque é que na referencia do arduino dizem para fazer com returntype?

http://playground.arduino.cc/Code/Function
http://arduino.cc/en/Reference/FunctionDeclaration

Boas,

Resumidamente, existe dois "types" básicos de dados: escalares e compostos.
Os escalares são os "tipos base" char, int, double, float, double double, enum e claro os ponteiros que
não são mais do que um int32 (ou int16).
Os compostos são todos os outros que são constituídos por vários escalares, struc, union, class,
namespace, interface, etc.

Em todas as linguagem em todos os sistemas uma função somente pode retornar um escalar, pois como
deves compreender esse tipo da dado deve poder caber num registo ou ser endereçado por um ponteiro que
possa caber num registo (ou conjunto de 2 no caso de far pointer em sistemas de 8 e 16 bits).

Quando uma função retorna uma class, uma estructura, etc , está a retornar um ponteiro para esse
datatype composto. Apesar do "returntype" poder ser uma classe o avr-gcc retorna um ponteiro para o
membro dessa classe ... no fundo uma variável de uma classe nada mais é do que um ponteiro para
um membro da classe.

PS: Existem em algumas linguagens a possibilidade de efectuar o retorno de um composto, no C# por
exemplo, isto é feito puxando todos os elementos que constituem o composto para o stack pela função
chamada sendo estes elementos depois retirados do stack pela função que chamou (isto é transparente
para o programador claro) mas isto não acontece no arduino ... que coitado tem um stack minúsculo.

Quando defines uma variável dentro de uma função, ou mesmo dentro de um bloco {}, essa variável
sai de scope assim que a execução sai fora do bloco ou função, e sendo um membro de uma classe, o
"arduino" gera codigo para chamar automaticamente o destructor para esse membro.
Podes fazer um teste muito simples, crias uma classe e implementas um destructor que nada mais é do
que uma função com um "til" e o nome da classe, e nesse destructor metes um print para enviar uma
mensagem para a porta serie. Depois crias uma var dessa classe dentro de uma função e vais ver que
quando o programa sair dessa função o tal print vai ser executado.

Abraços,
PA

« Última modificação: 18 de Janeiro de 2015, 12:20 por StarRider »

Offline MRData

  • Mini Robot
  • *
  • Mensagens: 81
Re: Iniciante - juntar codigos
« Responder #39 em: 17 de Janeiro de 2015, 01:19 »
Ok, já entedi. Obrigado pela explicação.

Abraço
"We are legion"

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Iniciante - juntar codigos
« Responder #40 em: 17 de Janeiro de 2015, 13:16 »
Os ds18b20 no modo de 12 bits(ou lá quanto é a resolução máxima) demora 750ms a fazer uma conversão, eu quando os uso dou o comando para ele fazer a conversão e continuo o código e só depois de ele dar a flag de conversão concluida é que o leio, se não são 750ms á espera sem fazer nada.
Avr fanboy

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Iniciante - juntar codigos
« Responder #41 em: 17 de Janeiro de 2015, 13:18 »
Outra coisa, estás a usar SPI nativo ou é pinos á sorte e tem de fazer o spi em software?
Avr fanboy

Offline artur36

  • Mini Robot
  • *
  • Mensagens: 795
Re: Iniciante - juntar codigos
« Responder #42 em: 17 de Janeiro de 2015, 23:12 »
Fazes um digitalwrite ao rele no setup, o Arduino ao arrancar corre a função de setup e liga a bomba logo.

Offline Kristey

  • Mini Robot
  • *
  • Mensagens: 783
Re: Iniciante - juntar codigos
« Responder #43 em: 18 de Janeiro de 2015, 15:59 »
Porque não fazes um código simples para faZer essa escrita depois unes tudo? Mas código feito por ti... Procuras as funções que precisas na documentação da biblioteca e vais implementando. Se tiveres dúvidas em relação a alguma função perguntas.
Aprendes mais, das menos trabalho e é mais simples para quem te quer ajudar.
Eu estou a faZer um projecto grande também. E não estou a fazer tudo de uma vez. Uma coisa de cada vez testada à parte e depois sim junto...
Se fores tu a fazer de tais os pequenos códigos depois vais saber juntar porque sabes exactamente o que precisas.

Offline Kristey

  • Mini Robot
  • *
  • Mensagens: 783
Re: Iniciante - juntar codigos
« Responder #44 em: 18 de Janeiro de 2015, 22:44 »
Podes copiar mas pelo que eu vi no tópico, deves estar a juntar mal as coisas, ou seja, até mesmo a estrutura do código em si estas com dificuldades de interpretar.
Tinha um professor que dizia, o vosso melhor amigo contra os erros não é o compilador, é a folha e o lápis ao lado do rato.
É o homem tinha razão. Tenta fazer um desenho de todo o processo. Um desenho sequencial de todas as funções. Eu por exemplo comecei a fazer algumas coisas em LCD há pouco tempo e estava com um erro estupido. E se tivesse feito o desenho tinha poupado alguns minutos de pesquisa.

Neste momento não posso ajudar mais porque eu venho ao fórum pelo telemóvel e isto não dá jeito nenhum.