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:

USB_esp8266-CH340

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

Arduino IDE
ESP8266-ESP01 Standalone
/*************************************************************
  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
* 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 <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// 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
/*
 * 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 <stdio.h>					    /* Include standard IO library */
#include <string.h>					    /* Include string library */
#include <stdlib.h>					    /* 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.

main.c
/*
 * ESP8266-BLYNK-V3.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
 */

#define F_CPU 8000000UL								/* Define CPU Frequency e.g. here its int. 8MHz */
#include <inttypes.h>
#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 uma resposta

Your email address will not be published.

www.000webhost.com