Weather station teveel data op SD kaart

Arduino specifieke Software
Berichten: 9
Geregistreerd: 08 Jul 2018, 23:03

Weather station teveel data op SD kaart

Berichtdoor JanW » 08 Aug 2022, 22:48

Wie zou mij kunnen helpen met een een probleem waar ik zo geen oplossing voor kan vinden.

In de software voor het weather station worden de meetwaardes elke minuut weg geschreven op een SD kaart.
Dat is als je even aan het meten bent geen probleem, maar als de meting een dag of wat loopt komt er geen eind aan de opgeslagen waardes.
Ik zou graag een oplossing zien waarin je de tijd tussen de metingen langer kan maken van het opslaan op de SD kaart. Ik denk aan b.v. om de 10 minuten.

Nu wordt het display elke minuut ververst en dat is prima, maar dat vele opslaan, is echt een drama.

Advertisement

Berichten: 127
Geregistreerd: 26 Aug 2015, 11:57

Re: Weather station teveel data op SD kaart

Berichtdoor Frits1956 » 08 Aug 2022, 23:21

Het zou wellicht kunnen helpen als je de gebruikte code hier neerzet. Dan kunnen we je wellicht helpen.

Berichten: 3864
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Weather station teveel data op SD kaart

Berichtdoor shooter » 09 Aug 2022, 10:54

ergens in de code staat het getal 60000 (dat is 1 minuut) zet er eens een nul bij dan is het elke 10 minuten dan weet je ook gelijk waar het verandert kan worden. let wel even op dat het getal geen int is maar een unsigned double. dat geld dus ook voor de tijd zelf.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 08 Jul 2018, 23:03

Re: Weather station teveel data op SD kaart

Berichtdoor JanW » 09 Aug 2022, 13:01

Oeps, bijgaand nu de code. Een beetje rommelig misschien met wat opmerkingen van mij er in.
Het gaat dus alleen om het stukje wegschrijven naar SD kaart. De presentatie op het display is op de minuut gelijk. Verspringt de tijd, dan schrijft hij ook meteen op dat moment.


Frits en Arjan bedankt voor jullie reacties.

.
/* Temperature, humidity & pressure data logger using Arduino UNO,
SD card, BME280 sensor and DS3231 RTC.
* Time, date, temperature, humidity and pressure values are displayed on 20x4 LCD.
* This is a free software with NO WARRANTY.
* https://simple-circuit.com/
*/

// 07-04-2022 SOFTWARE AANGEPAST NAAR 2 REGELIG DISPLAY.
// 12-04-2022 Aanpassing display teksten. getest en OK
// 25-04-2022 Comand's HC-05 ?
// 02-08-2022 SOFTWARE AANGEPAST NAAR 4 REGELIG DISPLAY.
// 04-08-2022 PLAATS VAN DE TIJD OP HET DISPLAY AANGEPAST

//AT : Ceck the connection.
//AT+NAME : See default name
//AT+ADDR : see default address
//AT+VERSION? : See version
//AT+UART : See baudrate
//AT+ROLE : See role of bt module(1=master/0=slave)
//AT+RESET : Reset and exit AT mode
//AT+ORGL : Restore factory settings
//AT+PSWD : see default password

#include <SD.h> // include Arduino SD library
#include <LiquidCrystal.h> // include Arduino LCD library
#include <RTClib.h> // include Adafruit RTC library
#include <Adafruit_BME280.h> // include Adafruit BME280 sensor library

// LCD module connections (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

// initialize RTC library
RTC_DS3231 rtc;
DateTime now;

// buttons definition
#define button1 A1 // button B1 is connected to Arduino pin A1
#define button2 A2 // button B2 is connected to Arduino pin A2

// define BME280 sensor I2C address: 0x76 or 0x77 (0x77 is library default address)
#define BME280_I2C_ADDRESS 0x76
// initialize Adafruit BME280 library
Adafruit_BME280 bme280;

boolean sd_ok = 0, sensor_ok = 0;

void setup()
{
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);

rtc.begin(); // initialize RTC chip
lcd.begin(20, 4); // initialize LCD module
lcd.setCursor(0, 0); lcd.print("TIME:");
lcd.setCursor(0, 1); lcd.print("DATE:");

// open serial communications and wait for port to open:
Serial.begin(9600);
Serial.print("Initializing SD card...");


// initialize the SD card
if ( !SD.begin() )
Serial.println("failed!"); // initialization error

else { // initialization OK
sd_ok = true;
Serial.println("OK.");
if( SD.exists("Log.txt") == 0 ) // test if file with name 'Log.txt' already exists
{ // create a text file named 'Log.txt'
Serial.print("\r\nCreate 'Log.txt' file...");
File dataLog;
dataLog = SD.open("Log.txt", FILE_WRITE); // create (&open) file Log.txt
if(dataLog) { // if the file opened okay, write to it:
Serial.println("OK");
// write some texts to 'Log.txt' file
dataLog.println(" DATE | TIME | TEMPERATURE | HUMIDITY | PRESSURE");
dataLog.close(); // close the file
}
else
Serial.println("failed!");
}
}



//////////////////////////////////////////BME SENSOR///////////////////////////////////

// initialize the BME280 sensor
Serial.print("\r\nInitializing BME280 sensor...");
if( bme280.begin(BME280_I2C_ADDRESS) )
{
Serial.println("done.");
lcd.setCursor(0, 2); lcd.print("T:");
lcd.setCursor(10, 2); lcd.print("|H:");
lcd.setCursor(0, 3); lcd.print("P:");
lcd.setCursor(8, 2);
lcd.write(223); // print degree symbol (°)
lcd.write('C');
sensor_ok = true;
}
else
{ // connection error or device address wrong!
Serial.println("failed!");
lcd.setCursor(0, 3);
lcd.print("BME280 Sensor Error!");
}

Serial.println("\r\n DATE | TIME | TEMPERATURE | HUMIDITY | PRESSURE");
}

// main loop
void loop()
{
now = rtc.now(); // read current time and date from the RTC chip
RTC_display(); // diaplay time & calendar

if( !digitalRead(button1) ) // if B1 is pressed
if( debounce() ) // call debounce function (make sure B1 is pressed)
{
while( debounce() ); // call debounce function (wait for B1 to be released)

byte hour = edit( now.hour() ); // edit hours
byte minute = edit( now.minute() ); // edit minutes
byte day = edit( now.day() ); // edit date
byte month = edit( now.month() ); // edit month
byte year = edit( now.year() - 2000 ); // edit year

// write time & date data to the RTC chip
rtc.adjust(DateTime(2000 + year, month, day, hour, minute, 0));

while(debounce()); // call debounce function (wait for button B1 to be released)
}

static byte p_minute;
if( p_minute != now.minute() )
{ // read & print sensor data every 1 minute
char temp_a[7], humi_a[7], pres_a[12];
char buffer1[22];

///////////////////////////////////////////////tijd bepaling////////////////////////////
p_minute = now.minute();
if( sensor_ok )
{
// read temperature, humidity and pressure from the BME280 sensor
float temp = bme280.readTemperature(); // get temperature in °C
float humi = bme280.readHumidity(); // get humidity in rH%
float pres = bme280.readPressure(); // get pressure in Pa
// save all data to arrays
// 1: temperature
if(temp < 0) // if temperature is negative
sprintf( temp_a, "-%02u.%02u", (int)abs(temp), (int)(abs(temp) * 100) % 100 );
else
sprintf( temp_a, " %02u.%02u", (int)temp, (int)(temp * 100) % 100 );
// 2: humidity
sprintf( humi_a, "%02u.%02u%%", (int)humi, (int)(humi * 100) % 100 );
// 3: pressure
sprintf( pres_a, "%04u.%02u hPa", (int)(pres/100), (int)((uint32_t)pres % 100) );
// print sensor data on the LCD
lcd.setCursor(2, 2); lcd.print(temp_a); // print temperature
lcd.setCursor(14, 2); lcd.print(humi_a); // print humidity
lcd.setCursor(3, 3); lcd.print(pres_a); // print pressure
}

sprintf( buffer1, "%02u-%02u-%04u | %02u:%02u:%02u", now.day(), now.month(), now.year(),
now.hour(), now.minute(), now.second() );

Serial.print(buffer1);
Serial.print(" | ");
if(sensor_ok) {
Serial.print(temp_a);
Serial.print("°C | ");
Serial.print(humi_a);
Serial.print(" | ");
Serial.println(pres_a);
}
else
Serial.println(" Error | Error | Error");

// write data to SD card
if(sd_ok)
{ // if the SD card was successfully initialized
// open Log.txt file with write permission
File dataLog;
dataLog = SD.open("Log.txt", FILE_WRITE);
dataLog.print(buffer1);
dataLog.print(" | ");
if(sensor_ok) {
dataLog.print(temp_a);
dataLog.print("°C | ");
dataLog.print(humi_a);
dataLog.print(" | ");
dataLog.println(pres_a);
}
else
dataLog.println(" Error | Error | Error");
dataLog.close(); // close the file
}

}

delay(100); // wait 1000ms
}

//////////////////////////////////////// RTC functions ////////////////////////////////////////
void RTC_display()
{
char _buffer[12];
char dow_matrix[7][4] = {"SUN", "MON", "TUE", "WED",
"THU", "FRI", "SAT"};
lcd.setCursor(6, 1);
lcd.print( dow_matrix[now.dayOfTheWeek()] );

// print time
sprintf( _buffer, "%02u:%02u:%02u", now.hour(), now.minute(), now.second() );
lcd.setCursor(8, 0);
lcd.print(_buffer);
// print date
sprintf( _buffer, "-%02u-%02u-%04u", now.day(), now.month(), now.year() );
lcd.setCursor(9, 1);
lcd.print(_buffer);
}

byte edit(byte parameter)
{
static byte i = 0, y_pos,
x_pos[5] = {10, 13, 10, 13, 18};
char text[3];
sprintf(text,"%02u", parameter);

if(i < 2)
y_pos = 0;
else
y_pos = 1;

while( debounce() ); // call debounce function (wait for B1 to be released)

while(true) {
while( !digitalRead(button2) ) { // while B2 is pressed
parameter++;
if(i == 0 && parameter > 23) // if hours > 23 ==> hours = 0
parameter = 0;
if(i == 1 && parameter > 59) // if minutes > 59 ==> minutes = 0
parameter = 0;
if(i == 2 && parameter > 31) // if day > 31 ==> day = 1
parameter = 1;
if(i == 3 && parameter > 12) // If month > 12 ==> month = 1
parameter = 1;
if(i == 4 && parameter > 99) // If year > 99 ==> year = 0
parameter = 0;

sprintf(text,"%02u", parameter);
lcd.setCursor(x_pos[i], y_pos);
lcd.print(text);
delay(200); // wait 200ms
}

lcd.setCursor(x_pos[i], y_pos);
lcd.print(" ");
unsigned long previous_m = millis();
while( (millis() - previous_m < 250) && digitalRead(button1) && digitalRead(button2) ) ;
lcd.setCursor(x_pos[i], y_pos);
lcd.print(text);
previous_m = millis();
while( (millis() - previous_m < 250) && digitalRead(button1) && digitalRead(button2) ) ;

if(!digitalRead(button1))
{ // if button B1 is pressed
i = (i + 1) % 5; // increment 'i' for the next parameter
return parameter; // return parameter value and exit
}
}
}

// a small function for button1 (B1) debounce
bool debounce ()
{
byte count = 0;
for(byte i = 0; i < 5; i++)
{
if ( !digitalRead(button1) )
count++;
delay(1000);
}

if(count > 2) return 1;
else return 0;
}
////////////////////////////////////// end RTC functions //////////////////////////////////////

// end of code.

Berichten: 9
Geregistreerd: 08 Jul 2018, 23:03

Re: Weather station teveel data op SD kaart

Berichtdoor JanW » 09 Aug 2022, 16:29


Berichten: 3864
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Weather station teveel data op SD kaart

Berichtdoor shooter » 09 Aug 2022, 19:01

en kijk eens wat er hier gebeurt?
static byte p_minute;
if( p_minute != now.minute() )
{ // read & print sensor data every 1 minute
char temp_a[7], humi_a[7], pres_a[12];
char buffer1[22];
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 08 Jul 2018, 23:03

Re: Weather station teveel data op SD kaart

Berichtdoor JanW » 09 Aug 2022, 22:09

Paul,

Maar de regel heeft // staan . En dat is toch een opmerking waar hij niets mee doet?
Dus daar kan 1 minuut staan maar hij doet er niets mee.

Berichten: 3864
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Weather station teveel data op SD kaart

Berichtdoor shooter » 10 Aug 2022, 06:01

het gaat over de regel met de if als de minute niet gelijk is dan wordt gedaan en een stukje verder wordt de p_minute weer gelijk gedaan maak daar eens hour van zoals jij het schrijft maar je kunt er ook mod van maken dan bijvoorbeeld mod 5.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 08 Jul 2018, 23:03

Re: Weather station teveel data op SD kaart

Berichtdoor JanW » 10 Aug 2022, 14:59

Paul dat met een uur dat werkt als een speer. Dat scheelt enorm. Dat geeft meteen een beter overzicht.

Ik ben verder gegaan met de Mod functie om nog wat meer mogelijkheden te hebben. Bedoel je soms Modolo?
Ik kan daar in de documentatie niet echt een voorbeeld vinden.

Ach, kan je mij een stapje verder helpen hoe ik dat kan aanpassen?

Berichten: 3864
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Weather station teveel data op SD kaart

Berichtdoor shooter » 10 Aug 2022, 17:18

met MOD bedoel i dus modulo daarmee, kunje dus zien of het een heel deeltal = zie op arduino.cc en zoek naar %
paul deelen
shooter@home.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten