Test if this reduces your memory consumption.
This is what I have added
Disable the splash screen with:
#define MY_SPLASH_SCREEN_DISABLED // This saves a couple of bytes
Then for every serial.print I have embedded those with #ifdef MY_DEBUG/#endif
There is no need to serial print when running in silent mode.
I have also embedded the missing serial.print with the F("string") function.
This saves memory by storing strings in flash instead of memory.
I could not get the code to compile as I don't have the proper DHT library.
// ---- - Stazione Meteo Francy Ver 1 - ----
// Enable debug prints
// #define MY_DEBUG
#define MY_SPLASH_SCREEN_DISABLED // This saves a couple of bytes
// Enable and select radio type attached
#define MY_RADIO_NRF24
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define MY_RF24_CHANNEL 84
#define MY_SIGNING_SOFT
#define MY_SIGNING_SOFT_RANDOMSEED_PIN 7
#define MY_SIGNING_REQUEST_SIGNATURES
// Definisco il Nodo
#define MY_NODE_ID 66
// Nomino i figli del Nodo
#define CHILD_ID_TEMP 1
#define CHILD_ID_aaaa 2
#define CHILD_ID_HUMI 3
#define CHILD_ID_bbbb 4
#define CHILD_ID_BARO 5
#define CHILD_ID_LIGHT 6
#define LIGHT_SENSOR_ANALOG_PIN 0
const float ALTITUDE = 335;
//----------------------------- Pressione
//float pressione = 1017;
//int forecast = 4;
const char *weather[] = { "stable", "sunny", "cloudy", "unstable", "thunderstorm", "unknown" };
enum FORECAST
{
STABLE = 0, // "Stable Weather Pattern"
SUNNY = 1, // "Slowly rising Good Weather", "Clear/Sunny "
CLOUDY = 2, // "Slowly falling L-Pressure ", "Cloudy/Rain "
UNSTABLE = 3, // "Quickly rising H-Press", "Not Stable"
THUNDERSTORM = 4, // "Quickly falling L-Press", "Thunderstorm"
UNKNOWN = 5 // "Unknown (More Time needed)
};
//-----------------------------------------
#include <SPI.h>
#include <MySensors.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
DHT dht;
//-----------------------------
Adafruit_BMP085 bmp = Adafruit_BMP085(); // Digital Pressure Sensor
float lastPressure = -1;
float lastTemp = -1;
int lastForecast = -1;
const int LAST_SAMPLES_COUNT = 5;
float lastPressureSamples[LAST_SAMPLES_COUNT];
// this CONVERSION_FACTOR is used to convert from Pa to kPa in forecast algorithm
// get kPa/h be dividing hPa by 10
#define CONVERSION_FACTOR (1.0/10.0)
int minuteCount = 0;
bool firstRound = true;
// average value is used in forecast algorithm.
float pressureAvg;
// average after 2 hours is used as reference value for the next iteration.
float pressureAvg2;
float dP_dt;
bool metric;
//-----------------------------
//Dichiarazioni per pause dei diversi blocchi
unsigned long int time;
unsigned long int lettura_Press;
unsigned long int lettura_Temp;
unsigned long int letturaluce_time;
//------------------------------
int lastLightLevel; //Dichiarazione Luminosita
float temperatureDTH2;
void presentation()
{
sendSketchInfo("Temp e Umidita", "3");
present(CHILD_ID_TEMP, S_TEMP);
present(CHILD_ID_aaaa, S_LIGHT);
present(CHILD_ID_HUMI, S_HUM);
present(CHILD_ID_bbbb, S_LIGHT);
present(CHILD_ID_BARO, S_BARO);
present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
}
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
MyMessage msgaaaa(CHILD_ID_HUMI, V_LIGHT);
MyMessage msgHumi(CHILD_ID_HUMI, V_HUM);
MyMessage msgbbbb(CHILD_ID_HUMI, V_LIGHT);
MyMessage msgPres(CHILD_ID_BARO, V_PRESSURE);
MyMessage msgForecast(CHILD_ID_BARO, V_FORECAST);
MyMessage msg4(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
void setup()
{
// Setto il Pin dove e collegato il sensore di Temperatura DHT22
dht.setup(3);
#ifdef MY_DEBUG
//Settaggi del BMP180
if (!bmp.begin())
{
Serial.println(F("Could not find a valid BMP085 sensor, check wiring!"));
while (1) {}
}
#endif
metric = getControllerConfig().isMetric;
//Fine settaggi BMP180
//-- Setup Variabili MILLIS per sensore di Pressione
time=millis();
lettura_Press = millis();
lettura_Temp = millis();
letturaluce_time = millis();
}
void loop()
{
//Attivo Time MILLIS
time=millis();
//----------- Inizio DHT22 ------------------------
if(time>lettura_Temp+12000){
delay(dht.getMinimumSamplingPeriod());
#ifdef MY_DEBUG
Serial.println(F("--- Temperatura --- "));
#endif
float temperatureDTH;
float humidity = dht.getHumidity();
float temperatureDHT = dht.getTemperature();
temperatureDTH2 = temperatureDTH;
//Invio la lettura della Temperatura
send(msgTemp.set(temperatureDHT, 1));
//delay(6000); // Faccio una pausa ed invio altra lettura
//Invio lettura Umidita
send(msgHumi.set(humidity, 1));
//delay(4000);
lettura_Temp=millis();
}
//---------- Inizio Pressione ---------------------------
if(time>lettura_Press+11000){
#ifdef MY_DEBUG
Serial.println(F("--- Tempo passato lego la Pressione--- "));
#endif
float temperatureDHT2;
float pressure = bmp.readSealevelPressure(ALTITUDE) / 100.0;
float temperature = temperatureDHT2;
if (!metric)
{
// Convert to fahrenheit
temperature = temperature * 9.0 / 5.0 + 32.0;
}
int forecast = sample(pressure);
#ifdef MY_DEBUG
Serial.print(F("Pressione = "));
Serial.print(pressure);
Serial.println(F(" hPa"));
Serial.print(F("Forecast = "));
Serial.println(weather[forecast]);
#endif
if (pressure != lastPressure)
{
send(msgPres.set(pressure, 0));
lastPressure = pressure;
}
if (forecast != lastForecast)
{
send(msgForecast.set(weather[forecast]));
lastForecast = forecast;
}
lettura_Press=millis();
}
//-------------- Inizio Luminosita --------------------------
if(time>letturaluce_time+10000){
#ifdef MY_DEBUG
Serial.print(F("Tempo passato lego la Luce: "));
#endif
int16_t lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
#ifdef MY_DEBUG
Serial.println(lightLevel);
#endif
//delay(1000);
if (lightLevel != lastLightLevel) {
if(lightLevel > lastLightLevel + 7 || lightLevel < lastLightLevel - 7){
send(msg4.set(lightLevel));
#ifdef MY_DEBUG
Serial.print(F("Invio nuova lettura LUX: "));
Serial.println(lightLevel);
#endif
lastLightLevel = lightLevel;
}
}
letturaluce_time=millis();
}
//Fine Luminosita
//--------- Eventuale 4 Modulo -------------------------
// Chiusura Loop
}
//------------ Aggiuntivo Previsione del Barometro ---------------------
float getLastPressureSamplesAverage()
{
float lastPressureSamplesAverage = 0;
for (int i = 0; i < LAST_SAMPLES_COUNT; i++)
{
lastPressureSamplesAverage += lastPressureSamples[i];
}
lastPressureSamplesAverage /= LAST_SAMPLES_COUNT;
return lastPressureSamplesAverage;
}
// Algorithm found here
// http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf
// Pressure in hPa --> forecast done by calculating kPa/h
int sample(float pressure)
{
// Calculate the average of the last n minutes.
int index = minuteCount % LAST_SAMPLES_COUNT;
lastPressureSamples[index] = pressure;
minuteCount++;
if (minuteCount > 185)
{
minuteCount = 6;
}
if (minuteCount == 5)
{
pressureAvg = getLastPressureSamplesAverage();
}
else if (minuteCount == 35)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change * 2; // note this is for t = 0.5hour
}
else
{
dP_dt = change / 1.5; // divide by 1.5 as this is the difference in time from 0 value.
}
}
else if (minuteCount == 65)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) //first time initial 3 hour
{
dP_dt = change; //note this is for t = 1 hour
}
else
{
dP_dt = change / 2; //divide by 2 as this is the difference in time from 0 value
}
}
else if (minuteCount == 95)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change / 1.5; // note this is for t = 1.5 hour
}
else
{
dP_dt = change / 2.5; // divide by 2.5 as this is the difference in time from 0 value
}
}
else if (minuteCount == 125)
{
float lastPressureAvg = getLastPressureSamplesAverage();
pressureAvg2 = lastPressureAvg; // store for later use.
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change / 2; // note this is for t = 2 hour
}
else
{
dP_dt = change / 3; // divide by 3 as this is the difference in time from 0 value
}
}
else if (minuteCount == 155)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change / 2.5; // note this is for t = 2.5 hour
}
else
{
dP_dt = change / 3.5; // divide by 3.5 as this is the difference in time from 0 value
}
}
else if (minuteCount == 185)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change / 3; // note this is for t = 3 hour
}
else
{
dP_dt = change / 4; // divide by 4 as this is the difference in time from 0 value
}
pressureAvg = pressureAvg2; // Equating the pressure at 0 to the pressure at 2 hour after 3 hours have past.
firstRound = false; // flag to let you know that this is on the past 3 hour mark. Initialized to 0 outside main loop.
}
int forecast = UNKNOWN;
if (minuteCount < 35 && firstRound) //if time is less than 35 min on the first 3 hour interval.
{
forecast = UNKNOWN;
}
else if (dP_dt < (-0.25))
{
forecast = THUNDERSTORM;
}
else if (dP_dt > 0.25)
{
forecast = UNSTABLE;
}
else if ((dP_dt > (-0.25)) && (dP_dt < (-0.05)))
{
forecast = CLOUDY;
}
else if ((dP_dt > 0.05) && (dP_dt < 0.25))
{
forecast = SUNNY;
}
else if ((dP_dt >(-0.05)) && (dP_dt < 0.05))
{
forecast = STABLE;
}
else
{
forecast = UNKNOWN;
}
// uncomment when debugging
#ifdef MY_DEBUG
Serial.print(F("Forecast at minute "));
Serial.print(minuteCount);
Serial.print(F(" dP/dt = "));
Serial.print(dP_dt);
Serial.print(F("kPa/h --> "));
Serial.println(weather[forecast]);
#endif
return forecast;
}```