Hace poco compré un ESP-01 para un proyecto simple de wi-fi que lee la temática de un sitio web.
Primero conecté el ESP-01 directamente en el convertidor TTL (cp2102) para leer la temperatura y todo funcionó bien a 9600 bps con los comandos AT, etc.
Luego creé un programa con winAVR para que el mega32 hiciera lo mismo usando uart a 9600 bps (UBRRL = 0x68; (o 104) para Fosc = 16MHz) pero no funcionó.
Así que utilicé un analizador lógico para comprobar qué funcionó mal con los caracteres que envié.
El resultado fue muy extraño ya que algunos de los caracteres (de los comandos AT enviados) que van desde mega32 (Tx) a ESP-01 (Rx) no se transmiten correctamente.
Intenté reducir la velocidad de transmisión del ESP-01 a 4800, pero la velocidad más baja es de 9600. No sé si alguna versión de firmware tiene la opción de una velocidad de transmisión inferior.
Por alguna razón, mega32 no puede transmitir con precisión todos los caracteres y no puedo entender por qué sucede esto. Tal vez tenga algo que ver con el cristal, pero cuando lo cambié, sucedió lo mismo. Puse un poco de retraso antes de los caracteres defectuosos que solucionaron algunos, pero no todos (1 o 2 de cada 10+) (mal método, lo sé).
También mi i ha conectado mi pin Tx (mega 32) a un divisor de voltaje para convertirlo a 3.3v para el pin Rx del ESP-01.
Después de muchas dificultades decidí pedir ayuda.
Adjunté mi código y una instantánea del analizador lógico para el comando AT AT + CIPSTART = 0, "TCP", "api.thingspeak.com", 80 (el dañado). Los otros dos comandos AT que utilizo en el código antes de que CIPSTART se transmitan casi ... bien (el '\ r' o '\ n' no se transmiten correctamente, pero de alguna manera el ESP-01 acepta los comandos).
El código completo se puede ver a continuación
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "LCD4BIT.h"
#include <stdlib.h>
#include <stdio.h>
unsigned char interface_var = 0;
unsigned char counter[34];
unsigned char var = 0;
void usart_init(void)
{
UCSRB |= (1<<TXEN) | (1<<RXEN) | (1<<RXCIE) ; // enable receive transmit of usart
UCSRC = (1<<UCSZ1) | (1<<UCSZ0) | (1<<URSEL);
UBRRL = 0x68; // baudrate = 9600 , Fosc=16MHz, UBRR value = 104 (0x68)
}
void usart_send( unsigned char ascii)
{
while(!(UCSRA & (1<<UDRE)));
UDR = ascii;
}
unsigned char usart_receive(void)
{
while (!(UCSRA & (1<<RXC)));
return UDR;
}
void send_AT( unsigned char message[])
{
unsigned char i=0;
while(message[i] != '#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "LCD4BIT.h"
#include <stdlib.h>
#include <stdio.h>
unsigned char interface_var = 0;
unsigned char counter[34];
unsigned char var = 0;
void usart_init(void)
{
UCSRB |= (1<<TXEN) | (1<<RXEN) | (1<<RXCIE) ; // enable receive transmit of usart
UCSRC = (1<<UCSZ1) | (1<<UCSZ0) | (1<<URSEL);
UBRRL = 0x68; // baudrate = 9600 , Fosc=16MHz, UBRR value = 104 (0x68)
}
void usart_send( unsigned char ascii)
{
while(!(UCSRA & (1<<UDRE)));
UDR = ascii;
}
unsigned char usart_receive(void)
{
while (!(UCSRA & (1<<RXC)));
return UDR;
}
void send_AT( unsigned char message[])
{
unsigned char i=0;
while(message[i] != '%pre%')
{
usart_send(message[i]); // This sends data to esp-01
i++;
}
int main(void)
{
//OSCCAL = 0xA9;
unsigned char AT[] = "AT\r\n";
unsigned char CIPMUX[] = "AT+CIPMUX=1\r\n";
unsigned char CIPSTART[] = "AT+CIPSTART=0,\"TCP\",\"api.thingspeak.com\",80\r\n";
unsigned char CIPSEND[] = "AT+CIPSEND=0,110\r\n";
unsigned char GET_DATA[] = "GET https://api.thingspeak.com/apps/thinghttp/send_request?api_key=xxxxxxxxxxxxxxxx\r\n";
unsigned char SEND_DATA[] = "GET https://api.thingspeak.com/update?api_key=xxxxxxxxxxxxxxxxxxxxxxx=50\r\n";
//_delay_ms(200);
LCD_init(); // intitialize LCD
usart_init(); // initialize usart
_delay_ms(500);
sei();
_delay_ms(200);
send_AT(AT);
_delay_ms(2000);
send_AT(CIPMUX);
_delay_ms(2000);
send_AT(CIPSTART);
while(1)
{
}//while(1) close
}// main close
ISR(USART_RXC_vect) // Every time an AT command is sent correctly type OK on the LCD (Logic analyzer works better though :-p)
{
unsigned char a = 0;
//LCD_data(a);
a = UDR;
if(a == 'O')
{LCD_data('O');}
if(a == 'K')
{LCD_data('K');}
if(a == 'd')
{LCD_data('d');}
if(a == 'L')
{LCD_data('L');}
}
')
{
usart_send(message[i]); // This sends data to esp-01
i++;
}
int main(void)
{
//OSCCAL = 0xA9;
unsigned char AT[] = "AT\r\n";
unsigned char CIPMUX[] = "AT+CIPMUX=1\r\n";
unsigned char CIPSTART[] = "AT+CIPSTART=0,\"TCP\",\"api.thingspeak.com\",80\r\n";
unsigned char CIPSEND[] = "AT+CIPSEND=0,110\r\n";
unsigned char GET_DATA[] = "GET https://api.thingspeak.com/apps/thinghttp/send_request?api_key=xxxxxxxxxxxxxxxx\r\n";
unsigned char SEND_DATA[] = "GET https://api.thingspeak.com/update?api_key=xxxxxxxxxxxxxxxxxxxxxxx=50\r\n";
//_delay_ms(200);
LCD_init(); // intitialize LCD
usart_init(); // initialize usart
_delay_ms(500);
sei();
_delay_ms(200);
send_AT(AT);
_delay_ms(2000);
send_AT(CIPMUX);
_delay_ms(2000);
send_AT(CIPSTART);
while(1)
{
}//while(1) close
}// main close
ISR(USART_RXC_vect) // Every time an AT command is sent correctly type OK on the LCD (Logic analyzer works better though :-p)
{
unsigned char a = 0;
//LCD_data(a);
a = UDR;
if(a == 'O')
{LCD_data('O');}
if(a == 'K')
{LCD_data('K');}
if(a == 'd')
{LCD_data('d');}
if(a == 'L')
{LCD_data('L');}
}