แหล่งรวมLibrary สำหรับงานAI CiRA CORE สำหรับบอร์ดESP32

Lab 0 Datasheet

   ภาพบอร์ดESP32 Devkit V1 

Datasheet การต่อวงจรกับโมดูลต่างๆเพื่อการใช้งานในหลักสูตรนี้

7 Word Document.pdf

Code QC Lotus ESP32 Devkit v1.0

//////// ผนวกไลบรารี่ ////////////

#include <Arduino.h>

#include<ArduinoJson.h>

#include <WiFi.h>

#include <PubSubClient.h>

#include <ESP32Servo.h>

#include <Wire.h>

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>


Adafruit_SSD1306 OLED(-1);


// Update these with values suitable for your network.

const char* ssid = "BJHome2G";

const char* password = "123456789";


// Config MQTT Server

#define mqtt_server "192.168.1.15"

#define mqtt_port 1883

#define mqtt_user "user"

#define mqtt_password "123456"





WiFiClient espClient;

PubSubClient client(espClient);

//////////Sound buzzer์///////////

int snd = 18;

//////// set io ///////////////////

int button =  27; ///button

int k_nob = 35 ; // K-nob

#define LED_PIN_A 14

#define LED_PIN_B 12

#define LED_PIN_C 23

#define LED_PIN_D 19

int ss1 = 32;  // servo ch1

int ss2 = 33;  // servo ch2

int ss3 = 34;  // servo ch3

Servo sv1;

Servo sv2;

Servo sv3;

///////////////////////////////////////////

////////// variable motor port/////////////

#define DR1  16

#define DR2  17

#define PWMR 4

/////////////////////////////////

#define DL1  2

#define DL2  15

#define PWML 13

/////////////////////////////////

void setup() {

  OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C); // address i2c 0x3C (for the 128x64)

  pinMode(button , INPUT);

  //////// Motor OUTPUT /////////

  pinMode(DL1, OUTPUT);

  pinMode(DL2, OUTPUT);

  pinMode(PWML, OUTPUT);

  pinMode(DR1, OUTPUT);

  pinMode(DR2, OUTPUT);

  pinMode(PWMR, OUTPUT);

  ////// Servo set ////////////

  sv1.attach(ss1);

  sv2.attach(ss2);

  sv3.attach(ss3);

  sv_set();

  tone(snd, 800, 100); tone(snd, 1000, 100); tone(snd, 800, 100);


}

void run(int spl, int spr)   // ประกาศฟังก์ชัน run(กำลังมอเตอร์ซ้าาย,กำลังมอเตอร์ขวา);

{

  if (spl > 0)

  {

    digitalWrite(DL1, LOW);

    digitalWrite(DL2, HIGH);

    analogWrite(PWML, spl);

  }

  else if (spl < 0)

  {

    digitalWrite(DL1, HIGH);

    digitalWrite(DL2, LOW);

    analogWrite(PWML, -spl);

  }

  else

  {

    digitalWrite(DL1, HIGH);

    digitalWrite(DL2, HIGH);


  }

  //////////////////////////////////////

  if (spr > 0)

  {

    digitalWrite(DR1, LOW);

    digitalWrite(DR2, HIGH);

    analogWrite(PWMR, spr);

  }

  else if (spr < 0)

  {

    digitalWrite(DR1, HIGH);

    digitalWrite(DR2, LOW);

    analogWrite(PWMR, -spr);

  }

  else

  {

    digitalWrite(DR1, HIGH);

    digitalWrite(DR2, HIGH);


  }

}


void loop() {

  int sw = digitalRead(button);     // set sw = button

  int nob = analogRead(k_nob);          // variable nob = k_nob

  int menu = map(nob, 0, 4095, 0, 12); // mab nob 0-4095 to 0-12

  OLED.clearDisplay();              //clear oled

  OLED.setTextColor(WHITE, BLACK);  //set color

  OLED.setCursor(0, 0);       // set cursor position

  OLED.setTextSize(2);        // set text size 2 point

  OLED.print("     ");         // space text

  OLED.println(menu);        // display menu 0 to 12

  OLED.setTextSize(1);        //  set text size 1 point

  OLED.println("    LOTUS ARDUIBOT");     // display  LOTUS ARDUIBOT

  OLED.print("      ");                      // space text

  OLED.print(nob);                     // display nob

  OLED.println(" TEST");     // display TEST

  OLED.setTextSize(2);        //  set text size 2 point

  ///////////////////////////////////////////////////////////////

  if ((menu == 0))

  {

  }

  if ((menu == 1))

  { OLED.println(" SERVO123");


  }

  if ((menu == 2))

  { OLED.println("   MOTOR");


  }

  if ((menu == 3))

  {

    OLED.println("  SOUND");

  }

  if ((menu == 4))

  {

    OLED.println("   MQTT");

  }

  if ((menu == 5))

  {

    OLED.println(" Digi Out");

  }

  if ((sw == 0) and (menu == 6))

  {


  }

  if ((sw == 0) and (menu == 7))

  {


  }

  if ((sw == 0) and (menu == 8))

  {


  }

  if ((sw == 0) and (menu == 9))

  {


  }

  if ((sw == 0) and (menu == 10))

  {


  }

  if ((sw == 0) and (menu == 11))

  {


  }

  if ((sw == 0) and (menu == 12))

  {


  }

  //////////////////////////////////////////////////////////////


  OLED.display();

  if ((sw == 0) and (menu == 0))

  { tone(snd, 800, 100);

  }

  if ((sw == 0) and (menu == 1))

  {

    tone(snd, 800, 100); menu1();

  }

  if ((sw == 0) and (menu == 2))

  {

    tone(snd, 800, 100); menu2();

  }

  if ((sw == 0) and (menu == 3))

  {

    tone(snd, 800, 100); menu3();

  }

  if ((sw == 0) and (menu == 4))

  {

    tone(snd, 800, 100); menu4();

  }

  if ((sw == 0) and (menu == 5))

  {

    tone(snd, 800, 100); menu5();

  }

  if ((sw == 0) and (menu == 6))

  {

    tone(snd, 800, 100); menu6();

  }

  if ((sw == 0) and (menu == 7))

  {

    tone(snd, 800, 100); menu7();

  }

  if ((sw == 0) and (menu == 8))

  {

    tone(snd, 800, 100); menu8();

  }

  if ((sw == 0) and (menu == 9))

  {

    tone(snd, 800, 100); menu9();

  }

  if ((sw == 0) and (menu == 10))

  {

    tone(snd, 800, 100); menu10();

  }

  if ((sw == 0) and (menu == 11))

  {

    tone(snd, 800, 100); menu11();

  }

  if ((sw == 0) and (menu == 12))

  {

    tone(snd, 800, 100);  menu12();

  }

  delay(100);

}



void motor()

{ //-------------- forward--------------  //

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  F     F");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("  FORWARD");

  OLED.display();

  run(100, 100); delay(1000); tone(3, 1000, 500);


  //-------------- back ward--------------  //

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  B     B");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("   BACK");

  OLED.display();

  run(-100, -100); delay(2000); tone(3, 1000, 500);


  //------------------ trun left-----------------------------//

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  B     F");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("   LEFT");

  OLED.display();

  run(-100, 100); delay(2000); tone(3, 1000, 500);


  //------------------turn right-----------------------------//

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  F     B");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("   RIGHT");

  OLED.display();

  run(100, -100); delay(2000); tone(3, 1000, 500);


  //------------------- stop motor----------------------------//

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  0     0");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("    STOP");

  OLED.display();

  run(0, 0); delay(2000); tone(3, 1000, 500);

}


void sv_knob() {

  while (true) {

    int vr = analogRead(A7);

    int nob = map(vr, 0, 4095, 0, 180);

    OLED.clearDisplay();

    OLED.setTextColor(WHITE, BLACK);

    OLED.setCursor(0, 0);

    OLED.setTextSize(2);

    OLED.print("SV1 = ");

    OLED.println(nob);

    OLED.print("SV2 = ");

    OLED.println(nob);

    OLED.print("SV3 = ");

    OLED.println(nob);

    OLED.display();

    sv1.write(nob);

    sv2.write(nob);

    sv3.write(nob);

    delay(50);

  }

}

/////////////////////////////////////////////////////

void sv_set() {

  sv1.write(40);

}

////////////////////////////////////////////////////

void sound() {

  tone(snd, 660, 100);

  delay(150);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 510, 100);

  delay(100);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 770, 100);

  delay(550);

  tone(snd, 380, 100);

  delay(575);


  tone(snd, 510, 100);

  delay(450);

  tone(snd, 380, 100);

  delay(400);

  tone(snd, 320, 100);

  delay(500);

  tone(snd, 440, 100);

  delay(300);

  tone(snd, 480, 80);

  delay(330);

  tone(snd, 450, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(300);

  tone(snd, 380, 100);

  delay(200);

  tone(snd, 660, 80);

  delay(200);

  tone(snd, 760, 50);

  delay(150);

  tone(snd, 860, 100);

  delay(300);

  tone(snd, 700, 80);

  delay(150);

  tone(snd, 760, 50);

  delay(350);

  tone(snd, 660, 80);

  delay(300);

  tone(snd, 520, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(150);

  tone(snd, 480, 80);

  delay(500);


  tone(snd, 510, 100);

  delay(450);

  tone(snd, 380, 100);

  delay(400);

  tone(snd, 320, 100);

  delay(500);

  tone(snd, 440, 100);

  delay(300);

  tone(snd, 480, 80);

  delay(330);

  tone(snd, 450, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(300);

  tone(snd, 380, 100);

  delay(200);

  tone(snd, 660, 80);

  delay(200);

  tone(snd, 760, 50);

  delay(150);

  tone(snd, 860, 100);

  delay(300);

  tone(snd, 700, 80);

  delay(150);

  tone(snd, 760, 50);

  delay(350);

  tone(snd, 660, 80);

  delay(300);

  tone(snd, 520, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(150);

  tone(snd, 480, 80);

  delay(500);


  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 150);

  delay(300);

  tone(snd, 380, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(150);


  tone(snd, 500, 100);

  delay(300);

  tone(snd, 430, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(100);

  tone(snd, 570, 100);

  delay(220);


  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 200);

  delay(300);


  tone(snd, 1020, 80);

  delay(300);

  tone(snd, 1020, 80);

  delay(150);

  tone(snd, 1020, 80);

  delay(300);


  tone(snd, 380, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 150);

  delay(300);

  tone(snd, 380, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(150);


  tone(snd, 500, 100);

  delay(300);

  tone(snd, 430, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(100);

  tone(snd, 570, 100);

  delay(420);


  tone(snd, 585, 100);

  delay(450);


  tone(snd, 550, 100);

  delay(420);


  tone(snd, 500, 100);

  delay(360);


  tone(snd, 380, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(300);


  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 150);

  delay(300);

  tone(snd, 380, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(150);


  tone(snd, 500, 100);

  delay(300);

  tone(snd, 430, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(100);

  tone(snd, 570, 100);

  delay(220);


  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 200);

  delay(300);


  tone(snd, 1020, 80);

  delay(300);

  tone(snd, 1020, 80);

  delay(150);

  tone(snd, 1020, 80);

  delay(300);


  tone(snd, 380, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 150);

  delay(300);

  tone(snd, 380, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(150);


  tone(snd, 500, 100);

  delay(300);

  tone(snd, 430, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(100);

  tone(snd, 570, 100);

  delay(420);


  tone(snd, 585, 100);

  delay(450);


  tone(snd, 550, 100);

  delay(420);


  tone(9, 500, 100);

  delay(360);


  tone(snd, 380, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(300);


  tone(snd, 500, 60);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 500, 60);

  delay(350);

  tone(snd, 500, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(350);

  tone(snd, 660, 80);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 430, 80);

  delay(150);

  tone(snd, 380, 80);

  delay(600);


  tone(snd, 500, 60);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 500, 60);

  delay(350);

  tone(snd, 500, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(150);

  tone(snd, 660, 80);

  delay(550);


  tone(snd, 870, 80);

  delay(325);

  tone(snd, 760, 80);

  delay(600);


  tone(snd, 500, 60);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 500, 60);

  delay(350);

  tone(snd, 500, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(350);

  tone(snd, 660, 80);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 430, 80);

  delay(150);

  tone(snd, 380, 80);

  delay(600);


  tone(snd, 660, 100);

  delay(150);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 510, 100);

  delay(100);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 770, 100);

  delay(550);

  tone(snd, 380, 100);

  delay(575);

}

/////////////// Digital output ///////////

void dt_out_set() {

  pinMode( LED_PIN_A, OUTPUT);

  pinMode( LED_PIN_B, OUTPUT);

  pinMode( LED_PIN_C, OUTPUT);

  pinMode( LED_PIN_D, OUTPUT);

}

void dt_out_test() {

  while(true){

digitalWrite( LED_PIN_A,HIGH);delay(100);digitalWrite( LED_PIN_A,LOW);delay(100);

digitalWrite( LED_PIN_B,HIGH);delay(100);digitalWrite( LED_PIN_B,LOW);delay(100);

digitalWrite( LED_PIN_C,HIGH);delay(100);digitalWrite( LED_PIN_C,LOW);delay(100);

digitalWrite( LED_PIN_D,HIGH);delay(100);digitalWrite( LED_PIN_D,LOW);delay(100);}

}

void dt_out(){

  dt_out_set();dt_out_test() ;

  

  }


void mqtt_set() {

  tone(snd, 800, 100); tone(snd, 900, 100); tone(snd, 800, 100); tone(snd, 900, 100); delay(50); tone(snd, 1000, 1000);

  OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C); // กำหนดแอดเดรสของพอร์ตจอเป็น 0x3C (for the 128x64)

  pinMode(LED_PIN_A, OUTPUT);

  pinMode(LED_PIN_B, OUTPUT);

  pinMode(LED_PIN_C, OUTPUT);

  Serial.begin(115200);

  delay(10);

  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(ssid);

  WiFi.begin(ssid, password);

  digitalWrite(LED_PIN_A, HIGH);

  digitalWrite(LED_PIN_B, HIGH);

  digitalWrite(LED_PIN_C, HIGH);

  delay(2000);

  digitalWrite(LED_PIN_A, LOW);

  digitalWrite(LED_PIN_B, LOW);

  digitalWrite(LED_PIN_C, LOW);

  OLED.clearDisplay();

  OLED.setCursor(0, 0);

  OLED.setTextColor(WHITE, BLACK);

  OLED.setTextSize(2);

  OLED.println("  WiFi");

  OLED.println("Conecting");

  OLED.display();


  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

  client.setServer(mqtt_server, mqtt_port);

  client.setCallback(callback);

  tone(snd, 1000, 100); delay(150); tone(snd, 1000, 100); delay(150); tone(snd, 1000, 100);

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(1);

  OLED.println("WiFi connected");

  OLED.print("IP : "); OLED.println( WiFi.localIP());

  OLED.print("*******************");

  OLED.display();

}

void mqtt_loop() {

  while (true) {

    if (!client.connected()) {

      Serial.print("Attempting MQTT connection...");

      if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {

        Serial.println("connected");

        client.subscribe("ESP32");  // ESP32 Topic

      } else {

        Serial.print("failed, rc=");

        Serial.print(client.state());

        Serial.println(" try again in 5 seconds");

        delay(5000);

        return;

      }

    }

    client.loop();

  }

}

void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message arrived [");

  Serial.print(topic);

  Serial.print("] ");

  String msg = "";

  int i = 0;

  while (i < length) msg += (char)payload[i++];

  if (msg == "GET") {

    client.publish("ESP32", (digitalRead(LED_PIN_A) ? "LEDON" : "LEDOFF"));

    Serial.println("Send !");

    return;

  }

  // CiRA CORE Mqtt //


  const size_t capacity = JSON_OBJECT_SIZE(1); //? Object Size

  DynamicJsonDocument doc(capacity);           //? Declare variable for store json

  deserializeJson(doc, payload, length); //? deserialize JSON

  String msg_cira = doc["a"];       //? Store key title to tittle

  ////////////////////// command mqtt control LED A -C /////////////////////////////////

  if ((msg == "AON") or (msg_cira == "AON")) {

    digitalWrite(LED_PIN_A, HIGH);

  }

  if ((msg == "AOFF") or (msg_cira == "AOFF")) {

    digitalWrite(LED_PIN_A, LOW);

  }

  if ((msg == "BON") or (msg_cira == "BON")) {

    digitalWrite(LED_PIN_B, HIGH);

  }

  if ((msg == "BOFF") or (msg_cira == "BOFF")) {

    digitalWrite(LED_PIN_B, LOW);

  }

  if ((msg == "CON") or (msg_cira == "CON")) {

    digitalWrite(LED_PIN_C, HIGH);

  }

  if ((msg == "COFF") or (msg_cira == "COFF")) {

    digitalWrite(LED_PIN_C, LOW);

  }





  //  digitalWrite(LED_PIN_A, (msg_cira == "LEDON" ? HIGH : LOW));



  ////////// Display OLED and Serial ////////////////

  Serial.print("msg = "); Serial.println(msg);

  Serial.print("msg_cira = "); Serial.println( msg_cira);



  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(1);

  OLED.println("WiFi connected");

  OLED.print("IP : "); OLED.println( WiFi.localIP());

  OLED.print("Topic : "); OLED.println( topic);

  OLED.println("-------------------");

  OLED.print("msg : "); OLED.println(msg);

  OLED.println("-------------------");

  OLED.print("msg_cira: "); OLED.println(msg_cira);

  OLED.println("-------------------");

  OLED.display();

}

//////////////write and use code menu ////////////

void menu1()  /// write and use code menu 1

{

  sv_knob(); //  servo test

}

void menu2()   /// write and use code menu

{ motor(); // dc motor test


}

void menu3()   /// write and use code menu 3

{ sound();  // sound test

}

void menu4()   /// write and use code menu 4

{ mqtt_set(); mqtt_loop();

}

void menu5()   /// write and use code menu 5

{dt_out();

}

void menu6()   /// write and use code menu 6

{

}

void menu7()   /// write and use code menu 7

{

}

void menu8()   /// write and use code menu 8

{

}

void menu9()   /// write and use code menu 9

{

}

void menu10()   /// write and use code menu 10

{

}

void menu11()   /// write and use code menu 11

{

}

void menu12()   /// write and use code menu 12

{


}

ESP32 Devkit Robot

//////// ผนวกไลบรารี่ ////////////

#include <Arduino.h>

#include<ArduinoJson.h>

#include <WiFi.h>

#include <PubSubClient.h>

#include <ESP32Servo.h>

#include <Wire.h>

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>


Adafruit_SSD1306 OLED(-1);


// Update these with values suitable for your network.

const char* ssid = "BJHome2G";

const char* password = "123456789";


// Config MQTT Server

#define mqtt_server "192.168.1.15"

#define mqtt_port 1883

#define mqtt_user "user"

#define mqtt_password "123456"





WiFiClient espClient;

PubSubClient client(espClient);

//////////Sound buzzer์///////////

int snd = 18;

//////// set io ///////////////////

int button =  27; ///button

int k_nob = 35 ; // K-nob

#define LED_PIN_A 14

#define LED_PIN_B 12

#define LED_PIN_C 23

#define LED_PIN_D 19

int ss1 = 32;  // servo ch1

int ss2 = 33;  // servo ch2

int ss3 = 5;  // servo ch3

Servo sv1;

Servo sv2;

Servo sv3;

///////////////////////////////////////////

////////// variable motor port/////////////

#define DR1  16

#define DR2  17

#define PWMR 4

/////////////////////////////////

#define DL1  2

#define DL2  15

#define PWML 13

/////////////////////////////////

void setup() {

  OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C); // address i2c 0x3C (for the 128x64)

  pinMode(button , INPUT);

  //////// Motor OUTPUT /////////

  pinMode(DL1, OUTPUT);

  pinMode(DL2, OUTPUT);

  pinMode(PWML, OUTPUT);

  pinMode(DR1, OUTPUT);

  pinMode(DR2, OUTPUT);

  pinMode(PWMR, OUTPUT);

  ////// Servo set ////////////

  sv1.attach(ss1);

  sv2.attach(ss2);

  sv3.attach(ss3);

  sv_set();

  tone(snd, 800, 100); tone(snd, 1000, 100); tone(snd, 800, 100);


}

void run(int spl, int spr)   // ประกาศฟังก์ชัน run(กำลังมอเตอร์ซ้าาย,กำลังมอเตอร์ขวา);

{

  if (spl > 0)

  {

    digitalWrite(DL1, LOW);

    digitalWrite(DL2, HIGH);

    analogWrite(PWML, spl);

  }

  else if (spl < 0)

  {

    digitalWrite(DL1, HIGH);

    digitalWrite(DL2, LOW);

    analogWrite(PWML, -spl);

  }

  else

  {

    digitalWrite(DL1, HIGH);

    digitalWrite(DL2, HIGH);


  }

  //////////////////////////////////////

  if (spr > 0)

  {

    digitalWrite(DR1, LOW);

    digitalWrite(DR2, HIGH);

    analogWrite(PWMR, spr);

  }

  else if (spr < 0)

  {

    digitalWrite(DR1, HIGH);

    digitalWrite(DR2, LOW);

    analogWrite(PWMR, -spr);

  }

  else

  {

    digitalWrite(DR1, HIGH);

    digitalWrite(DR2, HIGH);


  }

}


void loop() {

  int sw = digitalRead(button);     // set sw = button

  int nob = analogRead(k_nob);          // variable nob = k_nob

  int menu = map(nob, 0, 4095, 0, 12); // mab nob 0-4095 to 0-12

  OLED.clearDisplay();              //clear oled

  OLED.setTextColor(WHITE, BLACK);  //set color

  OLED.setCursor(0, 0);       // set cursor position

  OLED.setTextSize(2);        // set text size 2 point

  OLED.print("     ");         // space text

  OLED.println(menu);        // display menu 0 to 12

  OLED.setTextSize(1);        //  set text size 1 point

  OLED.println("    LOTUS ARDUIBOT");     // display  LOTUS ARDUIBOT

  OLED.print("      ");                      // space text

  OLED.print(nob);                     // display nob

  OLED.println(" TEST");     // display TEST

  OLED.setTextSize(2);        //  set text size 2 point

  ///////////////////////////////////////////////////////////////

  if ((menu == 0))

  {

  }

  if ((menu == 1))

  { OLED.println(" SERVO123");


  }

  if ((menu == 2))

  { OLED.println("  SERVO v2");


  }

  if ((menu == 3))

  {

    OLED.println("  SOUND");

  }

  if ((menu == 4))

  {

    OLED.println("   MQTT");

  }

  if ((menu == 5))

  {

    OLED.println(" Digi Out");

  }

  if ((sw == 0) and (menu == 6))

  {OLED.println("   MOTOR");


  }

  if ((sw == 0) and (menu == 7))

  {


  }

  if ((sw == 0) and (menu == 8))

  {


  }

  if ((sw == 0) and (menu == 9))

  {


  }

  if ((sw == 0) and (menu == 10))

  {


  }

  if ((sw == 0) and (menu == 11))

  {


  }

  if ((sw == 0) and (menu == 12))

  {


  }

  //////////////////////////////////////////////////////////////


  OLED.display();

  if ((sw == 0) and (menu == 0))

  { tone(snd, 800, 100);

  }

  if ((sw == 0) and (menu == 1))

  {

    tone(snd, 800, 100); menu1();

  }

  if ((sw == 0) and (menu == 2))

  {

    tone(snd, 800, 100); menu2();

  }

  if ((sw == 0) and (menu == 3))

  {

    tone(snd, 800, 100); menu3();

  }

  if ((sw == 0) and (menu == 4))

  {

    tone(snd, 800, 100); menu4();

  }

  if ((sw == 0) and (menu == 5))

  {

    tone(snd, 800, 100); menu5();

  }

  if ((sw == 0) and (menu == 6))

  {

    tone(snd, 800, 100); menu6();

  }

  if ((sw == 0) and (menu == 7))

  {

    tone(snd, 800, 100); menu7();

  }

  if ((sw == 0) and (menu == 8))

  {

    tone(snd, 800, 100); menu8();

  }

  if ((sw == 0) and (menu == 9))

  {

    tone(snd, 800, 100); menu9();

  }

  if ((sw == 0) and (menu == 10))

  {

    tone(snd, 800, 100); menu10();

  }

  if ((sw == 0) and (menu == 11))

  {

    tone(snd, 800, 100); menu11();

  }

  if ((sw == 0) and (menu == 12))

  {

    tone(snd, 800, 100);  menu12();

  }

  delay(100);

}



void motor()

{ //-------------- forward--------------  //

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  F     F");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("  FORWARD");

  OLED.display();

  run(100, 100); delay(1000); tone(3, 1000, 500);


  //-------------- back ward--------------  //

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  B     B");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("   BACK");

  OLED.display();

  run(-100, -100); delay(2000); tone(3, 1000, 500);


  //------------------ trun left-----------------------------//

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  B     F");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("   LEFT");

  OLED.display();

  run(-100, 100); delay(2000); tone(3, 1000, 500);


  //------------------turn right-----------------------------//

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  F     B");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("   RIGHT");

  OLED.display();

  run(100, -100); delay(2000); tone(3, 1000, 500);


  //------------------- stop motor----------------------------//

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(2);

  OLED.println("  ML    MR");

  OLED.println("  0     0");

  OLED.setTextSize(1);

  OLED.println(" -------------------");

  OLED.setTextSize(2);

  OLED.println("    STOP");

  OLED.display();

  run(0, 0); delay(2000); tone(3, 1000, 500);

}


void sv_knob() {

  while (true) {

    int vr = analogRead(35);

    int nob = map(vr, 0, 4095, 0, 180);

    OLED.clearDisplay();

    OLED.setTextColor(WHITE, BLACK);

    OLED.setCursor(0, 0);

    OLED.setTextSize(2);

    OLED.print("SV1 = ");

    OLED.println(nob);

    OLED.print("SV2 = ");

    OLED.println(nob);

    OLED.print("SV3 = ");

    OLED.println(nob);

    OLED.display();

    sv1.write(nob);

    sv2.write(nob);

    sv3.write(nob);

    delay(50);

  }

}

void sv_knob2() {

  while (true) {

    int vr1 = analogRead(14);

    int vr2 = analogRead(12);

    int vr3 = analogRead(39);

    int nob1 = map(vr1, 0, 4095, 0, 180);

    int nob2 = map(vr2, 0, 4095, 0, 180);

    int nob3 = map(vr3, 0, 4095, 0, 180);

    OLED.clearDisplay();

    OLED.setTextColor(WHITE, BLACK);

    OLED.setCursor(0, 0);

    OLED.setTextSize(2);

    OLED.print("SV1 = ");

    OLED.println(nob1);

    OLED.print("SV2 = ");

    OLED.println(nob2);

    OLED.print("SV3 = ");

    OLED.println(nob3);

    OLED.display();

    sv1.write(nob1);

    sv2.write(nob2);

    sv3.write(nob3);

    delay(50);

  }

}

/////////////////////////////////////////////////////

void sv_set() {

  sv1.write(40);

}

////////////////////////////////////////////////////

void sound() {

  tone(snd, 660, 100);

  delay(150);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 510, 100);

  delay(100);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 770, 100);

  delay(550);

  tone(snd, 380, 100);

  delay(575);


  tone(snd, 510, 100);

  delay(450);

  tone(snd, 380, 100);

  delay(400);

  tone(snd, 320, 100);

  delay(500);

  tone(snd, 440, 100);

  delay(300);

  tone(snd, 480, 80);

  delay(330);

  tone(snd, 450, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(300);

  tone(snd, 380, 100);

  delay(200);

  tone(snd, 660, 80);

  delay(200);

  tone(snd, 760, 50);

  delay(150);

  tone(snd, 860, 100);

  delay(300);

  tone(snd, 700, 80);

  delay(150);

  tone(snd, 760, 50);

  delay(350);

  tone(snd, 660, 80);

  delay(300);

  tone(snd, 520, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(150);

  tone(snd, 480, 80);

  delay(500);


  tone(snd, 510, 100);

  delay(450);

  tone(snd, 380, 100);

  delay(400);

  tone(snd, 320, 100);

  delay(500);

  tone(snd, 440, 100);

  delay(300);

  tone(snd, 480, 80);

  delay(330);

  tone(snd, 450, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(300);

  tone(snd, 380, 100);

  delay(200);

  tone(snd, 660, 80);

  delay(200);

  tone(snd, 760, 50);

  delay(150);

  tone(snd, 860, 100);

  delay(300);

  tone(snd, 700, 80);

  delay(150);

  tone(snd, 760, 50);

  delay(350);

  tone(snd, 660, 80);

  delay(300);

  tone(snd, 520, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(150);

  tone(snd, 480, 80);

  delay(500);


  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 150);

  delay(300);

  tone(snd, 380, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(150);


  tone(snd, 500, 100);

  delay(300);

  tone(snd, 430, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(100);

  tone(snd, 570, 100);

  delay(220);


  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 200);

  delay(300);


  tone(snd, 1020, 80);

  delay(300);

  tone(snd, 1020, 80);

  delay(150);

  tone(snd, 1020, 80);

  delay(300);


  tone(snd, 380, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 150);

  delay(300);

  tone(snd, 380, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(150);


  tone(snd, 500, 100);

  delay(300);

  tone(snd, 430, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(100);

  tone(snd, 570, 100);

  delay(420);


  tone(snd, 585, 100);

  delay(450);


  tone(snd, 550, 100);

  delay(420);


  tone(snd, 500, 100);

  delay(360);


  tone(snd, 380, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(300);


  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 150);

  delay(300);

  tone(snd, 380, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(150);


  tone(snd, 500, 100);

  delay(300);

  tone(snd, 430, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(100);

  tone(snd, 570, 100);

  delay(220);


  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 200);

  delay(300);


  tone(snd, 1020, 80);

  delay(300);

  tone(snd, 1020, 80);

  delay(150);

  tone(snd, 1020, 80);

  delay(300);


  tone(snd, 380, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(300);


  tone(snd, 760, 100);

  delay(100);

  tone(snd, 720, 100);

  delay(150);

  tone(snd, 680, 100);

  delay(150);

  tone(snd, 620, 150);

  delay(300);


  tone(snd, 650, 150);

  delay(300);

  tone(snd, 380, 100);

  delay(150);

  tone(snd, 430, 100);

  delay(150);


  tone(snd, 500, 100);

  delay(300);

  tone(snd, 430, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(100);

  tone(snd, 570, 100);

  delay(420);


  tone(snd, 585, 100);

  delay(450);


  tone(snd, 550, 100);

  delay(420);


  tone(9, 500, 100);

  delay(360);


  tone(snd, 380, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(300);

  tone(snd, 500, 100);

  delay(150);

  tone(snd, 500, 100);

  delay(300);


  tone(snd, 500, 60);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 500, 60);

  delay(350);

  tone(snd, 500, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(350);

  tone(snd, 660, 80);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 430, 80);

  delay(150);

  tone(snd, 380, 80);

  delay(600);


  tone(snd, 500, 60);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 500, 60);

  delay(350);

  tone(snd, 500, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(150);

  tone(snd, 660, 80);

  delay(550);


  tone(snd, 870, 80);

  delay(325);

  tone(snd, 760, 80);

  delay(600);


  tone(snd, 500, 60);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 500, 60);

  delay(350);

  tone(snd, 500, 80);

  delay(150);

  tone(snd, 580, 80);

  delay(350);

  tone(snd, 660, 80);

  delay(150);

  tone(snd, 500, 80);

  delay(300);

  tone(snd, 430, 80);

  delay(150);

  tone(snd, 380, 80);

  delay(600);


  tone(snd, 660, 100);

  delay(150);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 510, 100);

  delay(100);

  tone(snd, 660, 100);

  delay(300);

  tone(snd, 770, 100);

  delay(550);

  tone(snd, 380, 100);

  delay(575);

}

/////////////// Digital output ///////////

void dt_out_set() {

  pinMode( LED_PIN_A, OUTPUT);

  pinMode( LED_PIN_B, OUTPUT);

  pinMode( LED_PIN_C, OUTPUT);

  pinMode( LED_PIN_D, OUTPUT);

}

void dt_out_test() {

  while(true){

digitalWrite( LED_PIN_A,HIGH);delay(100);digitalWrite( LED_PIN_A,LOW);delay(100);

digitalWrite( LED_PIN_B,HIGH);delay(100);digitalWrite( LED_PIN_B,LOW);delay(100);

digitalWrite( LED_PIN_C,HIGH);delay(100);digitalWrite( LED_PIN_C,LOW);delay(100);

digitalWrite( LED_PIN_D,HIGH);delay(100);digitalWrite( LED_PIN_D,LOW);delay(100);}

}

void dt_out(){

  dt_out_set();dt_out_test() ;

  

  }


void mqtt_set() {

  tone(snd, 800, 100); tone(snd, 900, 100); tone(snd, 800, 100); tone(snd, 900, 100); delay(50); tone(snd, 1000, 1000);

  OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C); // กำหนดแอดเดรสของพอร์ตจอเป็น 0x3C (for the 128x64)

  pinMode(LED_PIN_A, OUTPUT);

  pinMode(LED_PIN_B, OUTPUT);

  pinMode(LED_PIN_C, OUTPUT);

  Serial.begin(115200);

  delay(10);

  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(ssid);

  WiFi.begin(ssid, password);

  digitalWrite(LED_PIN_A, HIGH);

  digitalWrite(LED_PIN_B, HIGH);

  digitalWrite(LED_PIN_C, HIGH);

  delay(2000);

  digitalWrite(LED_PIN_A, LOW);

  digitalWrite(LED_PIN_B, LOW);

  digitalWrite(LED_PIN_C, LOW);

  OLED.clearDisplay();

  OLED.setCursor(0, 0);

  OLED.setTextColor(WHITE, BLACK);

  OLED.setTextSize(2);

  OLED.println("  WiFi");

  OLED.println("Conecting");

  OLED.display();


  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

  client.setServer(mqtt_server, mqtt_port);

  client.setCallback(callback);

  tone(snd, 1000, 100); delay(150); tone(snd, 1000, 100); delay(150); tone(snd, 1000, 100);

  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(1);

  OLED.println("WiFi connected");

  OLED.print("IP : "); OLED.println( WiFi.localIP());

  OLED.print("*******************");

  OLED.display();

}

void mqtt_loop() {

  while (true) {

    if (!client.connected()) {

      Serial.print("Attempting MQTT connection...");

      if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {

        Serial.println("connected");

        client.subscribe("ESP32");  // ESP32 Topic

      } else {

        Serial.print("failed, rc=");

        Serial.print(client.state());

        Serial.println(" try again in 5 seconds");

        delay(5000);

        return;

      }

    }

    client.loop();

  }

}

void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message arrived [");

  Serial.print(topic);

  Serial.print("] ");

  String msg = "";

  int i = 0;

  while (i < length) msg += (char)payload[i++];

  if (msg == "GET") {

    client.publish("ESP32", (digitalRead(LED_PIN_A) ? "LEDON" : "LEDOFF"));

    Serial.println("Send !");

    return;

  }

  // CiRA CORE Mqtt //


  const size_t capacity = JSON_OBJECT_SIZE(1); //? Object Size

  DynamicJsonDocument doc(capacity);           //? Declare variable for store json

  deserializeJson(doc, payload, length); //? deserialize JSON

  String msg_cira = doc["a"];       //? Store key title to tittle

  ////////////////////// command mqtt control LED A -C /////////////////////////////////

  if ((msg == "AON") or (msg_cira == "AON")) {

    digitalWrite(LED_PIN_A, HIGH);

  }

  if ((msg == "AOFF") or (msg_cira == "AOFF")) {

    digitalWrite(LED_PIN_A, LOW);

  }

  if ((msg == "BON") or (msg_cira == "BON")) {

    digitalWrite(LED_PIN_B, HIGH);

  }

  if ((msg == "BOFF") or (msg_cira == "BOFF")) {

    digitalWrite(LED_PIN_B, LOW);

  }

  if ((msg == "CON") or (msg_cira == "CON")) {

    digitalWrite(LED_PIN_C, HIGH);

  }

  if ((msg == "COFF") or (msg_cira == "COFF")) {

    digitalWrite(LED_PIN_C, LOW);

  }





  //  digitalWrite(LED_PIN_A, (msg_cira == "LEDON" ? HIGH : LOW));



  ////////// Display OLED and Serial ////////////////

  Serial.print("msg = "); Serial.println(msg);

  Serial.print("msg_cira = "); Serial.println( msg_cira);



  OLED.clearDisplay();

  OLED.setTextColor(WHITE, BLACK);

  OLED.setCursor(0, 0);

  OLED.setTextSize(1);

  OLED.println("WiFi connected");

  OLED.print("IP : "); OLED.println( WiFi.localIP());

  OLED.print("Topic : "); OLED.println( topic);

  OLED.println("-------------------");

  OLED.print("msg : "); OLED.println(msg);

  OLED.println("-------------------");

  OLED.print("msg_cira: "); OLED.println(msg_cira);

  OLED.println("-------------------");

  OLED.display();

}

//////////////write and use code menu ////////////

void menu1()  /// write and use code menu 1

{

  sv_knob(); //  servo test

}

void menu2()   /// write and use code menu

  sv_knob2(); //  servo test v2

}

void menu3()   /// write and use code menu 3

{ sound();  // sound test

}

void menu4()   /// write and use code menu 4

{ mqtt_set(); mqtt_loop();

}

void menu5()   /// write and use code menu 5

{dt_out();

}

void menu6()   /// write and use code menu 6

{motor(); // dc motor test

}

void menu7()   /// write and use code menu 7

{

}

void menu8()   /// write and use code menu 8

{

}

void menu9()   /// write and use code menu 9

{

}

void menu10()   /// write and use code menu 10

{

}

void menu11()   /// write and use code menu 11

{

}

void menu12()   /// write and use code menu 12

{


}