Changed from 8266 to ESP32 Cant figure out how to add Bluetooth in code

I have a shade motor that I am working on. Can you all take a look at my code. Please forgive the naivety. Oh additionally I have a stepper motor running a worm gear in this application.


// Load Wi-Fi library
#include <ESP8266WiFi.h>
#include <WiFi.h>

// Replace with your network credentials
const char* ssid     = "Unknown";
const char* password = "password";

// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;
// Auxiliar variable to store the current output state
String outputState = "off"; //initially set to off
String outputDirection = "n/a"; //initially no direction

// Shade Inputs 
const int LSU = D1;
const int LSD = D2;
const int RSU = D3;
const int RSD = D4;

//from BasicHttpClient example
/*void setupWifi(){
   // USE_SERIAL.setDebugOutput(true);
    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
    WiFiMulti.addAP("ROBONET", "Mast3rSUsh1");

void connectToWifi(){
  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
  // Print local IP address and start web server
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");

void setup() {
  // put your setup code here, to run once:
  pinMode(RSU, OUTPUT);
  pinMode(RSD, OUTPUT);
  pinMode(LSU, OUTPUT);
  pinMode(LSD, OUTPUT);

  stopMotors(); //ensure motors are off on initialization
  connectToWifi(); //rui example
// Even is Up, Odd is Down
void stopMotors(){
  Serial.println("all stop...");
  digitalWrite(LSU, LOW);
  digitalWrite(LSD, LOW);  
  digitalWrite(RSU, LOW);
  digitalWrite(RSD, LOW);


void leftup(){
  Serial.println("left up...");
  digitalWrite(LSU, HIGH);
  digitalWrite(LSD, LOW);


void leftstop(){
  Serial.println("left stop...");
  digitalWrite(LSU, LOW);
  digitalWrite(LSD, LOW);

void leftdown(){
  Serial.println("left down..."); 
  digitalWrite(LSU, LOW);
  digitalWrite(LSD, HIGH);

void rightup(){
  Serial.println("right up...");
  digitalWrite(RSU, HIGH);
  digitalWrite(RSD, LOW);  


void rightstop(){
  Serial.println("right stop...");
  digitalWrite(RSU, LOW);
  digitalWrite(RSD, LOW);  

void rightdown(){
  Serial.println("right down...");
  digitalWrite(RSU, LOW);
  digitalWrite(RSD, HIGH);   

//Create a web server on local network address
void createWebServer(){
  WiFiClient client = server.available();   // Listen for incoming clients
  if (client) {                             // If a new client connects,
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c =;             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Connection: close");
            // Motor Control (On & Off)
            if (header.indexOf("GET /control/leftup") >= 0) {
              outputState = "LEFT SIDE ON";
              outputDirection = "Moving Left Side UP";

            } else if (header.indexOf("GET /control/leftstop") >= 0) {
              outputState = "LEFT SIDE OFF";
              outputDirection = "LEFT STOPPED";

            } else if (header.indexOf("GET /control/leftdown") >= 0) {
              outputState = "LEFT SIDE ON";
              outputDirection = "Moving Left Side Down";

            } else if (header.indexOf("GET /control/rightup") >= 0) {
              outputState = "RIGHT SIDE ON";
              outputDirection = "Moving Right Side UP";

            } else if (header.indexOf("GET /control/rightstop") >= 0) {
              outputState = "RIGHT SIDE OFF";
              outputDirection = "RIGHT STOPPED";

            } else if (header.indexOf("GET /control/rightdown") >= 0) {
              outputState = "RIGHT SIDE ON";
              outputDirection = "Moving Right Side Down";
            } else if (header.indexOf("GET /control/stop") >= 0) {
              outputState = "ALL OFF";
              outputDirection = "Shades Stopped";

            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons 
            // Feel free to change the background-color and font-size attributes to fit your preferences
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button2 { background-color: #a15dd9; border: none; color: Black; padding: 15px 40px; margin: 25px");            
            client.println("text-decoration: none; font-size: 22px; margin: 2px; cursor: pointer;}</style></head>");
            // Web Page Heading
            client.println("<h2>WiFi Shade Controller</h2>");
            client.println("<p> Take control of your Shades from anywhere on your home network! </p>");
            client.println(" ");
            client.println(" ");
            // Display current state, and controller buttons for shades 
            client.println("<p>Shade State " + outputState + " Shade Direction " + outputDirection +"</p>");
            client.println("<p><a href=\"/control/leftup\"><button class=\"button2\">LEFT UP</button></a></p>");
            client.println("<p><a href=\"/control/leftstop\"><button class=\"button2\">LEFT STOP</button></a></p>");          
            client.println("<p><a href=\"/control/leftdown\"><button class=\"button2\">LEFT DOWN</button></a></p>");
            client.println("<p><a href=\"/control/rightup\"><button class=\"button2\">RIGHT UP</button></a></p>");
            client.println("<p><a href=\"/control/rightstop\"><button class=\"button2\">RIGHT STOP</button></a></p>");
            client.println("<p><a href=\"/control/rightdown\"><button class=\"button2\">RIGHT DOWN</button></a></p>");
            client.println("<p><a href=\"/control/stop\"><button class=\"button2\">ALL STOP</button></p>");
            // The HTTP response ends with another blank line
            // Break out of the while loop
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
    // Clear the header variable
    header = "";
    // Close the connection
    Serial.println("Client disconnected.");

void loop(){

Thanks for your guidance.


What’s your question exactly?

Have you looked at the BlueToothSerial examples in the IDE ?

//This example code is in the Public Domain (or CC0 licensed, at your option.)
//By Evandro Copercini - 2018
//This example creates a bridge between Serial and Classical Bluetooth (SPP)
//and also demonstrate that SerialBT have the same functionalities of a normal Serial

#include "BluetoothSerial.h"

#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it

BluetoothSerial SerialBT;

void setup() {
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");

void loop() {
  if (Serial.available()) {
  if (SerialBT.available()) {

#include the BluetoothSerial library file
Create an instance of the BluetoothSerial object
Give it a name with the begin() method
Use the object like any other serial connection

See example above

Wouldn't this be calling on a second void loop,


What exactly do you want to use Bluetooth for ?

So where are you stuck ?

I know nothing about Alexa, but if it requires commands to be sent via Bluetooth then what form do the commands take ?

Post your currently working code

Please follow the advice on posting code given in posting code

In particular note the advice to Auto format code in the IDE and to use code tags when posting code here as it prevents some combinations of characters in code being interpreted as HTML commands such as italics, bold or a smiley character, all of which render the code useless

Yes, I do see your code, sorry

If you look at the Bluetooth serial that you mention, you can see there is a void loop within the program already, so I cannot enter a second one.

You do not need to have a second loop() function in order to read from or write to Bluetooth. Your current loop() function calls createWebServer() repeatedly and it could just as easily call a function to read or write from/to Bluetooth as well

That is not code for an ESP32.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.