Arduino Mega + WiFi = Automatisering: 5 trin

Arduino Mega + WiFi = Automatisering: 5 trin

Indholdsfortegnelse:

Anonim

I dag taler jeg om en forsamling, der blev foreslået af mange tilhængere: Arduino Mega + ESP. Dette vil omfatte et automatiseringsprojekt med 16 relæer, tre sensorer og en smartphone. Vi laver en webserver til Arduino Mega ved hjælp af seriel kommunikation med ESP8266, i ESP-01-versionen. Jeg vil også vise en side med værdierne for sensorer og knapper for at ændre relæernes tilstand.

forsyninger:

Trin 1: Montering

Jeg lagde her skematisk, som viser DHT22, Ds18b20 og en tredje sensor (lyset), som alle er forbundet til relæerne ved hjælp af stifterne 36 til 51.

Trin 2: Demonstration

Se video demonstration af projektet i drift. I forsamlingen får du en 16-leder bord, der er forbundet direkte til portene på en Arduino Uno. Denne Uno jeg brugte var kun til at drive 3v3 af ESP-01. Jeg har stadig en LDR (som er min lyssensor), et Ds18b20 termometer og DHT22, der samler fugtigheds- og temperaturdata. Vi har en applikation på smarttelefonen, som vil vise dataene indsamlet af disse sensorer og sende dem til mobiltelefonen fra Arduino Mega, gennem ESP, som ville være den serielle bro (dvs. WiFi).

I forsamlingen har vi LED'er, der, når de lyser, angiver, at de respektive relæer er slukket. Denne proces styres også af smartphone.

Trin 3: Biblioteker

For vores projekt i dag skal vi bruge visse libs:

WiFiEsp Bibliotek

I Arduino IDE skal du gå til Sketch-> Include Library-> Manage Libraries …

Installer WiFiEsp

DallasTemperature Library

I Arduino IDE skal du gå til Sketch-> Include Library-> Manage Libraries …

Installer DallasTemperatur

OneWire Library

I Arduino IDE skal du gå til Sketch-> Include Library-> Manage Libraries …

Installer OneWire

DHT sensor bibliotek af Adafruit

I Arduino IDE skal du gå til Sketch-> Include Library-> Manage Libraries …

Installer DHT sensor bibliotek ved hjælp af Adafruit

Trin 4: Kildekode

MEGAESP_01.ino

Vi starter med at inkludere biblioteker og definere stifterne til sensorerne. Vi peger også på stiften, hvor det første relæ vil være, og hvor mange stifter (fra denne første) vil blive brugt.

#omfatte

#omfatte #omfatte #omfatte // Pinos onde estão os sensores #define PIN_DS18B20 7 #define PIN_DHT22 8 #define PIN_LUMINOSITY A0 #define FIRST_PIN 36 // Pino onde está o primeiro relê #definale PINS_COUNT 16 // Kvantum pinos a partir do primeiro serão utilizados

Vi fortsætter med temperaturføleren DS18B20 og DHT22 temperatur- og fugtighedsføleren. Vi sætter derefter ud for definitioner, der involverer WiFi-netværket, såsom SSID og adgangskode til ESP til at forbinde. Vi peger på den server, der vil modtage anmodningerne på port 80 (standard port http), samt variablerne til at gemme sensorernes værdier.

// Sensor de Temperatura DS18B20

OneWire oneWire (PIN_DS18B20); DallasTemperatur sensorer (& oneWire); DeviceAddress sensor; // Sensor de temperatura e umidade DHT22 DHT dht (PIN_DHT22, DHT22); // SSID e senha da rede wifi til ESP se konectar char ssid = "SSID"; char pass = "12345678"; char ip = "192.168.0.109"; // Servidor que receberá som requisições na porta 80 (porta padrão http) WiFiEspServer server (80); // Variáveis ​​para armazenar os valores dos sensores float temperatureDS18B20 = 0; flyde temperaturDHT22 = 0; flydefugtighedDHT22 = 0; int lysstyrke = 0; // Mantém o estado atual dos pinos (HIGH ou LOW) int pinsStatus PINS_COUNT;

MEGAESP_01.ino - setup

Vi initialiserer den serielle og serielle skærm, hvor ESP-01 er udstyret med AT-firmware, udover stifter og DS18B20 og DHT22 sensorer. Til lysfølsomheden skal vi bare læse den analoge pin. Vi initialiserer også WiFi og forbinder til netværket. Endelig initialiserer vi serveren.

void setup ()

{// Serial para o monitor serial Serial.begin (115200); // Serial onde est ESP-01 com firmware AT Serial1.begin (115200); // Inicializa os pinos setupPins (); // Inicializa o sensor DS18B20 setupDS18B20 (); // Inicializa o sensor DHT22 dht.begin (); // Para o sensor de luminosidade apenas justamos ler o pino analógico pinMode (A0, INPUT); // Inicializa WiFi og konstruktionsopdateringWiFi (); // Inicializa o server server.begin (); }

MEGAESP_01.ino - setupPins

I dette trin sætter vi de stifter, der er forbundet til relæerne som output.

void setupPins ()

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

MEGAESP_01.ino - setupWiFi

Her udfører vi en funktion, der initialiserer serienummeret, hvor ESP-01 er med AT-firmware allerede installeret. Vi venter på at oprette forbindelse til WiFi-netværket, konfigurere IP'en og verificere den samme IP.

void setupWiFi ()

{// Serial onde est ESP-01 com o firmware AT installer WiFi.init (& Serial1); Serial.print ("Conectando a"); Serial.println (SSID); int status = WL_IDLE_STATUS; // Aguarda conectar à rede WiFi mens (status! = WL_CONNECTED) {status = WiFi.begin (ssid, pass); } Serial.println (); Serial.println ("Conectado"); // Configura o IPAdAdress ipAddress; ipAddress.fromString (ip); WiFi.config (IPAddress); // Veririca o IP IPAddress localIP = WiFi.localIP (); Serial.print ("IP:"); Serial.println (localIP); }

MEGAESP_01.ino - setupDS18B20

Initialiser DS18B20 sensoren.

// Inicializa o sensor DS18B20

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

MEGAESP_01.ino - Loop

I Loop kontrollerer vi efter en ny klient. Vi læser anmodningen, og hvis anmodningen ikke er til favicon, udfører vi handlingen med den værdi, der er bestået i anmodningen. Vi læser derefter sensorerne og sender svaret til kunden. Vi bestemmer, hvornår browseren skal modtage dataene og lukke forbindelsen med klienten.

void loop ()

{WiFiEspClient client = server.available (); // Verifica se novo cliente if (klient) {Serial.println ("Novo cliente conectou"); // Faz en questura da requisição char * request = readRequest (klient); // Se en anmodning om at bruge favicon hvis (strstr (anmodning, "favicon") == NULL) {// Executamos ação como valor passado da requisição execute (getAction (request), getValue (request)); // Faz a questura dos sensores readSensorDS18B20 (); readSensorDHT22 (); readSensorLuminosity (); // Envia en Resposta ao cliente sendResponse (klient); // Tempo para o navegador receber os dados delay (100); } // Fecha en conexão com o cliente client.stop (); }}

MEGAESP_01.ino - readRequest

Her har vi en meget vigtig funktion. Hvad gør den? Når vi trykker på en knap på smartphone, sender funktionen kommandoen i HTTP til ESP8266, kun ved hjælp af den første linje, som du ser i eksemplet nedenfor. Jeg understreger, at selv efter at have læst første linie er det vigtigt at læse det til slutningen, ellers giver WiFiESP lib en timeout.

GET /? On = 1 HTTP / 1.1 r n

Værter: 192.168.3.154 r n

Forbindelse: hold i live r n

Cache-Control: max-age = 0 r n

Upgrade-Insecure-Requests: 1 r n

Bruger-agent: Mozilla / 5.0 (Linux; Android 8.0.0; SM-G955F Bygge / R16N) AppleWebKit / 537.36 (KHTML, som Gecko) Chrome / 68.0.3440.91 Mobile Safari / 537.36 r n

Accepter: tekst / html, applikation / xhtml + xml, applikation / xml; q = 0,9, image / webp, billede / apng, * / *; q = 0,8 r n

Referer:

Accept-Encoding: gzip, deflate r n

Accept-Language: en-US, en; q = 0.9 r n

R n

Her har vi læsningen af ​​den første linje i anmodningen.

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

char * readRequest (WiFiEspClient-klient) {bool currentLineIsBlank = true; char request 50; int i = 0; bool firstLine = true; mens (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 ++; }

Vi ser at den sidste linje i anmodningen er: r n alene, r n. Og efter den forrige linje er det: r nso. Hvis vi kommer her, er det fordi anmodningen er blevet læst fuldt ud. Hvis du læser andre tegn end n og r, betyder det også, at linjen ikke er tom.

hvis (c == ' n') {

// En almindelig linha da requisição é um r n sozinho, após o r n da linha anterior if (currentLineIsBlank) {// Se, at du har brug for en anmodning om at blive fuldstændig afbrudt; } currentLineIsBlank = true; firstLine = false; } ellers hvis (c! = ' r') {// Se den kvalificerede karakter, hvis du ikke er interesseret i en bogstaver, der er gyldige currentLineIsBlank = false; }}} returanmodning; }

MEGAESP_01.ino - sendResponse

Denne funktion sender HTML til klienten. Den sender også HTTP-overskriften, samt HTML-overskriften og -kroppen.

// Envia og HTML for klienten

void sendResponse (WiFiEspClient-klient) {// Envia o cabeçalho HTTP client.print ("HTTP / 1.1 200 OK r n" "Indholdstype: tekst / html; charset = UTF-8 r n" Luk r n "" Opdater: 10; URL = / r n "// Para fazer kræver en raiz server en cada 10 segundos" r n "); client.println (""); client.println (""); hoved (klient); // Envia eller cabeçalho gøre HTML body (klient); // Envia o corpo do HTML client.println ("');

}

MEGAESP_01.ino - hoved

Vi sendte CSS'en for at ændre udseendet af siden.

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

tomt hoved (WiFiEspClient klient) {client.println (F ("' ''

''));

}

MEGAESP_01.ino - krop

Vi fortsætter med at vise sensordataene og oprette knapperne for hver stift, der har et relæ.

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

tomrum (WiFiEspClient-klient) {client.println ("DHT22 Temperatur: "+ String (temperaturDHT22) +" ° C "" "" DHT22 Fugtighed: "+ String (luftfugtighedDHT22) +"% "" "); String-knapper =" "; // Cria um botão para cada pino que possui om relê for (int i = 0; i

{

buttons.concat (knap (i));

}

client.println (knapper);

client.println ("');

}

MEGAESP_01.ino - knappen

Vi opretter en knap med udseendet og handlingen, som svarer til relæets aktuelle tilstand.

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

Stringknap (int nummer) {String label = String (nummer + 1); String className = "button"; className + = pinsStatus number == HIGH? "button_on": "button_off"; String action = pinsStatus number == HIGH? "sluk tænd"; Vend tilbage "