![Arduino Mega + WiFi = Automatyzacja: 5 kroków Arduino Mega + WiFi = Automatyzacja: 5 kroków](https://img.gwsigeps.com/img/circuits/arduino-mega-wifi-automation-4.jpg)
Spisu treści:
- Kieszonkowe dzieci:
- Krok 1: Montaż
- Krok 2: Demonstracja
- Krok 3: Biblioteki
- Krok 4: Kod źródłowy
- Krok 5: Pliki
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ć
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 (" { 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 "