Olá meus Caros,

To precisando muito da ajuda de vcs para meu projeto. Estou desenvolvento um datalogger meteorologico com os seguintes componentes:

- Arduino Mega 2560;
- Shield Adafruit datalogger (SD card e RTC);
- Sensor temp e umidade SHT15 SPARKFUN;
- Sensor Pressão BMP085 SPARKFUN;
- Display LCD 16x2.

Eu não estou conseguindo colocar para ler os sensores e configurar o RTC. Alguem poderia me ajudar?
Segue o código atualizado:

#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal.h>
#include <SHT1x.h>
#include <SD.h>


// Constantes do sistema
int clockPin = 8;  // pin used for clock
int dataPin  = 9;  // pin used for data
int ack;  // track acknowledgment for errors
int val;
float temp;
float humidity;
#define DELAY_TIME 3000

// Instâncias de objetos
SHT1x sht1x(dataPin, clockPin);
Adafruit_BMP085 bmp;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
char dataString[50];


void setup() {
  Serial.begin(9600);
  bmp.begin();

  // Necessário para funcionar cartão sd
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(10, 11, 12, 13)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    //return;
  }
  Serial.println("card initialized.");

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
 lcd.setCursor(0, 0); //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
 lcd.print("   Energetica "); //Escreve no LCD "Energética! na primeira linha do LCD"
 lcd.setCursor(0, 1); //Posiciona o cursor na primeira coluna(0) e na segunda linha(1) do LCD
 lcd.print(" Qualidade Do Ar"); //Escreve no LCD "Qualidade do Ar" n segunda linha do LCD
 
   delay(DELAY_TIME);
 lcd.setCursor(0, 0); //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
 lcd.print("  Datalogger  "); //Escreve no LCD "Energética! na primeira linha do LCD"
 lcd.setCursor(0, 1); //Posiciona o cursor na primeira coluna(0) e na segunda linha(1) do LCD
 lcd.print("  AGV versao 1.0  "); //Escreve no LCD "Qualidade do Ar" n segunda linha do LCD
 
   delay(DELAY_TIME);
}

void loop() {
  String dataString = "";
 temp = (float)val * 0.01 - 40;
  
  char vector[10], vector2[10], vector3[10];
  
  // Insere dados no buffer
  dtostrf(temp, 2, 2, vector);
  dataString += vector;
  
  // Insere divisor
  dataString += ",";

  // Obtém o valor da pressão já em hPA
  int32_t pres = bmp.readPressure() / 100;

  dtostrf(pres, 2, 2, vector2);
  dataString += vector2;
  
  // Insere divisor
  dataString += ",";
  
  
  // Obtém umidade
  float humidity = sht1x.readHumidity();

  dtostrf(humidity, 2, 2, vector3);
  dataString += vector3;
  
  // Insere divisor
  dataString += ",";

  File dataFile = SD.open("datalog.csv", FILE_WRITE);
  if (dataFile){
    dataFile.println(dataString);
    dataFile.close();
    Serial.print("gravado no cartao: ");
    Serial.println(dataString);
  }
  else{
    Serial.println("problema ao abrir datalog.csv");
  }


  Serial.print("Temperatura do ar = ");
  Serial.print(temp);
  Serial.println("Grau");

  Serial.print("Pressao atmosferica = ");
  Serial.print(pres);
  Serial.println("Pa");
  
  Serial.print("Umidade relativa do ar = ");
  Serial.print(humidity);
  Serial.println("%");
  
  

  lcd.clear();
  lcd.print("temp ar ");
  lcd.print(temp);
  lcd.print(" graus");

  lcd.setCursor(0,1);
  lcd.print("pres atm ");
  lcd.print(pres);

  delay(DELAY_TIME);
  lcd.clear();
  lcd.print("umidade ");
  lcd.print(humidity);
  lcd.print("%");
  delay(DELAY_TIME);
}

Desde já agradeço.

Exibições: 2466

Responder esta

Respostas a este tópico

Se eu fosse vc faria um programa para ler cada sensor individualmente e somente depois de entender as particularidades deles eu os juntaria.

Sozinho eles funcionam Mauro, eu ja fiz esse teste. Agora todo o conjunto funcionou bem, o problema era a fonte de alimentação que estava usando (marca MS), ela estava gerando um tipo de ruido influenciando nos dados. Vale a experiência.

 Agora, quando clico no serial monitor, os seguintes dados me aparecem:

Onde:

Card Initialized (cartão de memoria detectado)

gravado no cartao:20.84,1014.00,67.05, (dados gravados no cartão, na sequencia: temperatura, pressão atm e umidade)

Como faço para que fiquem exibidos dessa forma (com espaços):

gravado no cartao: 2/10/2013,12:31:17,20.84,1014.00,67.05,


2/10/2013 12:31:17
Temperature = 20.84*C
Pressure = 1014Pa
Humidity = 67.05%

gravado no cartao: 2/10/2013,12:31:17,20.84,1014.00,67.05,


2/10/2013 12:31:30
Temperature = 20.84*C
Pressure = 1014Pa
Humidity = 67.05%

E se for possivel, tem como gravar um cabeçalho nos dados do cartão ,por exemplo: Data, Hora, Temp, Press, Umidade????

Dá uma olhada nesse vídeo https://www.youtube.com/watch?v=aTDmJY5QVvM acho que vai ajudar.

Obrigado Fernando. Consegui. Meu projeto tá ficando muito bancana.

Outra Dúvida, como faço para armazenar os dados no cartão de memória pro exemplo de 10 em 10 minutos?

Abraço a todos.

Cara,

não sou programador em arduino, porém acho que da pra vc fazer um laço (for ou while) depois que ele grava no cartão, entra no laço e dentro vc coloca um delay(1000) por ex.

acho que resolve, não sei se é uma "gambi" mais deve resolver.

PS= onde conseguiu o hardware para armazenar o datalog? importou ou foi aqui no Brasil mesmo? vlw

[]'s

Shield Adafruit datalogger (SD card e RTC)

Vou tentar amanhã, depois respondo.

utilizando a função millis


long previousMillis = 0;


void setup() {

}
void loop()
{

unsigned long currentMillis = millis();
if(currentMillis - previousMillis > 600000) { // 600000 = 10 minitos
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile){
dataFile.println(dataString);
dataFile.close();
Serial.print("gravado no cartao: ");
Serial.println(dataString);
}
else{Serial.println("problema ao abrir datalog.csv"); }
previousMillis = currentMillis;
}
}

Entendi Cabecavil, mas tive que fazer uma alteração no projeto. Vou ter que arrumar uma forma de que o arduíno registe apenas no cartão de memória a média dos dados horários. Enfim, o cartão de memória deve salvar apenas os dados a cada hora cheia. O LCD deve exibir online mesmo. 

Consegue me dar uma luz?

Abraços e obirgado pela colaboração.

Meus caros, estou retomando meu projeto e está evoluindo bem.

Para quem saca de programação, eu preciso que o meu datalogger grave no SD Card apenas as médias de dados horários, por exemplo: 

Quando for 11h00min, ele grava apenas data, hora e a média de todos os dados entre 10h00 e 11h00.
(OBS: tem que gravar o dado APENAS quando estiver a hora cheia... 11h00 , 12h00, 13h00, 14h00....)

Estive pensando como, mas não sei como fazer...

Tem como ele calcular médias e quando meu "minuto" e "segundo" estiverem marcando 00 simultaneamente, ele gravar  o dado da média no SD Card. Isso é possível???

Obrigado pela força galera.

É sim. Vc tem que criar variáveis para conter a soma das leituras e uma para contar as leituras. Vai atualizando essas a cada leitura. Quando chegar a hora de gravar, vc calcula as médias, dividindo os valores pela contagem, e grava.

Estou com dificuldades para criar essas variáveis, não sou muito bom em programação. Poderia me ajudar... te adicionei como amigo.

Bom dia Angelo,

No seu projeto você consegue gravar os dados sem inicializar a serial  da IDE do arduino?

Abraço.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço