Wi-Fi Kontrollü Araba Uygulaması NodeMCU 1.0 (ESP-12E) ve ESP32 kodu

Görseldeki Wi-Fi kontrollü araba uygulamasında NodeMCU acces point (AP) modunda çalışmaktadır. NodeMCU’ya bağlanmak için kablosuz ağlardan “Robot” seçilir. Şifre “12345678” girilir. Bilgisayar veya akıllı telefondan tarayıcı (Chrome vb.) açılarak adres satırına 192.168.4.1 girilerek NodeMCU içindeki web server sayfasından araç kontrol edilir.

/*  NodeMCU Access Point (AP) modunda çalışmaktadır.
    Kablosuz ağlardan "Robot"a bağlanın. Şifre: 12345678
    Tarayıcıdan 192.168.4.1 adresine girin.
*/
#include <ESP8266WiFi.h> // NodeMCU kurulumuyla gelir.
#include <WiFiClient.h> // NodeMCU kurulumuyla gelir.
#include <ESP8266WebServer.h> // NodeMCU kurulumuyla gelir.
#include <WebSocketsServer.h> // WebSockets v2.3.6
#include <Hash.h> // NodeMCU kurulumuyla gelir.

const char* ssid = "Robot";
const char* password = "12345678"; // Şifre en az sekiz haneli olmalı.

const byte IN1 = D0, IN2 = D1, IN3 = D2, IN4 = D3; // PWM pinleri. (enA ve enB'de jumper takılı).

int hiz = 150; 
char karakter;

static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0">
<title>Wifi Robot</title>
<style>
"body { background-color: #808080; font-family: Arial, Helvetica, Sans-Serif; Color: #000000; }"
#JD {
  text-align: center;
}
#JD {
  text-align: center;
  font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
  font-size: 24px;
}
.foot {
  text-align: center;
  font-family: "Comic Sans MS", cursive;
  font-size: 30px;
  color: #F00;
}
.button {
    border: none;
    color: white;
    padding: 17px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 16px;
    margin: 4px 2px;
    cursor: pointer;
    border-radius: 12px;
  width: 100%;
}
.red {background-color: #F00;}
.green {background-color: #090;}
.yellow {background-color:#F90;}
.blue {background-color:#03C;}
</style>
<script>
var websock;
function start() {
  websock = new WebSocket('ws://' + window.location.hostname + ':81/');
  websock.onopen = function(evt) { console.log('websock open'); };
  websock.onclose = function(evt) { console.log('websock close'); };
  websock.onerror = function(evt) { console.log(evt); };
  websock.onmessage = function(evt) {
    console.log(evt);
    var e = document.getElementById('ledstatus');
    if (evt.karakter === 'ledon') {
      e.style.color = 'red';
    }
    else if (evt.karakter === 'ledoff') {
      e.style.color = 'black';
    }
    else {
      console.log('unknown event');
    }
  };
}
function buttonclick(e) {
  websock.send(e.id);
}
</script>
</head>
<body onload="javascript:start();">
&nbsp;
<table width="100%" border="0">
  <tr>
    <td bgcolor="#FFFFFF" id="JD">Wifi Robot </td>
  </tr>
</table>
<table width="100" height="249" border="0" align="center">
    <td>&nbsp;</td>
    <td align="center" valign="middle"><form name="form1" method="post" action="">
      <label>
        <button id="a"  type="button" onclick="buttonclick(this);" class="button green">ileri</button> 
      </label>
    </form></td>
    <td>&nbsp;</td>
  </tr>   
    <td align="center" valign="middle"><form name="form1" method="post" action="">
      <label>
        <button id="c"  type="button" onclick="buttonclick(this);" class="button green">Sol  </button> 
      </label>
    </form></td>
    <td align="center" valign="middle"><form name="form1" method="post" action="">
      <label>
        <button id="e"  type="button" onclick="buttonclick(this);" class="button red">Dur  </button> 
      </label>
    </form></td>
    <td align="center" valign="middle"><form name="form1" method="post" action="">
      <label>
        <button id="d"  type="button" onclick="buttonclick(this);" class="button green">Sag  </button> 
      </label>
    </form></td>
  </tr>
   <td>&nbsp;</td>
    <td align="center" valign="middle"><form name="form1" method="post" action="">
      <label>
        <button id="b"  type="button" onclick="buttonclick(this);" class="button green">Geri </button> 
      </label>
    </form></td>     
    <td>&nbsp;</td>
  </tr>  
</table>
</body>
</html>
)rawliteral";

WebSocketsServer webSocket = WebSocketsServer(81);
ESP8266WebServer server(80);

void setup() {
 Serial.begin(9600);

 pinMode(IN1, OUTPUT);
 pinMode(IN2, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(IN4, OUTPUT);

  WiFi.mode(WIFI_AP);           // Access point modunda.
  WiFi.softAP(ssid, password);  // Kablosuz ağı başlat.

  IPAddress IP = WiFi.softAPIP(); 

  server.on("/", [](){
  server.send(200, "text/html", INDEX_HTML);
  });
  
  server.begin();
  webSocket.begin();
  webSocket.onEvent(webSocketFonksiyonu);
}

void loop() {

if (karakter == 'a') { // ileri.
      analogWrite(IN1, hiz);
      analogWrite(IN2, 0);
      analogWrite(IN3, hiz);
      analogWrite(IN4, 0);
    } else if (karakter == 'b') { // Geri.
      analogWrite(IN1, 0);
      analogWrite(IN2, hiz);
      analogWrite(IN3, 0);
      analogWrite(IN4, hiz);
    } else if (karakter == 'c') { // Sol.
      analogWrite(IN1, hiz);
      analogWrite(IN2, 0);
      analogWrite(IN3, 0);
      analogWrite(IN4, hiz);
    } else if (karakter == 'd') { // Sağ.
      analogWrite(IN1, 0);
      analogWrite(IN2, hiz);
      analogWrite(IN3, hiz);
      analogWrite(IN4, 0);
    } else if (karakter == 'e') { // Dur.
      analogWrite(IN1, 0);
      analogWrite(IN2, 0);
      analogWrite(IN3, 0);
      analogWrite(IN4, 0);
    }
     
   webSocket.loop();
   server.handleClient();
}

void webSocketFonksiyonu(byte sayi, WStype_t type,byte * veri, size_t length){
  switch(type) {
    case WStype_DISCONNECTED:
      break;
    case WStype_CONNECTED:
      {IPAddress ip = webSocket.remoteIP(sayi);}
      break;
    case WStype_TEXT:
      karakter = veri[0];
      Serial.println(karakter);
      webSocket.broadcastTXT(veri, length);     
      break;
    case WStype_BIN:
      hexdump(veri, length);
      webSocket.sendBIN(sayi, veri, length);
      break;
      default:
      break;
  }
}

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

/* Put your SSID & Password */
const char* ssid = "NodeMCU";  // Enter SSID here
const char* password = "12345678";  //Enter Password here

/* Put IP Address details */
IPAddress local_ip(192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

ESP8266WebServer server(80);

uint8_t LED1pin = D7;
bool LED1status = LOW;

uint8_t LED2pin = D6;
bool LED2status = LOW;

void setup() {
  Serial.begin(9600);
  pinMode(LED1pin, OUTPUT);
  pinMode(LED2pin, OUTPUT);

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);
  
  server.on("/", handle_OnConnect);
  server.on("/led1on", handle_led1on);
  server.on("/led1off", handle_led1off);
  server.on("/led2on", handle_led2on);
  server.on("/led2off", handle_led2off);
  server.onNotFound(handle_NotFound);
  
  server.begin();
  Serial.println("HTTP server started");
}
void loop() {
  server.handleClient();
  if(LED1status)
  {digitalWrite(LED1pin, HIGH);}
  else
  {digitalWrite(LED1pin, LOW);}
  
  if(LED2status)
  {digitalWrite(LED2pin, HIGH);}
  else
  {digitalWrite(LED2pin, LOW);}
}

void handle_OnConnect() {
  LED1status = LOW;
  LED2status = LOW;
  Serial.println("GPIO7 Status: OFF | GPIO6 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,LED2status)); 
}

void handle_led1on() {
  LED1status = HIGH;
  Serial.println("GPIO7 Status: ON");
  server.send(200, "text/html", SendHTML(true,LED2status)); 
}

void handle_led1off() {
  LED1status = LOW;
  Serial.println("GPIO7 Status: OFF");
  server.send(200, "text/html", SendHTML(false,LED2status)); 
}

void handle_led2on() {
  LED2status = HIGH;
  Serial.println("GPIO6 Status: ON");
  server.send(200, "text/html", SendHTML(LED1status,true)); 
}

void handle_led2off() {
  LED2status = LOW;
  Serial.println("GPIO6 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,false)); 
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(uint8_t led1stat,uint8_t led2stat){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>LED Control</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  ptr +=".button {display: block;width: 80px;background-color: #1abc9c;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
  ptr +=".button-on {background-color: #1abc9c;}\n";
  ptr +=".button-on:active {background-color: #16a085;}\n";
  ptr +=".button-off {background-color: #34495e;}\n";
  ptr +=".button-off:active {background-color: #2c3e50;}\n";
  ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<h1>ESP8266 Web Server</h1>\n";
  ptr +="<h3>Using Access Point(AP) Mode</h3>\n";
  
   if(led1stat)
  {ptr +="<p>LED1 Status: ON</p><a class=\"button button-off\" href=\"/led1off\">OFF</a>\n";}
  else
  {ptr +="<p>LED1 Status: OFF</p><a class=\"button button-on\" href=\"/led1on\">ON</a>\n";}

  if(led2stat)
  {ptr +="<p>LED2 Status: ON</p><a class=\"button button-off\" href=\"/led2off\">OFF</a>\n";}
  else
  {ptr +="<p>LED2 Status: OFF</p><a class=\"button button-on\" href=\"/led2on\">ON</a>\n";}

  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

ESP32 kodu

/* ESP32 Access Point modunda calismaktadir. 
   "Robot" agina baglanin. Sifre: 12345678 
   Tarayici: 192.168.4.1
*/

#include <WiFi.h> // ESP32 wifi
#include <WebServer.h> // ESP32 websuncusu
#include <WebSocketsServer.h> // WebSockets v2.3.6

const char* ssid = "Robot";
const char* password = "12345678";

const byte IN1 = 16, IN2 = 17, IN3 = 18, IN4 = 19; // ESP32 pinleri
int hiz = 150; 
char karakter;

WebServer server(80);
WebSocketsServer webSocket(81);

// PWM kanallari
int ch1=0, ch2=1, ch3=2, ch4=3;

static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
<title>Wifi Robot</title>
<style>
body{background:#808080;font-family:Arial;}
.button{border:none;color:white;padding:17px;width:100%;font-size:16px;margin:4px;border-radius:12px;}
.green{background:#090;} .red{background:#F00;}
</style>
<script>
var w;
function start(){
  w=new WebSocket('ws://'+location.hostname+':81/');
}
function gonder(e){ w.send(e.id); }
</script>
</head>
<body onload="start()">
<table width="100%"><tr><td bgcolor="#FFF" align="center">Wifi Robot</td></tr></table>
<table width="100" align="center">
<tr><td></td><td><button id="a" onclick="gonder(this)" class="button green">ileri</button></td><td></td></tr>
<tr>
<td><button id="c" onclick="gonder(this)" class="button green">Sol</button></td>
<td><button id="e" onclick="gonder(this)" class="button red">Dur</button></td>
<td><button id="d" onclick="gonder(this)" class="button green">Sag</button></td>
</tr>
<tr><td></td><td><button id="b" onclick="gonder(this)" class="button green">Geri</button></td><td></td></tr>
</table>
</body>
</html>
)rawliteral";

void setup() {

  Serial.begin(9600);

  // PWM kanallarini baslat
  ledcSetup(ch1, 500, 8); ledcAttachPin(IN1, ch1);
  ledcSetup(ch2, 500, 8); ledcAttachPin(IN2, ch2);
  ledcSetup(ch3, 500, 8); ledcAttachPin(IN3, ch3);
  ledcSetup(ch4, 500, 8); ledcAttachPin(IN4, ch4);

  WiFi.softAP(ssid, password); // AP baslat

  server.on("/", [](){ server.send(200,"text/html",INDEX_HTML); });
  server.begin();

  webSocket.begin();
  webSocket.onEvent(webSocketFonksiyonu);
}

void loop() {

  // ileri
  if (karakter=='a'){ 
    ledcWrite(ch1,hiz); ledcWrite(ch2,0);
    ledcWrite(ch3,hiz); ledcWrite(ch4,0);
  } 
  // geri
  else if (karakter=='b'){ 
    ledcWrite(ch1,0); ledcWrite(ch2,hiz);
    ledcWrite(ch3,0); ledcWrite(ch4,hiz);
  } 
  // sol
  else if (karakter=='c'){ 
    ledcWrite(ch1,hiz); ledcWrite(ch2,0);
    ledcWrite(ch3,0);  ledcWrite(ch4,hiz);
  }
  // sag
  else if (karakter=='d'){ 
    ledcWrite(ch1,0);  ledcWrite(ch2,hiz);
    ledcWrite(ch3,hiz); ledcWrite(ch4,0);
  }
  // dur
  else if (karakter=='e'){ 
    ledcWrite(ch1,0); ledcWrite(ch2,0);
    ledcWrite(ch3,0); ledcWrite(ch4,0);
  }

  webSocket.loop();
  server.handleClient();
}

void webSocketFonksiyonu(byte s, WStype_t t, byte* v, size_t l){
  if(t==WStype_TEXT){
    karakter = v[0]; // gelen komut
    Serial.println(karakter);
    webSocket.broadcastTXT(v, l);
  }
}


/* ESP32 Wifi Robot - Modern SPA + Mobil Panel
   AP: "Robot"  Sifre: "12345678"
   Tarayici: http://192.168.4.1
*/

#include <WiFi.h> // ESP32 WiFi (arduino-esp32 core)
#include <WebServer.h> // ESP32 WebServer (arduino-esp32 core)
#include <WebSocketsServer.h> // WebSocketsServer // v2.3.6

const char* apSsid = "Robot";
const char* apSifre = "12345678";

const byte IN1 = 16, IN2 = 17, IN3 = 18, IN4 = 19; // Motor surucu pinleri (L298N icin uygun)
int hiz = 150; // 0-255
char karakter = 'e'; // baslangicta dur

WebServer sunucu(80);
WebSocketsServer webSoket(81);

const int kanal1 = 0, kanal2 = 1, kanal3 = 2, kanal4 = 3; // PWM kanallari

// SPA HTML -------------
static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<!DOCTYPE html>
<html lang="tr">
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<title>Wifi Robot Kontrol</title>
<style>
*{box-sizing:border-box;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Arial;}
body{background:#0f172a;color:#e5e7eb;display:flex;flex-direction:column;min-height:100vh;}
.header{padding:12px 16px;text-align:center;background:#020617;box-shadow:0 2px 6px rgba(0,0,0,0.6);}
.header h1{font-size:20px;margin-bottom:4px;}
.header span{font-size:12px;color:#9ca3af;}
.kapsayici{flex:1;display:flex;flex-direction:column;justify-content:space-between;padding:12px;max-width:480px;margin:0 auto;width:100%;}
.kart{background:#020617;border-radius:18px;padding:12px 14px;margin-bottom:12px;box-shadow:0 10px 30px rgba(0,0,0,0.7);border:1px solid #1f2937;}
.baslik{font-size:14px;margin-bottom:8px;color:#9ca3af;}
.hiz-satir{display:flex;align-items:center;gap:10px;}
.hiz-deger{min-width:46px;text-align:right;font-variant-numeric:tabular-nums;font-size:14px;color:#fde68a;}
input[type=range]{-webkit-appearance:none;width:100%;height:6px;border-radius:999px;background:#1f2937;outline:none;}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:22px;height:22px;border-radius:50%;background:#38bdf8;border:2px solid #0f172a;box-shadow:0 0 0 4px rgba(56,189,248,0.2);}
input[type=range]::-moz-range-thumb{width:22px;height:22px;border-radius:50%;background:#38bdf8;border:2px solid #0f172a;}
.kontrol-kutu{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,70px);gap:10px;align-items:center;justify-items:center;}
.btn{border:none;border-radius:18px;padding:8px 10px;font-size:15px;font-weight:500;color:#e5e7eb;background:#1d4ed8;display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:70px;min-height:60px;box-shadow:0 8px 18px rgba(15,23,42,0.8);transition:transform .08s ease,box-shadow .08s ease,background .15s ease;touch-action:manipulation;}
.btn span.ikon{font-size:18px;margin-bottom:4px;}
.btn-ileri{grid-column:2;grid-row:1;background:#16a34a;}
.btn-geri{grid-column:2;grid-row:3;background:#16a34a;}
.btn-sol{grid-column:1;grid-row:2;background:#16a34a;}
.btn-sag{grid-column:3;grid-row:2;background:#16a34a;}
.btn-dur{grid-column:2;grid-row:2;background:#ef4444;}
.btn:active{transform:translateY(1px) scale(0.98);box-shadow:0 4px 10px rgba(0,0,0,0.8);}
.durum-satir{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.badge{padding:4px 8px;border-radius:999px;font-size:11px;background:#1f2937;color:#9ca3af;display:inline-flex;align-items:center;gap:6px;}
.badge span.nokta{width:8px;height:8px;border-radius:999px;background:#ef4444;box-shadow:0 0 0 4px rgba(239,68,68,0.15);}
.badge span.nokta.baglanti-ok{background:#22c55e;box-shadow:0 0 0 4px rgba(34,197,94,0.25);}
.durum-metin{font-size:12px;color:#9ca3af;}
.footer{font-size:11px;text-align:center;padding:8px;color:#6b7280;}
@media (min-height:700px){
  .kontrol-kutu{grid-template-rows:repeat(3,86px);}
  .btn{min-height:74px;}
}
</style>
</head>
<body>
<div class="header">
  <h1>Wifi Robot Kontrol</h1>
  <span>ESP32 &middot; Gercek zamanli kontrol</span>
</div>
<div class="kapsayici">
  <div class="kart">
    <div class="baslik">Hiz Ayari</div>
    <div class="hiz-satir">
      <input id="hiz" type="range" min="80" max="255" value="150">
      <div class="hiz-deger"><span id="hizDeger">150</span></div>
    </div>
  </div>
  <div class="kart">
    <div class="baslik">Y&ouml;n Kontrol</div>
    <div class="kontrol-kutu">
      <button class="btn btn-ileri" data-kod="a"><span class="ikon">&#9650;</span>ileri</button>
      <button class="btn btn-sol" data-kod="c"><span class="ikon">&#9664;</span>sol</button>
      <button class="btn btn-dur" data-kod="e"><span class="ikon">&#9632;</span>dur</button>
      <button class="btn btn-sag" data-kod="d"><span class="ikon">&#9654;</span>sag</button>
      <button class="btn btn-geri" data-kod="b"><span class="ikon">&#9660;</span>geri</button>
    </div>
  </div>
  <div class="kart">
    <div class="baslik">Durum</div>
    <div class="durum-satir">
      <div class="badge"><span id="bagNokta" class="nokta"></span><span id="bagYazi">Baglanti yok</span></div>
      <div class="durum-metin" id="durumMetin">Komut bekleniyor...</div>
    </div>
  </div>
</div>
<div class="footer">Temrinler · ESP32 SPA Aray&uuml;z</div>
<script>
let s=null, bagli=false, sonKod='e';
const bagNokta=document.getElementById('bagNokta');
const bagYazi=document.getElementById('bagYazi');
const durumMetin=document.getElementById('durumMetin');
const hizSlider=document.getElementById('hiz');
const hizDeger=document.getElementById('hizDeger');

function baglantiDurumu(geldi){
  bagli=geldi;
  if(bagli){
    bagNokta.classList.add('baglanti-ok');
    bagYazi.textContent='Bagli';
    durumMetin.textContent='Komut bekleniyor...';
  }else{
    bagNokta.classList.remove('baglanti-ok');
    bagYazi.textContent='Baglanti yok';
    durumMetin.textContent='Tekrar baglaniliyor...';
  }
}

function soketAc(){
  try{
    s=new WebSocket('ws://'+location.hostname+':81/');
    s.onopen=()=>baglantiDurumu(true);
    s.onclose=()=>{baglantiDurumu(false); setTimeout(soketAc,1500);}
    s.onerror=()=>{baglantiDurumu(false);}
    s.onmessage=(e)=>{ /* ileri gelisim icin saklanabilir */ }
  }catch(err){
    baglantiDurumu(false);
    setTimeout(soketAc,2000);
  }
}

function komutGonder(kod){
  if(!s || s.readyState!==1) return;
  sonKod=kod;
  s.send(kod);
  if(kod==='a')durumMetin.textContent='Ileri...';
  else if(kod==='b')durumMetin.textContent='Geri...';
  else if(kod==='c')durumMetin.textContent='Sol...';
  else if(kod==='d')durumMetin.textContent='Sag...';
  else if(kod==='e')durumMetin.textContent='Duruldu.';
}

function hizGonder(){
  if(!s || s.readyState!==1) return;
  const deger=parseInt(hizSlider.value);
  hizDeger.textContent=deger;
  s.send('h'+deger.toString()); // 'hxxx' formatinda hiz gonderimi
}

document.addEventListener('DOMContentLoaded',()=>{
  soketAc();
  document.querySelectorAll('.btn').forEach(btn=>{
    const kod=btn.getAttribute('data-kod');
    const basFunc=()=>komutGonder(kod);
    btn.addEventListener('click',basFunc);
    btn.addEventListener('touchstart',e=>{e.preventDefault();basFunc();});
  });
  hizSlider.addEventListener('input',()=>{hizDeger.textContent=hizSlider.value;});
  hizSlider.addEventListener('change',hizGonder);
});
</script>
</body>
</html>
)rawliteral";
// SPA HTML SONU -----------

void motorDur(){ ledcWrite(kanal1,0); ledcWrite(kanal2,0); ledcWrite(kanal3,0); ledcWrite(kanal4,0); } // tum motorler durdurulmekte
void motorIleri(){ ledcWrite(kanal1,hiz); ledcWrite(kanal2,0); ledcWrite(kanal3,hiz); ledcWrite(kanal4,0); } // ileri surus yapilmakta
void motorGeri(){ ledcWrite(kanal1,0); ledcWrite(kanal2,hiz); ledcWrite(kanal3,0); ledcWrite(kanal4,hiz); } // geri surus yapilmakta
void motorSol(){ ledcWrite(kanal1,hiz); ledcWrite(kanal2,0); ledcWrite(kanal3,0); ledcWrite(kanal4,hiz); } // sola donus yapilmakta
void motorSag(){ ledcWrite(kanal1,0); ledcWrite(kanal2,hiz); ledcWrite(kanal3,hiz); ledcWrite(kanal4,0); } // saga donus yapilmakta

void webSoketFonksiyonu(byte no, WStype_t tur, uint8_t* veri, size_t uzunluk){ // websocket olayi islenmekte
  if(tur==WStype_TEXT){
    if(uzunluk==1){ // tek karakter komutlar (yon)
      karakter = (char)veri[0];
      Serial.print("Komut: "); Serial.println(karakter);
    }else if(uzunluk>=2 && veri[0]=='h'){ // hiz ayari: "h150" gibi
      int yeniHiz = atoi((const char*)(veri+1));
      if(yeniHiz<0) yeniHiz=0; if(yeniHiz>255) yeniHiz=255;
      hiz = yeniHiz;
      Serial.print("Hiz: "); Serial.println(hiz);
    }
  }
}

void setup(){
  Serial.begin(9600);

  // PWM kanallari hazirlaniyor
  ledcSetup(kanal1,5000,8); ledcAttachPin(IN1,kanal1);
  ledcSetup(kanal2,5000,8); ledcAttachPin(IN2,kanal2);
  ledcSetup(kanal3,5000,8); ledcAttachPin(IN3,kanal3);
  ledcSetup(kanal4,5000,8); ledcAttachPin(IN4,kanal4);
  motorDur();

  WiFi.mode(WIFI_AP); WiFi.softAP(apSsid, apSifre); // AP modu baslatilmakta
  Serial.print("AP IP: "); Serial.println(WiFi.softAPIP());

  sunucu.on("/",[](){ sunucu.send(200,"text/html",INDEX_HTML); }); // SPA gonderilmekte
  sunucu.begin();

  webSoket.begin(); webSoket.onEvent(webSoketFonksiyonu); // WebSocket baslatilmakta
}

void loop(){
  if(karakter=='a') motorIleri();
  else if(karakter=='b') motorGeri();
  else if(karakter=='c') motorSol();
  else if(karakter=='d') motorSag();
  else motorDur();

  webSoket.loop();
  sunucu.handleClient();
}

Benzer Temrinler & Yazılar

  • Servo Motor Uygulaması

    Servo, kapalı çevrim (geri besleme) kontrol sistemi anlamına gelir. Kapalı çevrim kontrol sistemi,istenen sonucu elde etmek yani motorun hızını ve yönünü ayarlamak için geri besleme sinyalinikullanır. Görselde servo motor geri besleme blok şeması ve kontrol ünitesi görülmektedir.DC motor, dişliler aracılığıyla çıkış miline bağlıdır ki bu mil potansiyometrenin milidir. Potansiyometre,motorun mevcut konumunun hedef konumla karşılaştırıldığı servo…

  • Gaz Dedektörü Devresi

    Görseldeki MQ-2 gaz sensörü pin yapısı görülmektedir. MQ-2 gaz sensörü, 300 ile 10.000 ppm seviyesindeki yanıcı gaz ve sigara dumanını algılar. Görselde görülen gaz sensörü devresi, ortamda gaz algıladığında uyarı sinyalleri verir. VCC: 5 V besleme. GND: Toprak pini. D0: Dijital veri çıkışı. A0: Analog veri çıkışı. const byte buzzer = 13; // Buzzer'ın takılacağı…

  • RFID Uygulaması

    Görseldeki uygulamada RFID okuyucuya geçerli bir kart okutulduğunda seri ekranda “ge-çerli kart” yazar. Geçersiz kart okutulduğunda kartın ID’sini verir. ID’si programa dâhil edilenkartlar, geçerli kart olur. Kart geçerliyken çalışan kod blokuna istenen kodlar yazılarak istenenkontroller sağlanır. #include <SPI.h> // Dahili SPI kütüphanesi #include <MFRC522.h>  // v1.4.9 #define reset 9 // Reset pini #define ss 10…

  • LDR’yle Analog Giriş Uygulaması

    LDR, ışıkla direnci ters orantılı olarak değişen elemandır. Arduino’nun 5 V gerilimi üzerine uygulanan LDR’nin direnç-gerilim değişiminin anlaşılabilmesi için 10 kΩ’luk bir direnç seri bağlanarakgerilim bölücü oluşturulur. Bağlantı noktasının gerilim değişimi Arduino’nun analog girişineverilir const byte LED = 13; //LED değişkeninin içeriği 13 ile sabitlendi. int LDR; void setup() {  pinMode(LED, OUTPUT);  Serial.begin(9600); } void…

  • Bluetooth Kontrollü Araç Uygulaması

    Görselde bluetooth modülün RX ve TX pinlerinin SoftwareSerial.h kütüphanesi kullanılarak8 ve 7 numaralı pinlere bağlanması gösterilmiştir. Modülün TX ucu Arduino’nun RX (8. pin) ucuna, modülün RX ucu Arduino’nun TX (7. pin) ucuna bağlanmalıdır. Ancak modülün TX ucundançıkan 3,3 V Arduino RX ucunda lojik 1 olarak kabul edilirken Arduino’nun TX ucundan çıkan 5 Vmodülün RX ucuna…

  • Engelden Kaçan Robot Uygulaması

    Engelden kaçan robotta engelleri algılamak için ultrasonik sensör kullanılmaktadır GörseldekiUltrasonik sensörden gelen bilgilerle mesafe hesaplanır. Mesafe 30 cm’nin altına indiğinde motor tarafından sürücüye sol tekerleği geriye döndürme bilgisi gönderilmektedir. 30 cm üzerindekitüm mesafe ölçümlerinde tekerlekler ileri yönde döndürülecek şekilde motor sürücüye bilgi gönderilmektedir. Taslaktaki “hiz=255;” değeri düz gitme ve dönüş için farklı değerlere ayarlanarakrobot yavaşlatılabilir….

Bir Yorum Yazın

E-posta adresiniz yayınlanmayacaktır. Gerekli alanlar * ile işaretlenmiştir.