Arduino Mega + WiFi = ระบบอัตโนมัติ: 5 ขั้นตอน

Arduino Mega + WiFi = ระบบอัตโนมัติ: 5 ขั้นตอน

สารบัญ:

Anonim

วันนี้ฉันจะพูดถึงการชุมนุมที่ผู้ติดตามหลายคนแนะนำ: Arduino Mega + ESP ซึ่งจะรวมถึงโครงการอัตโนมัติที่มีรีเลย์ 16 ตัวเซ็นเซอร์สามตัวและสมาร์ทโฟน เราจะสร้างเว็บเซิร์ฟเวอร์สำหรับ Arduino Mega โดยใช้การสื่อสารแบบอนุกรมกับ ESP8266 ในรุ่น ESP-01 ฉันจะแสดงหน้าพร้อมค่าของเซ็นเซอร์และปุ่มเพื่อแก้ไขสถานะของรีเลย์

วัสดุ:

ขั้นตอนที่ 1: การประกอบ

ฉันวางแผนผังไว้ที่นี่ซึ่งแสดง DHT22, Ds18b20 และเซ็นเซอร์ตัวที่สาม (แสง) ซึ่งเชื่อมต่อกับรีเลย์ด้วยหมุด 36 ถึง 51

ขั้นตอนที่ 2: การสาธิต

ดูวิดีโอสาธิตการใช้งานโครงการ ในการประกอบคุณจะได้รับบอร์ด 16 สายซึ่งเชื่อมต่อโดยตรงกับพอร์ตของ Arduino Uno Uno ที่ฉันใช้อยู่นี้ใช้เพื่อเพิ่มกำลังแรง 3v3 ของ ESP-01 เท่านั้น ฉันยังมี LDR (ซึ่งเป็นเซ็นเซอร์วัดแสงของฉัน) เครื่องวัดอุณหภูมิ Ds18b20 และ DHT22 ซึ่งเก็บข้อมูลความชื้นและอุณหภูมิ เรามีแอพพลิเคชั่นบนสมาร์ทโฟนที่จะแสดงข้อมูลที่รวบรวมโดยเซ็นเซอร์เหล่านี้และส่งไปยังโทรศัพท์มือถือจาก Arduino Mega ผ่าน ESP ซึ่งจะเป็นสะพานเชื่อมต่ออนุกรม (เช่น WiFi)

ในการชุมนุมเรามีไฟ LED ซึ่งเมื่อสว่างแสดงว่ามีการปิดรีเลย์ที่เกี่ยวข้อง กระบวนการนี้ควบคุมโดยสมาร์ทโฟน

ขั้นตอนที่ 3: ห้องสมุด

สำหรับโครงการของเราวันนี้เราจะต้องใช้ libs บางอย่าง:

ห้องสมุด WiFiEsp

ใน Arduino IDE ไปที่ Sketch-> Include Library-> Manage Libraries …

ติดตั้ง WiFiEsp

ห้องสมุด DallasTemperature

ใน Arduino IDE ไปที่ Sketch-> Include Library-> Manage Libraries …

ติดตั้ง DallasTemperature

ห้องสมุด OneWire

ใน Arduino IDE ไปที่ Sketch-> Include Library-> Manage Libraries …

ติดตั้ง OneWire

ไลบรารีเซ็นเซอร์ DHT โดย Adafruit

ใน Arduino IDE ไปที่ Sketch-> Include Library-> Manage Libraries …

ติดตั้งไลบรารีเซ็นเซอร์ DHT โดย Adafruit

ขั้นตอนที่ 4: ซอร์สโค้ด

MEGAESP_01.ino

เราเริ่มต้นด้วยการรวมไลบรารี่และการกำหนดพินที่ติดอยู่กับเซ็นเซอร์ นอกจากนี้เรายังชี้ให้เห็นถึงพินที่การถ่ายทอดครั้งแรกจะมีขึ้นและจำนวนพิน (เริ่มจากอันแรก) นี้จะถูกใช้

#include

#include #include #include // Pinos onde estão os sensores #define PIN_DS18B20 7 #define PIN_DHT22 8 #define PIN_LUMINOSITY A0 # กำหนด FIRST_PIN 36 // Pino onde está o primeiro relê #define PINS_COUNT 16 // Quantos pinos ส่วนหนึ่งทำเหมือนนายกรัฐมนตรี

เราดำเนินการกับเซ็นเซอร์อุณหภูมิ DS18B20 และเซ็นเซอร์อุณหภูมิและความชื้น DHT22 จากนั้นเราจะกำหนดคำจำกัดความที่เกี่ยวข้องกับเครือข่าย WiFi เช่น SSID และรหัสผ่านสำหรับ ESP เพื่อเชื่อมต่อ เราชี้ไปที่เซิร์ฟเวอร์ที่จะรับการร้องขอบนพอร์ต 80 (http พอร์ตมาตรฐาน) รวมถึงตัวแปรเพื่อเก็บค่าของเซ็นเซอร์

// เซ็นเซอร์ของ Temperatura DS18B20

OneWire oneWire (PIN_DS18B20); เซ็นเซอร์ DallasTemperature (& oneWire); เซ็นเซอร์อุปกรณ์ที่อยู่; // อุณหภูมิของเซ็นเซอร์ DHT22 DHT dht (PIN_DHT22, DHT22); // SSID และ senha da rede wifi สำหรับ ESP เชื่อมต่อกับ SSID = "SSID"; char pass = "12345678"; char ip = "192.168.0.109"; // เซิร์ฟเวอร์รับเป็นสิ่งจำเป็นสำหรับพอร์ต 80 (พอร์ตPadrão http) เซิร์ฟเวอร์ WiFiEspServer (80); // Variáveis ​​para armazenar os valores dos sensores ลอยอุณหภูมิ DS18B20 = 0; อุณหภูมิลอยตัว DHT22 = 0; ลอยความชื้น DHT22 = 0; int luminosity = 0; // Mantém o estado atual dos pinos (HIGH ou LOW) pins int สถานะ PINS_COUNT;

MEGAESP_01.ino - ตั้งค่า

เราเริ่มต้นมอนิเตอร์แบบอนุกรมและอนุกรมที่ ESP-01 อยู่กับ AT เฟิร์มแวร์นอกเหนือจากพินและเซ็นเซอร์ DS18B20 และ DHT22 สำหรับเซ็นเซอร์ความสว่างเราเพียงแค่อ่านขาอะนาล็อก เรายังเริ่มต้น WiFi และเชื่อมต่อกับเครือข่าย ในที่สุดเราเริ่มต้นเซิร์ฟเวอร์

การตั้งค่าเป็นโมฆะ ()

{// ซีเรียลพาราออนมอนิเตอร์อนุกรม Serial.begin (115200); // พอร์ตอนุกรมนั้นเป็นเฟิร์มแวร์ ESP-01 com AT Serial1.begin (115200); // Inicializa os pinos setupPins (); // Inicializa o เซ็นเซอร์ DS18B20 setupDS18B20 (); // Inicializa o เซ็นเซอร์ DHT22 dht.begin (); // เซ็นเซอร์วัดแสงที่มีความแม่นยำสูงตรวจสอบ pinMode (A0, INPUT); // Inicializa WiFi และการตั้งค่า rediFi (); // Inicializa o เซิร์ฟเวอร์ server.begin (); }

MEGAESP_01.ino - setupPins

ในขั้นตอนนี้เราวางพินที่เชื่อมต่อกับรีเลย์เป็นเอาท์พุท

เป็นโมฆะ setupPins ()

{// Coloca os pinos que estão ligados os rel coms como saídaสำหรับ (int i = 0; i

MEGAESP_01.ino - setupWiFi

ที่นี่เราดำเนินการฟังก์ชั่นที่เริ่มต้นพอร์ตอนุกรมที่ ESP-01 ติดตั้งเฟิร์มแวร์ AT อยู่แล้ว เรารอที่จะเชื่อมต่อกับเครือข่าย WiFi กำหนดค่า IP และตรวจสอบ IP เดียวกัน

เป็นโมฆะ setupWiFi ()

{// อนุกรมต่อไปนี้เป็น ESP-01 com กับเฟิร์มแวร์ที่ติดตั้ง WiFi.init (& Serial1); Serial.print ("Conectando a"); Serial.println (SSID); int status = WL_IDLE_STATUS; // Aguarda conectar à rede WiFi ในขณะที่ (status! = WL_CONNECTED) {status = WiFi.begin (ssid, pass); } Serial.println (); Serial.println ("Conectado"); // กำหนดค่า o IP IPAddress ipAddress; ipAddress.fromString ip (); WiFi.config (IPAddress); // Veririca o IP IPAddress localIP = WiFi.localIP (); Serial.print ("IP:"); Serial.println (localIP); }

MEGAESP_01.ino - setupDS18B20

เริ่มต้นเซ็นเซอร์ DS18B20

// Inicializa o เซ็นเซอร์ DS18B20

เป็นโมฆะ setupDS18B20 () {sensors.begin (); if (! sensors.getAddress (sensor, 0)) {Serial.println ("Sensor não encontrado!"); }}

MEGAESP_01.ino - วนรอบ

ในลูปเราจะตรวจสอบไคลเอนต์ใหม่ เราอ่านคำขอและหากคำขอไม่ได้สำหรับ favicon เราจะดำเนินการตามค่าที่ส่งผ่านในคำขอ จากนั้นเราอ่านเซ็นเซอร์และส่งคำตอบไปยังลูกค้า เรากำหนดเวลาสำหรับเบราว์เซอร์ในการรับข้อมูลและปิดการเชื่อมต่อกับลูกค้า

เป็นโมฆะห่วง ()

{WiFiEspClient client = server.available (); // Verifica se há um novo cliente if (client) {Serial.println ("Novo cliente conectou"); // Faz a leitura da requisição char * request = readRequest (ลูกค้า); // ดูข้อกำหนดสำหรับ para o favicon ถ้า (strstr (คำขอ, "favicon") == NULL) {// Executamos ação com o valor passado na requisiçãoดำเนินการ (getAction (ร้องขอ), getValue (ร้องขอ)); // Faz a leitura dos sensores readSensorDS18B20 (); readSensorDHT22 (); readSensorLuminosity (); // Envia a resposta ao cliente sendResponse (ลูกค้า); // Tempo para o navegador receber os dados delay (100); } // Fecha a conexão com o ลูกค้า client.stop (); }}

MEGAESP_01.ino - readRequest

ที่นี่เรามีฟังก์ชั่นที่สำคัญมาก มันทำอะไร? เมื่อเรากดปุ่มบนสมาร์ทโฟนฟังก์ชั่นจะส่งคำสั่งใน HTTP ไปยัง ESP8266 โดยใช้เพียงบรรทัดแรกดังที่คุณเห็นในตัวอย่างด้านล่าง ฉันเน้นว่าแม้หลังจากอ่านบรรทัดแรกเป็นสิ่งสำคัญที่ต้องอ่านจนกว่าจะสิ้นสุดมิฉะนั้น WiFiESP lib จะหมดเวลา

GET /? on = 1 HTTP / 1.1 r n

โฮสต์: 192.168.3.154 r n

การเชื่อมต่อ: keep-alive r n

การควบคุมแคช: อายุสูงสุด = 0 r n

อัปเกรด - คำขอไม่ปลอดภัย: 1 r n

ตัวแทนผู้ใช้: Mozilla / 5.0 (Linux; Android 8.0.0; SM-G955F Build / R16N) AppleWebKit / 537.36 (KHTML เช่น Gecko) Chrome / 68.0.3440.91 Mobile Safari / 537.36 r n

ยอมรับ: ข้อความ / html, แอปพลิเคชัน / xhtml + xml, แอปพลิเคชัน / xml; q = 0.9, รูปภาพ / webp, รูปภาพ / apng, * / *; q = 0.8 r n

ผู้อ้างอิง:

ยอมรับการเข้ารหัส: gzip, ยุบ r n

ยอมรับภาษา: en-US, en; q = 0.9 r n

r n

ที่นี่เรามีการอ่านบรรทัดแรกของคำขอ

// Faz a leitura da primeira linha da requisição

ถ่าน * readRequest (ไคลเอนต์ WiFiEspClient) {bool currentLineIsBlank = true; คำขอถ่าน 50; int i = 0; บูล firstLine = จริง; ในขณะที่ (client.connected ()) {ถ้า (client.available ()) {char c = client.read (); Serial.write (c); // Apenas a Primeira linha da requisição nos interessa if (firstLine) {request i = c; i ++; }

เราเห็นว่าบรรทัดสุดท้ายของคำขอคือ: r n เพียงอย่างเดียว, r n และหลังจากบรรทัดก่อนหน้ามันคือ: r nso ถ้าเรามาที่นี่มันเป็นเพราะคำขอถูกอ่านเต็มแล้ว นอกจากนี้หากคุณอ่านตัวละครอื่นที่ไม่ใช่ n และ r ก็หมายความว่าบรรทัดนั้นไม่ว่างเปล่า

ถ้า (c == ' n') {

// A última linha da requisiçãoé um r n sozinho, após o r n ดา linha ล่วงหน้าถ้า (currentLineIsBlank) ถ้า / (chLou chiaou aqui é porque a que porqueidaida complet complet complet complet complet complet complet completidaidaidaida; } currentLineIsBlank = จริง firstLine = false; } else if (c! = ' r') {// Se leu qualquer caracter que nãoสำหรับ n e r นัยสำคัญต่อหนึ่ง linha nãoestá em branco currentLineIsBlank = false; }}} คำขอส่งคืน; }

MEGAESP_01.ino - sendResponse

ฟังก์ชั่นนี้จะส่ง HTML ไปยังลูกค้า นอกจากนี้ยังส่งส่วนหัว HTTP รวมถึงส่วนหัว HTML และเนื้อหา

// Envia o HTML สำหรับไคลเอนต์

ถือเป็นโมฆะ sendResponse (ไคลเอนต์ WiFiEspClient) {// Envia o cabeçalho HTTP client.print ("HTTP / 1.1 200 OK r n" "ประเภทเนื้อหา: text / html; charset = UTF-8 r n" "การเชื่อมต่อ: ปิด r n "" รีเฟรช: 10; URL = / r n "// ขอใบเสนอราคาจากผู้ให้บริการเซิร์ฟเวอร์ที่มี 10 ชื่อ" r n "); client.println (""); client.println (""); head (ไคลเอนต์); // Envia o cabeçalhoทำเนื้อหา HTML (ไคลเอนต์); // Envia o corpo ทำ HTML client.println ("');

}

MEGAESP_01.ino - หัว

เราส่ง CSS เพื่อแก้ไขลักษณะที่ปรากฏของหน้า

// Envia o CSS สำหรับโมดูลaparência da página

โมฆะส่วนหัว (ไคลเอนต์ WiFiEspClient) {client.println (F ("' ''

''));

}

MEGAESP_01.ino - เนื้อหา

จากนั้นเราจะแสดงข้อมูลเซ็นเซอร์และสร้างปุ่มสำหรับแต่ละขาที่มีรีเลย์

// Exibe os dados dos sensores e cria os botões

เป็นโมฆะร่างกาย (ลูกค้า WiFiEspClient) {client.println (""" DS18B20 อุณหภูมิ: "+ สตริง (อุณหภูมิ DS18B20) +" ° C "" "" อุณหภูมิ DHT22: "+ สตริง (อุณหภูมิDHT22) +" ° C "" "" DHT22 ความชื้น: "+ สตริง (ความชื้นDHT22) +"% "" "); String String =" "; // คลิกเพื่อปิดการตั้งค่าการเชื่อมต่อสำหรับ (int i = 0; i

{

buttons.concat (ปุ่ม (i));

}

client.println (ปุ่ม);

client.println ("');

}

MEGAESP_01.ino - ปุ่ม

เราสร้างปุ่มที่มีลักษณะและการทำงานที่สอดคล้องกับสถานะปัจจุบันของรีเลย์

// Cria um botão com aparência e ação correspondente ao estado atual do relê

ปุ่มสตริง (จำนวน int) {ฉลากสตริง = สตริง (หมายเลข + 1); String className = "ปุ่ม"; className + = pinsStatus number == HIGH? "button_on": "button_off"; การกระทำสตริง = pinsStatus จำนวน == สูง? "ปิดเปิด"; คืน "