Sakelar lampu wifi pintar



Selamat siang, pembaca yang budiman.

Sedikit lirik di awal. Gagasan tentang saklar lampu "pintar" sama sekali bukan hal baru dan, mungkin, ini adalah hal pertama yang terlintas dalam pikiran bagi mereka yang mulai berkenalan dengan platform Arduino dan elemen IoT. Dan saya tidak terkecuali untuk ini. Setelah bereksperimen dengan elemen rangkaian, motor dan LED, saya ingin melakukan sesuatu yang lebih diterapkan, yang banyak diminati dalam kehidupan sehari-hari dan, yang paling penting, akan mudah digunakan, dan tidak akan tetap menjadi korban percobaan demi kenyamanan.

Pada artikel ini saya akan memberi tahu Anda bagaimana saya membuat saklar yang akan bekerja seperti yang normal (yaitu, yang biasanya dipasang di dinding) dan pada saat yang sama memungkinkannya dikendalikan melalui WiFi (atau melalui Internet, seperti yang dilakukan dalam kasus ini).

Jadi, kami akan membuat daftar apa yang diperlukan untuk mengimplementasikan rencana tersebut. Saya harus segera mengatakan bahwa saya bermaksud untuk tidak berbelanja banyak pada komponen dan memilih komponen berdasarkan umpan balik di forum dan nilai uang. Oleh karena itu, beberapa komponen mungkin tampak tidak pantas di sini untuk amatir listrik yang berpengalaman, tetapi tolong jangan menilai dengan ketat, karena Saya hanya baru di bidang elektromekanik dan akan sangat menghargai komentar dari para profesional yang lebih berpengalaman.
Tidak.NamaDeskripsiHarga
1HLK-PM01220VAC ke adaptor 5VDC4,02 โ‚ฌ
2SSR-40DARelay Solid State untuk Kontrol Arus Sirkuit3,35 โ‚ฌ
3AMS1117-3.35V ke 3V penekan tegangan1,29 โ‚ฌ
4ESP8266-01Mikrokontroler dengan WiFi2,35 โ‚ฌ
Total:11,01 โ‚ฌ

Saya juga membutuhkan: server dengan mana sakelar akan dikontrol melalui Internet, Arduino Uno, dengan mana saya memprogram ESP, router dan barang habis pakai seperti kabel, terminal, dll., Semua ini dapat berbeda dari rasa dan tidak akan mempengaruhi ke hasil akhir.

Harga diambil dari Ebay, tempat saya membelinya.

Dan inilah bagaimana elemen-elemen dari tabel terlihat:



Sekarang Anda dapat membuat diagram koneksi:



Seperti yang mungkin Anda perhatikan, skema ini sangat sederhana. Semuanya dirakit dengan mudah, cepat dan tanpa solder. Semacam prototipe yang berfungsi, yang tidak perlu repot untuk waktu yang lama. Semuanya terhubung oleh kabel dan terminal. Satu-satunya negatif adalah bahwa relay tidak cocok dengan soket switch. Ya, awalnya saya berencana untuk mendorong semuanya ke dinding di belakang saklar agar terlihat estetis. Tetapi saya menyesal, tidak ada ruang yang cukup di soket dan relay hanya tidak cocok di kedua sisi atau sisi:



Oleh karena itu, saya sementara mengambil relay dari soket sampai saya menemukan kotak saklar yang cocok dengan soket untuk menyembunyikan besi di dalamnya. Tapi tidak ada yang lebih permanen daripada sementara, bukan? Oleh karena itu, semua ini sekarang terlihat seperti ini:



Pita isolasi akan menghemat dari sengatan listrik ... Saya harap.

Sekarang mari kita bicara tentang bagian perangkat lunak.

Dan sebelum melanjutkan dengan analisis kode dan perincian, saya akan memberikan diagram umum tentang penerapan kontrol lampu.



Saya berharap bahwa suatu hari nanti saya akan menulis ulang semuanya dan koneksi akan didasarkan pada protokol yang lebih cepat daripada HTTP, tetapi untuk permulaan itu akan dilakukan. Secara jarak jauh, bohlam mengubah kondisinya dalam waktu sekitar 1-1,5 detik, dan dari sakelar secara instan, sebagaimana layaknya sakelar yang layak.

Pemrograman ESP8266-01


Cara termudah untuk melakukan ini adalah dengan Arduino. Anda dapat mengunduh pustaka yang diperlukan untuk Arduino IDE dari GitHub . Ada semua petunjuk pemasangan dan konfigurasi.

Selanjutnya, kita perlu menghubungkan ESP ke komputer, untuk ini kita perlu USB ke Serial Adapter (seperti FTDi , CH340 , FT232RL ) atau platform Arduino (saya punya Arduino Uno) dengan output RX dan TX.

Perlu dicatat bahwa ESP8266-01 ditenagai oleh 3,3 Volts, yang berarti bahwa dalam kasus apapun tidak menghubungkannya ke Arduino, yang (sering) didukung oleh 5 Volts, secara langsung kalau tidak semuanya akan menjadi neraka. Anda dapat menggunakan peredam tegangan, yang ditunjukkan pada tabel di atas.

Skema koneksi sederhana: kami menghubungkan TX ,RX dan GND ESP ke RX, TX dan adaptor GND / Arduino masing-masing. Setelah itu, nyatanya, koneksi siap digunakan. Mikrokontroler dapat diprogram menggunakan Arduino IDE.

Beberapa nuansa saat menggunakan Arduino Uno:
  • Uno memiliki output untuk 3.3V, tetapi itu tidak cukup. Ketika Anda menghubungkan ESP ke sana, semuanya tampak berfungsi, indikatornya menyala, tetapi komunikasi dengan port COM terputus. Jadi saya menggunakan catu daya 3.3V berbeda untuk ESP.
  • Selain itu, UNO tidak memiliki masalah berkomunikasi dengan ESP, mengingat bahwa UNO ditenagai oleh 5V, dan ESP dari 3V.

Setelah beberapa percobaan dengan ESP8266-01, ternyata ESP sensitif terhadap tegangan yang terhubung ke GPIO0 dan GPIO2. Pada saat peluncuran, mereka tidak boleh di-grounded jika Anda bermaksud memulainya dalam mode normal. Rincian lebih lanjut tentang awal mikrokontroler di sini . Saya tidak tahu ini dan saya harus sedikit mengubah sirkuit, karena dalam versi ESP-01, hanya 2 pin ini yang tersedia dan keduanya digunakan di sirkuit saya.

Dan di sini adalah program untuk ESP itu sendiri:

Tampilkan kode
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
extern "C" { //         initVariant
  #include "user_interface.h"
}

const char* ssid = "WIFISSID"; //  WiFi
const char* password = "***************"; //  WiFi
const String self_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //     
const String serv_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //     
const String name = "IOT_lamp"; //  ,  
const String serverIP = "192.168.1.111"; //  IP WEB  
bool lamp_on =  false;
bool can_toggle = false;
int button_state;

ESP8266WebServer server(80); //  
HTTPClient http; //  

const int lamp = 2; //    GPIO2
const int button = 0; // ""   GPIO0

//    
void handleRoot() { 
  server.send(200, "text/plain", "Hello! I am " + name);
}

//    
void handleNotFound(){
  String message = "not found";
  server.send(404, "text/plain", message);
}

//   
void turnOnLamp(){
  digitalWrite(lamp, LOW);
  lamp_on = true;
}

//   
void turnOffLamp(){
  digitalWrite(lamp, HIGH);
  lamp_on = false;
}

//     ./.
void sendServer(bool state){
  http.begin("http://"+serverIP+"/iapi/setstate");
  String post = "token="+self_token+"&state="+(state?"on":"off"); //         
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  int httpCode = http.POST(post);
  http.end();  
}

//   
void toggleLamp(){
  if(lamp_on == true) {
    turnOffLamp();
    sendServer(false);
  } else {
    turnOnLamp();
    sendServer(true);
  }
}

//     
void handleOn(){
  String token = server.arg("token");
  if(serv_token != token) {
    String message = "access denied";
    server.send(401, "text/plain", message);
    return;
  }
  turnOnLamp();
  String message = "success";
  server.send(200, "text/plain", message);
}

//     
void handleOff(){
  String token = server.arg("token");
  if(serv_token != token) {
    String message = "access denied";
    server.send(401, "text/plain", message);
    return;
  }
  turnOffLamp();
  String message = "success";
  server.send(200, "text/plain", message);
}

//  MAC    IP
void initVariant() {
  uint8_t mac[6] = {0x00, 0xA3, 0xA0, 0x1C, 0x8C, 0x45};
  wifi_set_macaddr(STATION_IF, &mac[0]);
}

void setup(void){
  pinMode(lamp, OUTPUT);
  pinMode(button, INPUT_PULLUP); //   INPUT_PULLUP
  turnOffLamp();
  WiFi.hostname(name);
  WiFi.begin(ssid, password);

  //     WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  //    
  server.on("/", handleRoot);
  server.on("/on",  HTTP_POST, handleOn);
  server.on("/off", HTTP_POST, handleOff);
  server.onNotFound(handleNotFound);

  //  
  server.begin();
}

void loop(void){
  server.handleClient();

  //   
  button_state = digitalRead(button);
  if (button_state == HIGH && can_toggle) {
    toggleLamp();
    can_toggle = false;
    delay(500);
  } else if(button_state == LOW){
    can_toggle = true;
  }
}


Beberapa komentar pada kode:
  • Sangat penting untuk mendeklarasikan pin GPIO0 sebagai pinMode (tombol, INPUT_PULLUP ), karena Di sirkuit kita tidak menggunakan resistor untuk tombol ini. Dan ESP memiliki "dijahit" sendiri untuk tujuan ini.
  • .

WEB


Di sini Anda dapat melampiaskan imajinasi Anda dan menggunakan segala cara yang tersedia untuk membuat layanan yang akan memproses permintaan yang dikirim oleh saklar dan mengirim permintaan untuk on / off.

Saya menggunakan Yii untuk tujuan ini . Saya memilih kerangka kerja ini karena beberapa alasan, saya memerlukan otorisasi (karena portal tersedia di Internet) dan manajemen peran (untuk eksperimen di masa depan), dan saya menyukainya. Dan sekarang portal manajemen saya terlihat seperti ini:



Untuk mengontrol bola lampu di zona jangkauan jaringan, server itu sendiri pada ESP akan cukup. Tetapi Anda benar-benar ingin memiliki log, logika, dan perangkat lain di masa depan, jadi lebih baik tetap menggunakan server terpisah untuk manajemen.

Ini semua tentang portal, saya pikir tidak masuk akal untuk menulis lebih banyak tentangnya, tetapi jika Anda memiliki pertanyaan, saya akan dengan senang hati menjawabnya di komentar.

Alih-alih sebuah kesimpulan


Terima kasih jika Anda membaca artikel sampai akhir dan, mungkin, menemukan sesuatu yang bermanfaat untuk diri Anda sendiri di dalamnya. Saya akan senang dengan saran dan kritik. Secara umum, masih bagi saya bahwa hambatan dalam rangkaian adalah adaptor 5V dan saya akan senang jika Anda berbagi pengalaman Anda dalam memecahkan masalah seperti itu. Adapun ESP8266-01, sejauh ini belum mengajukan keluhan dari saya kecuali untuk penggunaan khusus pin GPIO. Ini telah bekerja secara stabil untuk minggu kedua. Sukses dalam proyek.

Source: https://habr.com/ru/post/id393497/


All Articles