Arduino Mega + WiFi = Automatyzacja: 5 kroków

Arduino Mega + WiFi = Automatyzacja: 5 kroków

Spisu treści:

Anonim

Dzisiaj porozmawiam o zgromadzeniu, które zasugerowało wielu zwolenników: Arduino Mega + ESP. Obejmie to projekt automatyzacji z 16 przekaźnikami, trzema czujnikami i smartfonem. Stworzymy serwer sieci Web dla Arduino Mega przy użyciu komunikacji szeregowej z ESP8266, w wersji ESP-01. Pokażę również stronę z wartościami czujników i przycisków, aby zmodyfikować stan przekaźników.

Kieszonkowe dzieci:

Krok 1: Montaż

Umieściłem tutaj schemat, który pokazuje DHT22, Ds18b20 i trzeci czujnik (światło), które są połączone z przekaźnikami za pomocą pinów 36 do 51.

Krok 2: Demonstracja

Zobacz demonstrację wideo działającego projektu. W zespole otrzymujesz 16-żyłową płytkę, która jest podłączona bezpośrednio do portów Arduino Uno. To Uno, którego użyłem, było tylko zasilaniem 3v3 ESP-01. Nadal mam LDR (który jest moim czujnikiem światła), termometr Ds18b20 i DHT22, który zbiera dane dotyczące wilgotności i temperatury. Mamy aplikację na smartfonie, która wyświetla dane zebrane przez te czujniki i wysyła je do telefonu komórkowego z Arduino Mega, za pośrednictwem ESP, który byłby mostem szeregowym (tj. WiFi).

W zespole mamy diody LED, które po zapaleniu wskazują, że odpowiednie przekaźniki są wyłączone. Ten proces jest również kontrolowany przez smartfon.

Krok 3: Biblioteki

W naszym dzisiejszym projekcie będziemy potrzebować pewnych bibliotek:

Biblioteka WiFiEsp

W Arduino IDE przejdź do Sketch-> Include Library-> Manage Libraries …

Zainstaluj WiFiEsp

Biblioteka DallasTemperature

W Arduino IDE przejdź do Sketch-> Include Library-> Manage Libraries …

Zainstaluj DallasTemperature

Biblioteka OneWire

W Arduino IDE przejdź do Sketch-> Include Library-> Manage Libraries …

Zainstaluj OneWire

Biblioteka czujników DHT firmy Adafruit

W Arduino IDE przejdź do Sketch-> Include Library-> Manage Libraries …

Zainstaluj bibliotekę czujników DHT przez Adafruit

Krok 4: Kod źródłowy

MEGAESP_01.ino

Zaczynamy od włączenia bibliotek i określenia pinów przymocowanych do czujników. Zwracamy również uwagę na pinezkę, gdzie będzie pierwszy przekaźnik i ile pinów (począwszy od tego pierwszego) będzie używanych.

#zawierać

#zawierać #zawierać #zawierać // Pinos on estso os sensores #define PIN_DS18B20 7 #define PIN_DHT22 8 #define PIN_LUMINOSITY A0 #define FIRST_PIN 36 // Pino onde est primeiro relde # define PINS_COUNT 16 // Quantos pinos a partir do primeiro serão utilizados

Kontynuujemy pracę z czujnikiem temperatury DS18B20 i czujnikiem temperatury i wilgotności DHT22. Następnie określiliśmy definicje dotyczące sieci WiFi, takie jak SSID i hasło do połączenia ESP. Wskazujemy serwer, który otrzyma żądania na porcie 80 (standardowy port http), a także zmienne do przechowywania wartości czujników.

// Sensor de Temperatura DS18B20

OneWire oneWire (PIN_DS18B20); Czujniki temperatury DallasTemper (i oneWire); Czujnik DeviceAddress; // Sensor de temperatura e umidade DHT22 DHT dht (PIN_DHT22, DHT22); // SSID e senha da rede wifi para o ESP se conectar char ssid = "SSID"; char pass = "12345678"; char ip = "192.168.0.109"; // Servidor que receberá as requisições na porta 80 (porta padrão http) Serwer WiFiEspServer (80); // Variáveis ​​para armazenar os valores dos sensores float temperatureDS18B20 = 0; float temperatureDHT22 = 0; float moistureDHT22 = 0; int luminosity = 0; // Mantém o estado atual dos pinos (HIGH ou LOW) int pinsStatus PINS_COUNT;

MEGAESP_01.ino - konfiguracja

Inicjujemy monitor szeregowy i szeregowy, w którym ESP-01 jest wyposażony w oprogramowanie sprzętowe AT, oprócz pinów, oraz czujniki DS18B20 i DHT22. W przypadku czujnika jasności wystarczy odczytać pin analogowy. Inicjujemy również WiFi i łączymy się z siecią. Na koniec inicjujemy serwer.

void setup ()

{// Serial para o monitor seryjny Serial.begin (115200); // Serial onde está o ESP-01 com firmware AT Serial1.begin (115200); // Ustawienia InosPosos pinos setupPins (); // Inicializa o sensor DS18B20 setupDS18B20 (); // Inicializa o czujnik DHT22 dht.begin (); // Para o czujniku jasności jest ustawiona na pino analógico pinMode (A0, INPUT); // Inicializa WiFi e conecta à rede setupWiFi (); // Inicializa o serwer server.begin (); }

MEGAESP_01.ino - setupPins

W tym kroku umieszczamy szpilki podłączone do przekaźników jako wyjścia.

void setupPins ()

{// Coloca os pinos que estão ligados os relês como saída for (int i = 0; i

MEGAESP_01.ino - setupWiFi

Tutaj wykonujemy funkcję, która inicjalizuje numer seryjny, w którym ESP-01 jest z zainstalowanym oprogramowaniem sprzętowym AT. Czekamy na połączenie z siecią WiFi, skonfigurowanie adresu IP i zweryfikowanie tego samego adresu IP.

void setupWiFi ()

{// Serial onde está o ESP-01 o oprogramowaniu wbudowanym AT já instalado WiFi.init (i Serial1); Serial.print („Conectando a”); Serial.println (ssid); int status = WL_IDLE_STATUS; // Aguarda conectar à rede WiFi while (status! = WL_CONNECTED) {status = WiFi.begin (ssid, pass); } Serial.println (); Serial.println („Conectado”); // Configura o IP IPAddress ipAddress; ipAddress.fromString (ip); WiFi.config (adres IP); // Veririca o Adres IP IP localIP = WiFi.localIP (); Serial.print („IP:”); Serial.println (localIP); }

MEGAESP_01.ino - setupDS18B20

Zainicjuj czujnik DS18B20.

// Inicializa o sensor DS18B20

void setupDS18B20 () {sensors.begin (); if (! sensors.getAddress (sensor, 0)) {Serial.println ("Sensor não encontrado!"); }}

MEGAESP_01.ino - Loop

W pętli sprawdzamy nowego klienta. Czytamy żądanie i jeśli żądanie nie jest dla favicon, wykonujemy akcję z wartością przekazaną w żądaniu. Następnie odczytujemy czujniki i wysyłamy odpowiedź do klienta. Określamy czas, w którym przeglądarka otrzyma dane i zamknie połączenie z klientem.

void loop ()

{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 (client); // Skorzystaj z informacji o favicon if (strstr (request, "favicon") == NULL) {// Executamos a ação com valor passado na requisição execute (getAction (request), getValue (request)); // Faz a leitura dos sensores readSensorDS18B20 (); readSensorDHT22 (); readSensorLuminosity (); // Envia a resposta ao cliente sendResponse (klient); // Tempo para navegador receber os dados delay (100); } // Fecha a conexão com o cliente client.stop (); }}

MEGAESP_01.ino - readRequest

Tutaj mamy bardzo ważną funkcję. Co to robi? Gdy naciśniemy przycisk na smartfonie, funkcja wysyła polecenie HTTP do ESP8266, używając tylko pierwszej linii, jak widać w poniższym przykładzie. Podkreślam, że nawet po przeczytaniu pierwszej linii ważne jest przeczytanie jej do końca, w przeciwnym razie libES WiFiESP daje limit czasu.

GET /? On = 1 HTTP / 1.1 r

Gospodarz: 192.168.3.154 r

Połączenie: zachowaj życie

Cache-Control: max-age = 0 r

Żądania aktualizacji i bezpieczeństwa: 1 r

User-Agent: Mozilla / 5.0 (Linux; Android 8.0.0; SM-G955F Build / R16N) AppleWebKit / 537,36 (KHTML, jak Gecko) Chrome / 68.0.3440.91 Mobile Safari / 537.36 t

Akceptuj: text / html, application / xhtml + xml, application / xml; q = 0,9, image / webp, image / apng, * / *; q = 0,8

Referer:

Accept-Encoding: gzip, deflate r. N

Accept-Language: en-US, en; q = 0,9 r. N

r

Tutaj mamy odczyt pierwszej linii żądania.

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

char * readRequest (klient WiFiEspClient) {bool currentLineIsBlank = true; żądanie char 50; int i = 0; bool firstLine = true; while (client.connected ()) {if (client.available ()) {char c = client.read (); Serial.write (c); // Apenas a primeira linha da requisição nos interessa if (firstLine) {request i = c; i ++; }

Widzimy, że ostatnią linią żądania jest: r n sam, n. N. I po poprzedniej linii jest to: rs. Jeśli tu dotrzemy, to dlatego, że żądanie zostało przeczytane w całości. Ponadto, jeśli czytasz dowolny znak inny niż n i r, oznacza to, że linia nie jest pusta.

if (c == 'n') {

// A última linha da requisição è um sozinho, após o r da linha anterior if (currentLineIsBlank) {// Se chegou aqui é porque a requisição foi lida por completo break; } currentLineIsBlank = true; firstLine = false; } else if (c! = 'r') {// Se leu qualquer caracter que não dla e significa que a linha não está em branco currentLineIsBlank = false; }}} żądanie powrotu; }

MEGAESP_01.ino - sendResponse

Ta funkcja wysyła kod HTML do klienta. Wysyła także nagłówek HTTP, a także nagłówek i treść HTML.

// Envia o HTML para o cliente

void sendResponse (klient WiFiEspClient) {// Envia o cabeçalho Klient HTTP.print ("HTTP / 1.1 200 OK r" "Content-Type: text / html; charset = UTF-8 r" "Połączenie: close r n "" Odśwież: 10; URL = / r n "// Para fazer wymaga zmiany serwera i cada 10 segundos" n "); client.println (""); client.println (""); head (klient); // Envia o cabeçalho do HTML body (klient); // Envia o corpo do HTML client.println ("');

}

MEGAESP_01.ino - head

Wysłaliśmy CSS, aby zmodyfikować wygląd strony.

// Envia o CSS para modyfikuj a aparência da página

void head (klient WiFiEspClient) {client.println (F ("' ''

''));

}

MEGAESP_01.ino - ciało

Następnie przechodzimy do wyświetlania danych czujnika i tworzymy przyciski dla każdego pinu, który ma przekaźnik.

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

void body (klient WiFiEspClient) {client.println (""" Temperatura DS18B20: "+ Ciąg (temperatureDS18B20) +" ° C "" "" Temperatura DHT22: "+ Ciąg (temperaturaDHT22) +" ° C "" "" Wilgotność DHT22: "+ Ciąg (wilgotnośćDHT22) +"% "" "); String buttons =" ​​"; // Cria um botão para cada pino que possui um relê for (int i = 0; i

{

buttons.concat (przycisk (i));

}

client.println (przyciski);

client.println ("');

}

MEGAESP_01.ino - przycisk

Tworzymy przycisk o wyglądzie i działaniu, który odpowiada aktualnemu stanowi przekaźnika.

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

String button (int number) {String label = String (liczba + 1); String className = "button"; className + = pinsStatus number == HIGH? „button_on”: „button_off”; String action = pinsStatus number == HIGH? "Wyłącz włącz"; powrót "