PIC18F4431 y ESP8266

Que tal, estoy tratando de establecer comunicación desde una PC al Pic usando el modulo ESP8266

Ya tengo el enlace establecido, solo que al mandar un dato (espero prender un led para saber que funciono ) no hace nada. En el modulo ESP8266 veo el led indicador de que si recibe el dato pero no enciende el led.

Primero pensé que no interpretaba bien los datos, pero en proteus funciona bien

Espero que alguien me pueda orientar..... :confused:

Dejo el codigo del Pic y adjunto el proyecto de Proteus

Tengo varias lineas comentadas por los experimentos que estuve haciendo :eek:pss:

Código:
#include <18f4431.h>
#device PASS_STRINGS=IN_RAM
#include <string.h>
//#include <esp8266.h>
//#include <stdint.h>

#use delay(internal=8M)

//#use delay(clock=4000000)


//#fuses HS,PUT,NOPROTECT
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG

//#use RS232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stop=1)
#use RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stop=1)
//#use RS232(uart1,baud=9600)


// -> CONSTANTES <-/////////////////////////////////////////////////////////////
   int const lenbuff=80; // Longitud de buffer

// -> VARIABLES <-//////////////////////////////////////////////////////////////
   int xbuff=0;      // Índice: siguiente char en cbuff
   char cbuff[lenbuff]; // Buffer
   char rcvchar=0x00;   // último carácter recibido
   int1 flagcommand=0;  // Flag para indicar posible comando disponible
   int1 flagrealcommand=0;  // Flag para indicar comando disponible

// -> FUNCIONES <-//////////////////////////////////////////////////////////////
   void inicbuff(void);        // Borra buffer
   void addcbuff(char c);       // añade carácter recibido al buffer
   void echos(char c);         // Eco selectivo sobre RS232
   void procesa_comando(void); // Procesa comando*/
   void configura_wifi(void);  // Configuracion de Modulo ESP8266

  // char Keypress=' ';

// -> INTERRUPCIONES <-/////////////////////////////////////////////////////////
#int_rda
void rd_isr(void)   //Función de recepción de datos USART
   {
    // output_high(pin_a1);
     rcvchar=0x00;         // Inicializo carácter recibido
      if(kbhit())        // Si hay algo pendiente de recibir ...
      {
         rcvchar=getc();       // lo descargo y ...
         addcbuff(rcvchar);    // lo añado al buffer y ...
         putchar(rcvchar);
         //rcvchar=0x00;
        // echos(rcvchar);       // hago eco (si procede).
      }
   }

// -> PROGRAMA PRINCIPAL <-/////////////////////////////////////////////////////
void main()    // TODO: USER CODE!!
{

   inicbuff();   //Borra buffer de USART

   enable_interrupts(int_rda); // Habilita Interrupción RDA
   enable_interrupts(global);  // Habilita interrupciones

   configura_wifi();

   //inicbuff();

   while(true)
   {
     if(flagcommand)
     {
        //output_high(pin_a1);
        procesa_comando();
     }
      output_high(pin_a0);
      delay_ms(800);
      output_low(pin_a0);
      delay_ms(800);
   }
}
// -> CUERPO DE FUNCIONES <-////////////////////////////////////////////////////

void configura_wifi(void)
{
   puts("AT+CWMODE=3");
   delay_ms(300);
   puts("AT+CIPMUX=1");
   delay_ms(300);
   puts("AT+CIPSERVER=1,80");
   delay_ms(300);
   puts("AT+CWQA");
   delay_ms(300);
   puts("AT+CWJAP=\"dfgr\",\"54321\"");
   delay_ms(300);
   puts("AT+CIFSR");
   delay_ms(300);
   //puts("AT+UART_CUR=240,8,1,0,3");
   //delay_ms(300);
}

void addcbuff(char c) // Añade a cbuff -----------------------
{
  switch(c)
  {
    case 0x0D:// Enter -> Habilita Flag para procesar
    {
         //output_high(pin_a2);
       //  cbuff[xbuff++]=c;
        flagcommand=1;     // Comando en Main
        break;
    }
    case 0x08:                    // Del   -> Borra último caracter del Buffer
    {
            if(xbuff>0) cbuff[--xbuff]=0x00;
            break;
    }
    default:
    {
       cbuff[xbuff++]=c; // Añade carácter recibido al Buffer
    }
  }
}

void inicbuff(void) // Inicia a \0 cbuff -------------------
{
  int i;
  for(i=0;i<lenbuff;i++)   // Bucle que pone a 0 todos los
  {
     cbuff[i]=0x00;          // caracteres en el buffer
  }
  xbuff=0x00;               // Inicializo el índice de siguiente carácter
}

void procesa_comando(void)
{
   int i=0,i2=0;
   char arg[lenbuff]=""; // Argumento de comando (si lo tiene)
   disable_interrupts(int_rda);

   flagcommand=0; // Desactivo flag de comando pendiente.
   for(i=0;i<lenbuff;i++) // Bucle que pone a 0 todos los
   {
      //arg[i]=0x00; // caracteres en el argumento
      //putchar(arg[i]);
      if(cbuff[i]=='<')
      {
         i++;
         while(cbuff[i]!='>' & (i<lenbuff))
         {
            arg[i2++]=cbuff[i++];
         }
      }
   }
//   if(flagrealcommand==0)
//   {
//      return;
//   }
   puts(arg);  // Monitorizamos el argumento.
   if(strcmp(arg,"p")==0)
   {
      output_high(pin_a2);
   }
   if(strcmp(arg,"o")==0)
   {
      output_low(pin_a2);
   }
   inicbuff(); // Borro buffer.
   enable_interrupts(int_rda);
}
 

Adjuntos

  • 1.zip
    48.4 KB · Visitas: 6
Hola buenas tardes,
no se si te sera de ayuda, pero existen unos modulos sonoff con el micro ESP8266, la gran ventaja es que son baratos ( cuestan 5$ ) se pueden programar y ponerlos a funcionar como servidor web, mqtt, domoticz ya que llevan una memoria flash de 8 mbits.
Es un modulo wifi muy versatil e interesante, lleva un rele a 5V y te comunicas via wifi, incluso le puedes enviar comandos por http.
Te dejo varios enlaces por si fuera de tu interes :
Modulo sonoff --> https://www.itead.cc/sonoff-wifi-wireless-switch.html
Proyecto de Teo Arendst en github --> https://github.com/arendst/Sonoff-Tasmota/releases

Saludos
 

Adjuntos

  • 2aerea.jpg
    2aerea.jpg
    94.5 KB · Visitas: 12
  • 3inferior.jpg
    3inferior.jpg
    105.4 KB · Visitas: 10
Wolaaa! Si tu proyecto no es con fines didácticos quizás te sea más útil emplear el Node-MCU el cual es el mismo ESP-8266 pero con mas pines GPIO y un ADC que se puede programar directamente como si de un Arduino se tratara. Este módulo combina la versatilidad de un Arduino y las caracteristicas de un ESP8266. Se consiguen facilmente por 5 euros.

Por otro lado, ¿a qué servidor te estás conectando? Yo te recomiendo que para empezar emplees ThingSpeak el cual es un API de IOT que permite conectarse desde un ESP8266 de manera fiable. Así te puedes asegurar que lo que falla no es tu codigo.

Por último, si lo deseas tengo un video en youtube donde enseño a conectar un arduino a través de comandos AT con un ESP a Twitter empleando ThingSpeak. Puede serte útil ya que los comandos que se envian y el modo de hacerlo sirve para un PIC también.
 
Arriba