I am trying to use a on-off switch with the ESP8266 to change whether GPI02 is HIGH or LOW. I am using GPIO3 as input. My circuit looks like this:
The red area to the right is a relay, I wasn't sure how to make it work in fritzing but I am sure that it is wired correctly, it just has a signal, +, and -, pin. The more important stuff is happening with the ESP8266. First, here is the code:
/*
This a simple example of the aREST Library for the ESP8266 WiFi chip.
This example illustrate the cloud part of aREST that makes the board accessible from anywhere
See the README file for more details.
Written in 2015 by Marco Schwartz under a GPL license.
*/
// Import required libraries
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <aREST.h>
// Clients
WiFiClient espClient;
PubSubClient client(espClient);
// Create aREST instance
aREST rest = aREST(client);
// Unique ID to identify the device for cloud.arest.io
char* device_id = "ew1zard";
// WiFi parameters
const char* ssid = "MaisonBlanche";
const char* password = "7932gLBw";
// Functions
void callback(char* topic, byte* payload, unsigned int length);
void setup(void)
{
// Set input / output pin
pinMode(3, INPUT);
pinMode(2, OUTPUT);
//pinMode(2, OUTPUT);
//digitalWrite(3, 0);
// Start Serial
Serial.begin(115200);
// Set callback
client.setCallback(callback);
// Give name & ID to the device (ID should be 6 characters long)
rest.set_id(device_id);
rest.set_name("esp8266");
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Set output topic
char* out_topic = rest.get_topic();
}
void loop() {
// Connect to the cloud
rest.handle(client);
int read3 = digitalRead(3);
Serial.println(read3 + " input");
digitalWrite(2, read3);
}
// Handles message arrived on subscribed topic(s)
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("request from interwebs");
rest.handle_callback(client, topic, payload, length);
}
The output of the Serial.println
is always input
(there is no HIGH or LOW or 1 or 0, or whatever it should be, before the input. I have verified that the switch is working. In the on
position it is sending 3.3v
to GPIO3 (I have measured it with my multimeter) and still the input never changes. In the off
position it sends 0v and the ESP8266 just acts as if there is nothing to read it seems. Since I am using this with aREST
and you can set the mode of pins through that, I thought maybe I had to set the pinMode
with the aREST
request cloud.arest.io/xxxxx/mode/3/i
and it verifies with a JSON response that the pin is being set to input, but still no reading. Do I not have the ESP8266 wired correctly for this? Maybe I need some pull-ups/pull downs or I can't use the pins in the configuration I am using them? One other thing, when I set the input pin with aREST, it turns on the relay (sending something through GPIO2 for some reason). If I don't set the input with aREST
the relay stays off.
UPDATE
I tried with this code to rule out that it might be aREST
:
void setup() {
// put your setup code here, to run once:
pinMode(3, INPUT);
pinMode(2, OUTPUT);
// Start Serial
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
int read3 = digitalRead(3);
Serial.print(read3);
Serial.println(" input");
digitalWrite(2, read3);
}
It always outputs 0 input
, the ESP8266 seems to be ignoring that input pin.
UPDATE
I am now trying with GPIO0 as input. I have the switch wired to ground, and it leads to GPIO0. When I turn it on, GPIO0 reads 1
(on), then I use the switch and it turns the relay off correctly, then I try and turn it on again, and nothing happens, GPIO0 continues to be read at 0
. So I can't use the switch past the initial off
.