Controlar Luzes ( Led’s ) via WIFI ESP8266-01 usando ATmega128

Olá,

Este artigo é sobre as funcionalidades do ESP8266-ESP01, como controlo remoto via android, como usa-lo em AVR com 5V sem grandes esquemas electrónicos.

Quando no video menciona-se que podemos trabalhar em AVR com o ESP8266 sem arduino, é óbvio que estava a exagerar, visto que este dispositivo foi construído e trabalha essencialmente em Arduino, pelas bibliotecas disponíveis e pela forma como é programado.
Ate ao momento desconheço como programar o ESP8266 sem ser no ESPlorer ou no Arduino.

Vamos então ver passo a passo como tudo foi desenvolvido.

Antes de mais convém saber que o ESP8266 possui varias versões, umas mais evoluídas e versáteis do que outras, a mais simples é a versão ESP-01, que vamos falar neste tópico, convém também saber que este dispositivo poderá ser programado de forma a funcionar em standalone, foi nesta funcionalidade que se baseou este projecto.

O que vamos precisar :

Vamos então iniciar a programação do ESP8266-01, para que seja colocado um programa a correr no WIFI apenas precisamos do adaptador serie colocado com o shunt como é explicado neste artigo.  o adaptador é este:

SobreUSB_esp8266-CH340
– Abrimos o IDE do Arduino, e colocamos o seguinte código, conforme a foto anexa.
Arduino IDE

/*************************************************************
Download latest Blynk library here:
https://github.com/blynkkk/blynk-library/releases/latest
*************************************************************
This example runs directly on ESP8266 chip.
* Author : Norlinux
* http://www.microelectronic.pt
* http://maquina.96.lt
* https://www.facebook.com/MundoDosMicrocontroladores/
* Released under GPLv3.
* Please refer to LICENSE file for licensing information.
* which can be found at http://www.gnu.org/licenses/gpl.txt
*************************************************************/
/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
#include
#include
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "ea19945a3db54a";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Norlinux-WIFI";
char pass[] = "my-passwd";
// This function will be called every time Slider Widget
// in Blynk app writes values to the Virtual Pin 1
BLYNK_WRITE(V1)
{
String pinV1 = param.asStr();
Serial.print(pinV1);
}
BLYNK_WRITE(V2)
{
String pinV2 = param.asStr();
Serial.print(pinV2);
}
BLYNK_WRITE(V3)
{
String pinV3 = param.asStr();
Serial.print(pinV3);
}
BLYNK_WRITE(V4)
{
String pinV4 = param.asStr();
Serial.print(pinV4);
}
BLYNK_WRITE(V0)
{
String pinV0 = param.asStr();
Serial.print(pinV0);
}
void setup()
{
// Debug console
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
// You can also specify server:
//Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442);
}
void loop()
{
Blynk.run();
}

Para que o IDE do arduino comunique com o ESP8266 precisamos de efectuar os seguinte passos:
  1. Abrir IDE Arduino.
  2. Ficheiro>Preferenciais, no campo “URL adicionar de Gestor de placas” colocamos estes URL
    -> https://github.com/esp8266/Arduino/releases/download/2.4.0-rc2/package_esp8266com_index.json
    , http://arduino.esp8266.com/stable/package_esp8266com_index.json
    ( 2 URL’s separado por virgula ).
  3. Reiniciar o IDE, ao abrir vamos ao separador Ferramentas->Placa -> Seleccionar “Generic ESP8266 Module”.
  4. Correndo tudo bem com estes passos estamos em condições de programar o Modulo, deste que esteja com o switch/shunt em modo de programação.
  5. Vejam o seguinte video pode ajudar: ( Apenas o que interessa que é seleccionar modulo ESP8266 )
Se tudo correr bem irá fazer o download do programa do IDE do Arduino para o ESP e terá uma mensagem de download 100% como esta.
Programer ESP
E temos o ESP com um programa no seu interior que se ligara a sua rede domestica e comunicara com o software BLYNK que instalaremos no Telemóvel.
No exemplo apresentado seguimos este link  no campo Auth Token (optional): colocamos a referencia que é gerada pelo Blynk quando instalado pelo app, veja mais
 Depois é muito simples configuramos as varias opções que nos aparecem, no exemplo que apresentamos seleccionamos botões do tipo virtual, em que o botão ON/OFF é do tipo SWITCH e os restantes são PUSH.
Vamos precisar também de programar o KIT ATMEGA128 com um programa que leia o ESP8266, como será a comunicação entre Atmega e ESP?
Simples, via comunicação serie, visto que o modulo que foi acima sugerido trabalha com alimentação de 5V, por isso tranquilo na compatibilidade com o KIT atmega 128.
Só precisamos de colocar o programa que Leia o dispositivo WIFI, aqui esta um pequeno exemplo:

/*
* SimpleUART.c
*
* Created: 03-03-2018
* Author : Norlinux
* http://www.microelectronic.pt
* https://www.facebook.com/MundoDosMicrocontroladores/
* Released under GPLv3.
* Please refer to LICENSE file for licensing information.
* which can be found at http://www.gnu.org/licenses/gpl.txt
*/
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include /* Include standard IO library */
#include /* Include string library */
#include /* Include standard library */
#include <avr/sfr_defs.h> /* For the special bits*/
#include "SimpleUART.h"
#include "lcd_lib.h"
/****************** Global variaveis *****************************************/
volatile unsigned char DataReceived;
volatile unsigned char Flag=0;
volatile unsigned int NumberReceived;
void USART_Init_baud(uint16_t ubrr_value)
{
//Set Baud rate
UBRR0L = ubrr_value;
UBRR0H = (ubrr_value>>8);
/*Set Frame Format
>> Asynchronous mode
>> No Parity
>> 1 StopBit
>> char size 8
*/
UART0_STATUS = (1<<U2X0);
UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
UCSR0C = (3<<UCSZ00);
sei();
}
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) );
/* Get and return received data from buffer */
Flag=1;
return UART0_DATA;
}
ESP_Result ESP8266_WIFI(char ValueReceived)
{
int Nr;
char msg[2]={};
sprintf(msg,"%c",DataReceived);
Nr=atoi(msg);
return Nr;
}
ISR(UART0_RECEIVE_INTERRUPT)
{
DataReceived=USART_Receive();
if (Flag)
{
NumberReceived=ESP8266_WIFI(DataReceived);
}
}

Como podem verificar é uma simples comunicação serie TX/RX, entre o ESP8266/ATMEGA128.

Agora segue o código para o atmega 128, ja incluindo as configurações dos LED que irá acender.
O exemplo dos LED é meramente didáctico visto que poderemos a partir daqui colocar o que pretendemos accionar, por exemplo, reles com alimentação 220V para acender aparelhagens ou lampadas.

/*
* ESP8266-BLYNK-V3.c
* Created: 03-03-2018
* Author : Norlinux
* http://www.microelectronic.pt
* http://maquina.96.lt
* https://www.facebook.com/MundoDosMicrocontroladores/
* Released under GPLv3.
* Please refer to LICENSE file for licensing information.
* which can be found at http://www.gnu.org/licenses/gpl.txt
*/
#define F_CPU 8000000UL /* Define CPU Frequency e.g. here its int. 8MHz */
#include
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "SimpleUART.h" /* Include UART header file */
#include "lcd_lib.h" /* Include HD44780 header file */
#define clr_bit(bit) (PORTB&=~(1<<bit))
#define set_bit(bit) (PORTB|=(1<<bit))
#define PORT_OFF DDRB&=~0x1F
#define SwitchOFF PORTB&=~0x1F
const uint8_t Arranque[] PROGMEM="ESP8266-BLYNK"; /*Strings stored in AVR Flash memory*/
int main(void)
{
/* Start LCD 16x2 */
LCDinit();
LCDStringtoLCD(Arranque,0,0);
_delay_ms(6000);
LCDclr();
/* Start USART */
USART_Init_baud(Baud_115200);
while (1)
{
if (Flag)
{
switch (NumberReceived)
{
case espUP:
LCDprintXY("ESP8266 UP ", 1,1);
set_bit(PB1);
Flag=0;
break;
case espDOWN:
LCDprintXY("ESP8266 DOWN ", 1,1);
set_bit(PB2);
Flag=0;
break;
case espRIGHT:
LCDprintXY("ESP8266 RIGHT", 1,1);
set_bit(PB3);
Flag=0;
break;
case espLEFT:
LCDprintXY("ESP8266 LEFT ", 1,1);
set_bit(PB4);
Flag=0;
break;
case espON:
LCDprintXY("ESP8266 ON ", 1,0);
/*Config PORTB*/
DDRB|=0x1F;
set_bit(PB0);
Flag=0;
break;
case espOFF:
LCDprintXY("ESP8266 OFF", 1,0);
PORT_OFF;
SwitchOFF;
Flag=0;
break;
case espRELEASE:
PORTB&=~(_BV(PB1)|_BV(PB2)|_BV(PB3)|_BV(PB4));
Flag=0;
break;
}
}
}
}

O trabalho final é demonstrado neste video, já sabem o código do projecto é sempre a pedido no site, visto que ainda esta em versão BETA.

Em breve retomamos outros projectos sempre em AVR ATMEGA128…

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s