Using the 4 Pins of the ESP8266-01

Introduction: Using the 4 Pins of the ESP8266-01

About: I am a physician by trade. After a career in the pharmeceutical world I decided to take it a bit slower and do things I like. Other than my hobbies that involves grassroots medicine in S.E.&P Asia. I have buil…

Note: This project is basically an extension of an earlier instructable that only used 2 pins.
The limited number (4) of GPIO pins on the ESP8266-01 may seem like an obstacle, for any serious application.
Yet if one uses the pins in a smart way it is very well possible to do a lot with only those 4 pins.
In some of my recent instructables, I have shown the use of a DHT11 a DS18B20, an OLED, an RTC and a BMP180 with the ESP8266-01.
In this instructable I set out to use 4 sensors and a display, while also uploading the acquired data to Thingspeak. It actually is expanding on a project of monitoring the atmosphere in and around my chicken coop. Yes, you could call this a weatherstation, but it is just to illustrate the use of the 4 pins, you could easily make something else this way

I will be using 2 pins for I2C (BMP180 and OLED)
1 pin for 2 DS18B20 sensors via the OneWire protocol
1 pin for the DHT11
Although the ESP8266-01 now has all its pins used, I can still add more sensors (or actuators) through the OneWire protocol and/or via the I2C protocol.

So, what do we need:
BOM

  • ESP8266-01
  • 2x DS18B20
  • 1x DHT11
  • 1x BMP180
  • OLED (optional)

and ofcourse a breadboard, a 3.3 V PSU and some breadboard wires and a Thingspeak acount

Just some remarks regarding the BOM:

  • ESP8266-01
    Obviously the project is about utilizing the limited pins of the ESP8266-01, but if you still need to buy one, you could consider an ESP8266-12 that has more pins
  • DHT11
    A cheap all purpose humidity and temperature sensor. It is not hugely accurate but it will do. If you still need to buy one, you could opt for the DHT22 that is supposedly more accurate, but you could also opt for the AMS2321. That is a sort of DHT22 that is suitable for I2C, thus freeing another pin
  • BMP180
    measures temperature and Airpressure. It is the successor of the BMP085, but it also now has some suvessors itself. There is the (cheaper) BMP280, but you could also opt for the BME280 that measures temperature, airpresure AND humidity. That way you can save on the DHT/AMS sensor
  • OLED
    I just used that so I quickly could see whether the sensors were read, but you could just as well check it on Thingspeak. The OLED is too small anyway to print all the read values

Step 1: The Circuit

The 4 pins of the ESP8266 are not indicated as such on the PCB, and most images only clearly state GPIO0 and GPIO2.
However the ESP826-01 has a a GPIO1 pin (the Tx pin) and a GPIO3 pin (the Rx pin).
i will be using those pins as follows

  • GPIO0 -> SDA pin of the I2C port
  • GPIO1 ->DHT11
  • GPIO2-> SCL pin of the I2C port
  • GPIO3-> OneWire Bus

As my I2C modules already have pull up resistors, I will not add any I2C pullup resistors there. The DS18B20 still needs a pull up resistor for which I used a 4k7, but it is really not that critical, a 10k is also good. The DHT11 supposedly also needs a pull-up resistor but I found it to work without one as well. adding a 4k7 resistor didnt change any of the readings, so I left it out. Many of the 3 pin DHT11 modules, already have a 10 k soldered onto the module.

I just realized that I didnt draw the connections for the OLED. That is because I only hooked it up for a quick check, but should you want to add it, it is just a matter of connecting SDA to SDA and SCL to SCL... and ofcourse the ground and Vcc pins to their counterparts

Step 2: The Program

The program is quite straightforward. First it sets up the libraries and the sensors.
It attaches the DHT11 to pin 1 (Tx) and the OnWire bus for the DS18B20 to pin 3 (Rx). In order to use more than 1 DS18B20 sensor on the OneWire bus, you need to know their 'unique adress'. If you do not have that then you need a program to read those addresses. Do that on an arduino for ease.

In the program you still have to provide your WiFi credentials as well as the write API for your Thingspeak Channel

/*
   Field 1 temp roost (DHT11)
   Field 2 humidity roost (DHT11)
   field 3 Coop temperature (DS18B20)
   field 4 soil temperature (DS18B20)
   field 5 Airpressure (bmp180)
   field 6 Outside temperature (bmp180)
 * */
#include <DHT.h>
#include <OneWire.h> // <a href="http://www.pjrc.com/teensy/td_libs_OneWire.html"> http://www.pjrc.com/teensy/td_libs_OneWire.html
</a>
#include <DallasTemperature.h> //  <a href="http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library"> http://milesburton.com/Main_Page?title=Dallas_Tem...</a>
#include <Adafruit_BMP085.h>
#include <ESP8266WiFi.h>
#include "SSD1306.h"
SSD1306  display(0x3c, 0, 2);

#define DHTPIN 1  //GPIO1 (Tx)
#define DHTTYPE  DHT11
#define ONE_WIRE_BUS 3 // GPIO3=Rx

const char* ssid     = "YourSSID";
const char* password = "YourPassword";
const char* host = "api.thingspeak.com";

const char* writeAPIKey = "W367812985"; //use YOUR writeApi

//DHT11 stuff
float temperature_buiten;
float temperature_buiten2;
DHT dht(DHTPIN, DHTTYPE, 15);
//DS18b20 stuff
OneWire oneWire(ONE_WIRE_BUS); //oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);// Pass address of our oneWire instance to Dallas Temperature.
DeviceAddress Probe01 = { 0x28, 0x0F, 0x2A, 0x28, 0x00, 0x00, 0x80, 0x9F};
DeviceAddress Probe02={0x28, 0x10, 0xA4, 0x57, 0x04, 0x00, 0x00, 0xA9};
// bmp180 stuff
Adafruit_BMP085 bmp;

void setup() {
  //I2C stuff
   Wire.pins(0, 2);
  Wire.begin(0, 2);
  // Initialize sensors
  //dht 11 stuff
  dht.begin();
  //ds18b20 stuff
  sensors.begin();//ds18b20
  // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
  sensors.setResolution(Probe01, 10);
  sensors.setResolution(Probe02, 10);
//bmp180 stuff
  if (!bmp.begin()) {
    //   Serial.println("No BMP180 / BMP085");
    //   while (1) {}

  }
  //OLED stuff
   display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);
  delay(1000);

  //  Connect to WiFi network
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}

void loop() {
  //ds18b20stuff-------------------
  sensors.requestTemperatures(); // Send the command to get temperatures
  temperature_buiten = sensors.getTempC(Probe01);//
  temperature_buiten2 = sensors.getTempC(Probe02);//
  //dht11 stuff--------------------
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  if (isnan(humidity) || isnan(temperature)) {
    return;
    
  }
  //bmp stuff-------------------------
    String t= String(bmp.readTemperature());
    String p=String(bmp.readPressure());
//OLED stuff--------------------------
  display.clear();
  display.drawString(0,10,p);//bmp pressure
  display.drawString(0,24,String(temperature_buiten));//ds18b20
  display.drawString(0,38,String(humidity));//dht11
  display.display();

  // make TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    return;
  }

  String url = "/update?key=";
  url += writeAPIKey;
  url += "&field1=";
  url += String(temperature);// roost (DHT1)
  url += "&field2=";
  url += String(humidity);// roost (DHT11)
  url += "&field3=";
  url += String(temperature_buiten);//coop temperature (DS18B20 nr 1)
  url += "&field4=";
  url += String(temperature_buiten2); //soil temperature (DS18B29 nr 2)
  url +="&field5=";
  url +=String(bmp.readTemperature());Outside temperature (BMP180)
  url +="&field6=";
  url +=String(bmp.readPressure());// Airpressure (BMP180)
  url += "\r\n";

  // Send request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");

  delay(1000);

}

........

Step 3: More

Currently this program only monitors, but what is to stop you from adding a BH1750 I2C light sensor to measure if it is evening or morning or an RTC to know the time of day and to open and close the door of the coop automatically with aid of a PCF8574 I2C I/O expansion card, or as it is already in the garden, add a PCF8591 or ADS1115 AD converter to measure soil humidity and activate a pump when necessary. Or maybe switching on the water basin heater when the temperature falls below zero
if there is an I2 C chip for it, the ESP8266 can probably use it.

An important note though: The program as is works well, but if you add other sensors to Rx or Tx, especially if you make them into outputs, the pins may suddenly remember they are not really GPIO pins. It is better to tell the pins from the start that they are now GPIO pins.
One does that by putting the following statements in the setup:

pinMode(1, FUNCTION_3);
pinMode(3, FUNCTION_3);

Be the First to Share

    Recommendations

    • Battery Powered Contest

      Battery Powered Contest
    • Plywood Challenge

      Plywood Challenge
    • Plastic Contest

      Plastic Contest

    22 Discussions

    1
    JamesR259
    JamesR259

    4 months ago

    Never been able to connect an I2C sensor directly to an esp8266-01 before reading your tutorial. Great Job!!

    0
    diy_bloke
    diy_bloke

    Reply 4 months ago

    Thank you. I am happy it helped you

    0
    michelgbm
    michelgbm

    Question 5 months ago

    Where found your's all library ssd1306

    thank
    michel

    0
    diy_bloke
    diy_bloke

    Answer 5 months ago

    Michel, I am no longer sur which one exactly I used but e.g. adafruit has one

    0
    diy_bloke
    diy_bloke

    Reply 1 year ago

    Ah, thenk you. That was an iconic site. Sad to see it is off line

    0
    woodnboats
    woodnboats

    Reply 1 year ago

    http://web.archive.org/web/20160530014920/http://a...

    This url works for me in Firefox on Windows 10. It takes you to the archived home page of the Arduino-info wiki. From there you can explore the site. There is a ton of good info, which should be available as long as web.archive.org exists.
    Let me know if you can't get in to it, and I'll try to help.

    K

    0
    diy_bloke
    diy_bloke

    Reply 1 year ago

    Thanks, will try

    0
    diy_bloke
    diy_bloke

    Reply 1 year ago

    Thank you

    0
    prive
    prive

    1 year ago

    Hi, i would like to use an esp-01 for my RGBW led strip. Would that be possible? If so, can you help me on my way?

    0
    diy_bloke
    diy_bloke

    Reply 1 year ago

    Also, if you use the esp-01, you may want to add
    pinMode(1, FUNCTION_3);
    pinMode(3, FUNCTION_3);
    To turn Rx and TX into true I/O

    0
    KatonaS
    KatonaS

    2 years ago on Step 3

    I really like this project, been searching for something like this for a while.
    Would you be so kind and adapt this concept for BMP280 only (ESP-01 connected to BMP 280 and sends temp pressure and altitude to Thingspeak) ?

    0
    diy_bloke
    diy_bloke

    Reply 2 years ago

    Katona
    That should be simple, just take a BMP280 instead of the BMP180.
    You may need to use the new BMP280 library

    Leave out the code for other sensors and the OLED.
    Apologies for my late reply, had some health issues

    0
    erkan_apache
    erkan_apache

    3 years ago

    Hi, nice work, but which library did you use for "ESP8266WiFi.h"?

    0
    diy_bloke
    diy_bloke

    Reply 3 years ago

    thanks. The library is part of the core

    0
    tytower
    tytower

    4 years ago

    I think they are up to ESP8266-23 or something like that . This is a bit behind the times isn't it?

    0
    diy_bloke
    diy_bloke

    Reply 4 years ago

    didnt know they had a 23, thought the 12 was the latest. Have heard abt the '100'.

    Anyway, thats exactly why in the Bill of Materials I advise people to get a newer version...... but if one still has a 01 laying around, no reason to give up on it. If I would do this project with a 12E-F it would work just as well... but It would have a lot of pins unused

    0
    yoh-there
    yoh-there

    4 years ago

    Great minimalistic project! Now (I am just teasing a bit) some deep sleep mode and this project can be "gardenized". I would expect, though not sure, that if it is possible, a thorough reconnect to the Wifi is probably needed.

    0
    diy_bloke
    diy_bloke

    Reply 4 years ago

    thanks, should be possible to reconnect after sleep. Just increasing the period between sending would already help.

    Sadly the DHT is not the friendliest in putting asleep projects as it needs a warm up time. Nevertheless i could put it asleep for 10 minutes and then give the dht11 a couple of seconds to warm up.