bonjour,
je possède une Carte Arduino UNO, deux sondes de températures DS18B20, un afficheur 7 segments 4 digits, une RTC et un lecteur de carte SD pour imprimer mes données.
Mon objectif est avec la sonde numéro 1, de mesurer la température en direct, son max et son min et de l'afficher sur mon afficheurs 7 segments. Je voudrais allumer des diodes pour me repérer (l'idée est d'une bleu pour le min, une rouge pour le max et une verte pour T en direct)
la seconde sonde permet de mesurer la température extérieur, de l'afficher sur l'afficheur en 4ème intensions
En secondaire grâce à la RTC je veux enregistrer dans un fichiers exce mes données des deux températures, mais pas afficher le min et le max, toutes les X minutes en définissant le temps.
mon problème est que la seconde sonde extérieur sature et m'affiche 85 degrés ( elles sont à une distance d'1 metre ) au bout de qq secondes.
mais mon programme fait déjà 76% de la mémoire flash de l'arduino et cela crée peut être des bugs.
comment diminuer mon programme pour que la mémoire flash redescende et que mon programme ne bug moins.
voici le code:
#include <TM1637Display.h> //afficheur
#include <SD.h> //carte SD
#include <OneWire.h>
#include <DallasTemperature.h> // température
//horloge temps réel
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
#define SONDE1 A0
#define SONDEEXT A5 // Sonde exterieur
#define CLK 2 // Connexion écran
#define DIO 3 // connexion écran
#define sdCardPinChipSelect 10 //pin de la carte SD
File monFichier;
const char* nomDuFichier = "donnees.csv";
const long delaiIntervalleDeMesures = 3000;
const int ledbleu = 9; // Définition de la broche numéro 2.
const int ledverte = 8; // Définition de la broche numéro 2.
const int ledblanche = 7; // Définition de la broche numéro 2.
const int ledtempext = 6; // Définition de la broche numéro 2.
float tempmin = 100; //Temperature min
float tempmax = 0; //Temperature max
int tmin; // essai de prises toutes les 10 min
int tatt;
// Create degree celsius symbol
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Degree symbol
SEG_A | SEG_D | SEG_E | SEG_F // C
};
OneWire oneWire_in(SONDE1);
OneWire oneWire_out(SONDEEXT);
DallasTemperature sensor_interieur(&oneWire_in);
DallasTemperature sensor_exterieur(&oneWire_out);
//voies de l'afficheurs
TM1637Display display(CLK, DIO);
void setup() {
pinMode(ledbleu, OUTPUT);
pinMode(ledverte, OUTPUT);
pinMode(ledblanche, OUTPUT);
pinMode(ledtempext, OUTPUT);
Serial.begin(9600);
delay(4000);
display.setBrightness(0x0f);
sensor_interieur.begin();
sensor_exterieur.begin();
//test si la carte SD marche
Serial.println(F("Étape 1 : Initialisation de la carte SD :"));
if (!SD.begin(sdCardPinChipSelect)) {
Serial.println(F("Échec de l'initialization !"));
while (1); // Boucle infinie (stoppage du programme)
}
Serial.println(F("Initialisation terminée."));
Serial.println();
//programme qui vérifie heure et permet la mise à jour si soucis//
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// Comment out below lines once you set the date & time.
// Following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
/*rtc.adjust(DateTime(2022, 2, 1, 16, 15, 0));*/
}
// On initialise la connexion série
Serial.begin(9600);
delay(4000);
}
void loop() {
// lecture de l'heure
DateTime now = rtc.now();
Serial.println("Current Date & Time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
sensor_interieur.requestTemperatures();
double tempint = sensor_interieur.getTempCByIndex(0);
delay (2000);
Serial.print("tinterieur ");
Serial.print(tempint);
delay (3000);
sensor_exterieur.requestTemperatures();
double tempext = sensor_exterieur.getTempCByIndex(0);
delay (3000);
Serial.print("textérieur ");
Serial.print(tempext);
if (tempint < tempmin) {
tempmin = tempint; //Calcul temperature mini
}
if (tempint > tempmax) {
tempmax = tempint; //Calcul temperature maxi
}
Serial.print("tmaximum ");
Serial.print (tempmax);
Serial.print("tminimum ");
Serial.print (tempmin);
if (tatt > now.minute ())
{
Serial.print ("case attente");
delay (1000);
// afficheur 8 segments
int temperature = tempint;
display.showNumberDec(temperature, false, 2, 0);
display.setSegments(celsius, 2, 2);
digitalWrite(ledblanche, LOW);
digitalWrite(ledverte, HIGH);
digitalWrite(ledbleu, LOW);
digitalWrite(ledtempext, LOW);
delay (4000);
display.showNumberDec(tempmax, false, 2, 0);
digitalWrite(ledblanche, HIGH);
digitalWrite(ledbleu, LOW);
delay (4000);
display.showNumberDec(tempmin, false, 2, 0);
digitalWrite(ledblanche, LOW);
digitalWrite(ledbleu, HIGH);
delay (4000);
display.showNumberDec(tempext, false, 2, 0);
digitalWrite(ledbleu, LOW);
digitalWrite(ledtempext, HIGH);
}
else
{
Serial.print ("case impression");
monFichier = SD.open(nomDuFichier, FILE_WRITE);
monFichier.print(tempint), monFichier.print(";");
monFichier.print(tempext), monFichier.print(";");
monFichier.print(now.month ()), monFichier.print(";");
monFichier.print(now.day ()), monFichier.print(";");
monFichier.print(now.hour ()), monFichier.print(";");
monFichier.print(now.minute() ), monFichier.print(";");
monFichier.println();
monFichier.close();
Serial.println();
delay (5000);
int tmin = (now.minute() );
if (tmin > 55) {
tmin = 1; //
}