ESP8266 PWM High Power LED Dimmer

Posted on 04/07/2016 by Adam

I was grateful to receive a package in the post from one of my subscribers. It contained everything I needed to build an LED PWM Dimmer circuit using an ESP8266-ESP01.

I used some code from Sparkfun as the basis of the code below and just made a few changes so that I could dim the LED rather than just turn it on and off.

[code]

#include <ESP8266WiFi.h>

//////////////////////
// WiFi Definitions //
//////////////////////
const char WiFiAPPSK[] = "sparkfun";

/////////////////////
// Pin Definitions //
/////////////////////
const int LED_PIN = 2; // GPIO2
const int ANALOG_PIN = A0; // The only analog pin on the Thing
const int DIGITAL_PIN = 12; // Digital pin to be read

WiFiServer server(80);

void setup()
{
initHardware();
setupWiFi();
server.begin();
}

void loop()
{
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}

// Read the first line of the request
String req = client.readStringUntil(‘\r’);
Serial.println(req);
client.flush();

// Match the request
int val = -1; // We’ll use ‘val’ to keep track of both the
// request type (read/set) and value if set.
if (req.indexOf("/led/0") != -1)
val = 0; // Will write LED low
else if (req.indexOf("/led/20") != -1)
val = 204; // Will write LED 20%
else if (req.indexOf("/led/40") != -1)
val = 408; // Will write LED high
else if (req.indexOf("/led/60") != -1)
val = 612; // Will write LED high
else if (req.indexOf("/led/80") != -1)
val = 816; // Will write LED high
else if (req.indexOf("/led/100") != -1)
val = 1023; // Will write LED high
else if (req.indexOf("/read") != -1)
val = -2; // Will print pin reads
// Otherwise request will be invalid. We’ll say as much in HTML

// Set GPIO2 according to the request
if (val >= 0)
analogWrite(LED_PIN, val);

client.flush();

// Prepare the response. Start with the common header:
String s = "HTTP/1.1 200 OK\r\n";
s += "Content-Type: text/html\r\n\r\n";
s += "<!DOCTYPE HTML>\r\n<html>\r\n";
// If we’re setting the LED, print out a message saying we did
if (val >= 0)
{
s += "LED is now ";
s += (val)?"high":"low";
}
else if (val == -2)
{ // If we’re reading pins, print out those values:
s += "Analog Pin = ";
s += String(analogRead(ANALOG_PIN));
s += "<br>"; // Go to the next line.
s += "Digital Pin 12 = ";
s += String(digitalRead(DIGITAL_PIN));
}
else
{
s += "Invalid Request.<br> Try /led/20, /led/40, /led/60, /led/80, /led/100, /led/0, or /read.";
}
s += "</html>\n";

// Send the response to the client
client.print(s);
delay(1);
Serial.println("Client disonnected");

// The client will actually be disconnected
// when the function returns and ‘client’ object is detroyed
}

void setupWiFi()
{
WiFi.mode(WIFI_AP);

// Do a little work to get a unique-ish name. Append the
// last two bytes of the MAC (HEX’d) to "Thing-":
uint8_t mac[WL_MAC_ADDR_LENGTH];
WiFi.softAPmacAddress(mac);
String macID = String(mac[WL_MAC_ADDR_LENGTH – 2], HEX) +
String(mac[WL_MAC_ADDR_LENGTH – 1], HEX);
macID.toUpperCase();
String AP_NameString = "ESP8266 Thing " + macID;

char AP_NameChar[AP_NameString.length() + 1];
memset(AP_NameChar, AP_NameString.length() + 1, 0);

for (int i=0; i<AP_NameString.length(); i++)
AP_NameChar[i] = AP_NameString.charAt(i);

WiFi.softAP(AP_NameChar, WiFiAPPSK);
}

void initHardware()
{
Serial.begin(115200);
pinMode(DIGITAL_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// Don’t need to set ANALOG_PIN as input,
// that’s all it can be.
}

[/code]