Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. My Project
  3. DHT11, W5100, OLED display node

DHT11, W5100, OLED display node

Scheduled Pinned Locked Moved My Project
4 Posts 3 Posters 421 Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • giangiredG Offline
    giangiredG Offline
    giangired
    wrote on last edited by
    #1

    Hi.
    I have a node composed by Arduino Nano, DHT11 sensor, mini W5100 ethernet shield and OLED 128x32 display.
    I'm using Adafruit GFX library to control the OLED display.
    The problem is the code size that seems to be more than 32K therefore I cannot compile it.
    I tried to squeeze the code but with no success. Any help? Suggestion?

    Here my code

    // ----------------------------------------------------------- Definitions
    #define MY_DEBUG
    
    #define MY_GATEWAY_W5100
    #define MY_IP_ADDRESS 192,168,1,71
    #define MY_PORT 5070
    
    #define CHILD_ID_HUM 0
    #define CHILD_ID_TEMP 1
    
    #define MY_MAC_ADDRESS 0x00, 0x01, 0x02, 0x03, 0x04, 0x05
    
    // Set this to the pin you connected the DHT's data pin to
    #define DHT_DATA_PIN 3
    
    // If any Permanent Small Offset to the real temperatures in °C
    #define SENSOR_TEMP_OFFSET 0
    
    // OLED SSD1306 
    #define SCREEN_WIDTH 128 // OLED display width, in pixels
    #define SCREEN_HEIGHT 32 // OLED display height, in pixels
    
    // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
    #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
    
    #define COLORBLACK 0x0000 // BLACK
    
    // ----------------------------------------------------------- Libraries
    #include <Ethernet.h>
    //#include <SPI.h>
    #include <MySensors.h>
    #include <DHT.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    
    // ----------------------------------------------------------- Variables
    
    // Sleep time between sensor updates (in milliseconds)
    // Must be >1000ms for DHT22 and >2000ms for DHT11
    static const uint64_t UPDATE_INTERVAL = 5000;
    bool metric = true;
    
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    DHT dht;
    
    unsigned long startMillis;  //some global variables available anywhere in the program
    unsigned long currentMillis;
    const unsigned long period = 2000;  //the value is a number of milliseconds
    
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    
    
    bool FirstTime; // to execute an action once only
    
    // ----------------------------------------------------------- Functions
    
    void presentation()  
    {
       sendSketchInfo("Temp/Humidity Soggiorno", "1.0");
       present(CHILD_ID_HUM, S_HUM);
       present(CHILD_ID_TEMP, S_TEMP);
    
       metric = getControllerConfig().isMetric;
    }
    
    
    void setup()
    {
    //---------------------------------------------------------- Serial Begin
    Serial.begin(9600);
    //---------------------------------------------------------- DHT11
      dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
      
      if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) 
      {
        #ifdef MY_DEBUG
        Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
        #endif
      }
      
      // Sleep for the time of the minimum sampling period to give the sensor time to power up
      // (otherwise, timeout errors might occure for the first reading)
      sleep(dht.getMinimumSamplingPeriod());
    
    //---------------------------------------------------------- OLED SSD1306
    // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
      if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) // Address 0x3C for 128x32
      { 
        #ifdef MY_DEBUG
        Serial.println(F("SSD1306 allocation failed"));
        #endif
        for(;;); // Don't proceed, loop forever
      }
    
      // Show initial display buffer contents on the screen the library initializes this with an Adafruit splash screen.
      display.display();
      delay(500); // Pause for 0,5 second
    
      // Clear the buffer
      display.clearDisplay();
    
      display.setTextSize(2); // Draw 2X-scale text
      display.setTextColor(SSD1306_WHITE);
    
      display.setCursor(2, 16);
      display.println(F("Waiting...."));
      display.display();      // Show initial text
      delay(100);
    
      // Variable to make action just the first time
      FirstTime = true;
     
    //---------------------------------------------------------- Timing
      startMillis = millis();  //initial start time
    }
    
    
    void loop()      
    {  
      bool changed; // to note the change of value
      
    //---------------------------------------------------------- Verify Timing for Reading    
      currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
      if (currentMillis - startMillis >= period)  //test whether the period has elapsed
      {
        startMillis = currentMillis;  
        changed = false;
      
    //---------------------------------------------------------- WakeUp Sensor
        dht.readSensor(true);
    
    //---------------------------------------------------------- Temperature    
        int temperature = dht.getTemperature();
        
        if (isnan(temperature)) 
        {
          #ifdef MY_DEBUG
          Serial.println("Failed reading temperature from DHT!");
          #endif
        } 
        else 
        {
          // apply the offset before converting to something different than Celsius degrees
          temperature += SENSOR_TEMP_OFFSET;
           if (!metric) 
           {
              temperature = dht.toFahrenheit(temperature);
           }
           send(msgTemp.set(temperature, 1));
          #ifdef MY_DEBUG
          Serial.print("T: ");
          Serial.println(temperature);
          #endif
          
          changed = true;
          CancellaQuadro();
    
          display.setCursor(64, 0);
          display.print(temperature);
        } 
    //---------------------------------------------------------- Humidity    
        int humidity = dht.getHumidity();
        
        if (isnan(humidity)) 
        {
          #ifdef MY_DEBUG
          Serial.println("Failed reading humidity from DHT");
          #endif
        } 
        else 
        {
           send(msgHum.set(humidity, 1));
          #ifdef MY_DEBUG
          Serial.print("H: ");
          Serial.println(humidity);
          #endif
    
          if (changed == false)
          {
              CancellaQuadro();
          }
          display.setCursor(64, 18);
          display.print(humidity);
        } 
        display.display();      
        delay(100);
      }
    }
    
    void CancellaQuadro(void) {
        if (FirstTime == true)
        {
          display.clearDisplay();
          display.setCursor(2, 0);
          display.print(F("Temp:"));
          display.setCursor(90, 0);
          display.print((char)247); // degree symbol
          display.setCursor(105, 0);
          display.print(F("C"));
          display.setCursor(2, 18);
          display.print(F("Hum :"));
          display.setCursor(90, 18);
          display.print(F("%"));
          display.display();
          delay(100);
          FirstTime = false;
        }else
        {
          display.fillRect(64,0, 25, 16, COLORBLACK);
          display.fillRect(64,16, 25, 32, COLORBLACK);
          display.display();
          delay(1);
        }
    }
    mfalkviddM 1 Reply Last reply
    0
    • giangiredG giangired

      Hi.
      I have a node composed by Arduino Nano, DHT11 sensor, mini W5100 ethernet shield and OLED 128x32 display.
      I'm using Adafruit GFX library to control the OLED display.
      The problem is the code size that seems to be more than 32K therefore I cannot compile it.
      I tried to squeeze the code but with no success. Any help? Suggestion?

      Here my code

      // ----------------------------------------------------------- Definitions
      #define MY_DEBUG
      
      #define MY_GATEWAY_W5100
      #define MY_IP_ADDRESS 192,168,1,71
      #define MY_PORT 5070
      
      #define CHILD_ID_HUM 0
      #define CHILD_ID_TEMP 1
      
      #define MY_MAC_ADDRESS 0x00, 0x01, 0x02, 0x03, 0x04, 0x05
      
      // Set this to the pin you connected the DHT's data pin to
      #define DHT_DATA_PIN 3
      
      // If any Permanent Small Offset to the real temperatures in °C
      #define SENSOR_TEMP_OFFSET 0
      
      // OLED SSD1306 
      #define SCREEN_WIDTH 128 // OLED display width, in pixels
      #define SCREEN_HEIGHT 32 // OLED display height, in pixels
      
      // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
      #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
      
      #define COLORBLACK 0x0000 // BLACK
      
      // ----------------------------------------------------------- Libraries
      #include <Ethernet.h>
      //#include <SPI.h>
      #include <MySensors.h>
      #include <DHT.h>
      #include <Adafruit_GFX.h>
      #include <Adafruit_SSD1306.h>
      
      // ----------------------------------------------------------- Variables
      
      // Sleep time between sensor updates (in milliseconds)
      // Must be >1000ms for DHT22 and >2000ms for DHT11
      static const uint64_t UPDATE_INTERVAL = 5000;
      bool metric = true;
      
      MyMessage msgHum(CHILD_ID_HUM, V_HUM);
      MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
      DHT dht;
      
      unsigned long startMillis;  //some global variables available anywhere in the program
      unsigned long currentMillis;
      const unsigned long period = 2000;  //the value is a number of milliseconds
      
      Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
      
      
      bool FirstTime; // to execute an action once only
      
      // ----------------------------------------------------------- Functions
      
      void presentation()  
      {
         sendSketchInfo("Temp/Humidity Soggiorno", "1.0");
         present(CHILD_ID_HUM, S_HUM);
         present(CHILD_ID_TEMP, S_TEMP);
      
         metric = getControllerConfig().isMetric;
      }
      
      
      void setup()
      {
      //---------------------------------------------------------- Serial Begin
      Serial.begin(9600);
      //---------------------------------------------------------- DHT11
        dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
        
        if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) 
        {
          #ifdef MY_DEBUG
          Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
          #endif
        }
        
        // Sleep for the time of the minimum sampling period to give the sensor time to power up
        // (otherwise, timeout errors might occure for the first reading)
        sleep(dht.getMinimumSamplingPeriod());
      
      //---------------------------------------------------------- OLED SSD1306
      // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
        if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) // Address 0x3C for 128x32
        { 
          #ifdef MY_DEBUG
          Serial.println(F("SSD1306 allocation failed"));
          #endif
          for(;;); // Don't proceed, loop forever
        }
      
        // Show initial display buffer contents on the screen the library initializes this with an Adafruit splash screen.
        display.display();
        delay(500); // Pause for 0,5 second
      
        // Clear the buffer
        display.clearDisplay();
      
        display.setTextSize(2); // Draw 2X-scale text
        display.setTextColor(SSD1306_WHITE);
      
        display.setCursor(2, 16);
        display.println(F("Waiting...."));
        display.display();      // Show initial text
        delay(100);
      
        // Variable to make action just the first time
        FirstTime = true;
       
      //---------------------------------------------------------- Timing
        startMillis = millis();  //initial start time
      }
      
      
      void loop()      
      {  
        bool changed; // to note the change of value
        
      //---------------------------------------------------------- Verify Timing for Reading    
        currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
        if (currentMillis - startMillis >= period)  //test whether the period has elapsed
        {
          startMillis = currentMillis;  
          changed = false;
        
      //---------------------------------------------------------- WakeUp Sensor
          dht.readSensor(true);
      
      //---------------------------------------------------------- Temperature    
          int temperature = dht.getTemperature();
          
          if (isnan(temperature)) 
          {
            #ifdef MY_DEBUG
            Serial.println("Failed reading temperature from DHT!");
            #endif
          } 
          else 
          {
            // apply the offset before converting to something different than Celsius degrees
            temperature += SENSOR_TEMP_OFFSET;
             if (!metric) 
             {
                temperature = dht.toFahrenheit(temperature);
             }
             send(msgTemp.set(temperature, 1));
            #ifdef MY_DEBUG
            Serial.print("T: ");
            Serial.println(temperature);
            #endif
            
            changed = true;
            CancellaQuadro();
      
            display.setCursor(64, 0);
            display.print(temperature);
          } 
      //---------------------------------------------------------- Humidity    
          int humidity = dht.getHumidity();
          
          if (isnan(humidity)) 
          {
            #ifdef MY_DEBUG
            Serial.println("Failed reading humidity from DHT");
            #endif
          } 
          else 
          {
             send(msgHum.set(humidity, 1));
            #ifdef MY_DEBUG
            Serial.print("H: ");
            Serial.println(humidity);
            #endif
      
            if (changed == false)
            {
                CancellaQuadro();
            }
            display.setCursor(64, 18);
            display.print(humidity);
          } 
          display.display();      
          delay(100);
        }
      }
      
      void CancellaQuadro(void) {
          if (FirstTime == true)
          {
            display.clearDisplay();
            display.setCursor(2, 0);
            display.print(F("Temp:"));
            display.setCursor(90, 0);
            display.print((char)247); // degree symbol
            display.setCursor(105, 0);
            display.print(F("C"));
            display.setCursor(2, 18);
            display.print(F("Hum :"));
            display.setCursor(90, 18);
            display.print(F("%"));
            display.display();
            delay(100);
            FirstTime = false;
          }else
          {
            display.fillRect(64,0, 25, 16, COLORBLACK);
            display.fillRect(64,16, 25, 32, COLORBLACK);
            display.display();
            delay(1);
          }
      }
      mfalkviddM Offline
      mfalkviddM Offline
      mfalkvidd
      Mod
      wrote on last edited by mfalkvidd
      #2

      @giangired maybe you can use https://tenbaht.github.io/sduino/api/Mini_SSD1306/ instead?
      https://github.com/stanleyseow/ArduinoTracker-MicroAPRS/tree/master/libraries/SSD1306_text might be an alternative.

      There is not much you can do to optimize your sketch, almost all space is used by the libraries.

      giangiredG 1 Reply Last reply
      0
      • mfalkviddM mfalkvidd

        @giangired maybe you can use https://tenbaht.github.io/sduino/api/Mini_SSD1306/ instead?
        https://github.com/stanleyseow/ArduinoTracker-MicroAPRS/tree/master/libraries/SSD1306_text might be an alternative.

        There is not much you can do to optimize your sketch, almost all space is used by the libraries.

        giangiredG Offline
        giangiredG Offline
        giangired
        wrote on last edited by giangired
        #3

        @mfalkvidd Thanks a lot as usual! Any I cannot download the libraries: can you give me some instructions to load on my Arduino tool?

        1 Reply Last reply
        0
        • bgunnarbB Offline
          bgunnarbB Offline
          bgunnarb
          wrote on last edited by
          #4

          Did you try commenting out #define MY_DEBUG ?
          That might save you a few bytes.

          I have never been so busy since I retired!

          1 Reply Last reply
          0
          Reply
          • Reply as topic
          Log in to reply
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes


          39

          Online

          11.7k

          Users

          11.2k

          Topics

          113.1k

          Posts


          Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
          • Login

          • Don't have an account? Register

          • Login or register to search.
          • First post
            Last post
          0
          • MySensors
          • OpenHardware.io
          • Categories
          • Recent
          • Tags
          • Popular