В данной статье мы рассмотрим подключение WiFi модуля ESP8266 к микроконтроллеру PIC16F877A, что позволит нашему микроконтроллеру PIC иметь доступ в сеть интернет и, соответственно, позволяет его использовать в различных проектах интернета вещей (IoT).
Модуль ESP8266 поставляется с завода со встроенным в него программным обеспечением, поэтому в нашем проекте мы можем управлять его работой с использованием AT команд. Эти команды мы будем подавать на модуль ESP8266 по последовательному каналу связи, для чего задействуем модуль USART (модуль универсального синхронного/асинхронного приёмопередатчика) микроконтроллера PIC. Результаты работы проекта мы будем отображать на экране ЖК дисплея 16х2. Соответственно, для успешного понимания материала данной статьи вам необходимо знать основы работы с модулем USART в микроконтроллере PIC, подключения к микроконтроллеру PIC ЖК дисплея 16х2 и основы использования AT команд в модуле ESP8266.
Ранее на нашем сайте мы рассматривали подключение WiFi модуля ESP8266 к следующим микроконтроллерам (платам):
- к микроконтроллеру AVR;
- к плате Arduino;
- к плате STM32F103C8;
- к макетной плате MSP430;
- к плате Raspberry Pi Pico.
Необходимые компоненты
- Микроконтроллер PIC16F877A (купить на AliExpress).
- Держатель микросхем на 40 контактов (купить на AliExpress).
- Программатор PICkit 3 (купить на AliExpress).
- Кварцевый генератор 20 МГц (купить на AliExpress).
- Регулятор напряжения 7805 (купить на AliExpress).
- Регулятор напряжения LM317 (купить на AliExpress).
- Модуль ESP8266 (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Резисторы 1 кОм, 220 Ом, 360 Ом (купить на AliExpress).
- Конденсаторы 1 мкФ, 0,1 мкФ, 33 пФ (купить на AliExpress).
- Перфорированная плата и соединительные провода.
- Адаптер 12V для питания микроконтроллера PIC и модуля ESP8266.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема подключения WiFi модуля ESP8266 к микроконтроллеру PIC16F877A представлена на следующем рисунке.
В схеме используется два регулятора напряжения, один из них (7805) обеспечивает напряжением питания +5V микроконтроллер PIC и ЖК дисплей, а второй (LM317) – подает напряжение питания 3.3V на модуль ESP8266. Учтите, что модуль ESP8266 потребляет достаточно большой ток (~800mA), поэтому при проектировании схем с его использованием убедитесь что источник питания может обеспечить такой ток. Также убедитесь в том, что контакты общего провода (ground pins) микроконтроллера PIC и модуля ESP8266 соединены вместе.
Поскольку микроконтроллер PIC питается от +5V, а модуль ESP8266 – от 3.3V, то для установления между ними последовательной связи необходим преобразователь напряжения, который представляет собой не что иное, как делитель напряжения, который преобразует поступающее напряжение 5V в напряжение 3.3V на своем выходе. Он защищает чувствительный к напряжению 3.3V контакт RX модуля ESP8266 от попадания на него напряжения +5V.
Автор проекта (ссылка на оригинал приведена в конце статьи) собрал схемы с микроконтроллером PIC и модулем ESP8266 на двух отдельных перфорированных платах, что позволяет их потом использовать по отдельности в других проектах.
При желании вы можете собрать конструкцию проекта на макетной плате.
Написание программы для микроконтроллера PIC
Для передачи с микроконтроллера PIC на модуль ESP8266 AT команд через последовательный порт связи (USART) мы будем использовать специальную библиотеку. Данная библиотека сэкономит вам кучу времени по сравнению с тем, если бы вы все эти операции программировали вручную. Первоначально данная библиотека была разработана энтузиастом Camil Staps и затем улучшена авторами портала Circuit Digest. Вы можете скачать эту библиотеку по следующей ссылке.
Библиотека содержит не все известные AT команды (а их весьма много) и продолжает совершенствоваться, но для нашего проекта ее возможностей вполне хватит. Также вы самостоятельно можете добавить в эту библиотеку функции, которых вам не хватает.
Функции в библиотеке для работы с модулем ESP8266:
Initialize_ESP8266(): инициализирует последовательный порт микроконтроллера PIC для взаимодействия с модулем ESP8266. Она устанавливает скорость передачи равную 115200 бод и подготавливает контакты Rx и Tx микроконтроллера PIC для последовательной связи.
_esp8266_putch(): данная функция используется для последовательной передачи одного символа в модуль ESP8266. Например, _esp8266_putch(‘a’) передаст символ ‘a’ последовательно на модуль ESP8266.
_esp8266_getch(): данная функция используется для приема одиночного символа от модуля ESP. К примеру, если модуль ESP передает “OK” и мы используем a =_esp8266_getch(), то символ ‘o’ будет сохранен в переменной a.
ESP8266_send_string(): функция, которая позволяет передать на модуль ESP8266 строку символов. Например, функция ESP8266_send_string(“AT/r/n”) передаст соответствующую AT команду на модуль ESP8266.
esp8266_isStarted(): данная функция используется для проверки того, может ли микроконтроллер PIC взаимодействовать с модулем ESP8266. Она передает на модуль соответствующую AT команду и ждет приема ответа “OK”. Если она его принимает, то функция возвращает значение true, если не принимает – то она возвращает значение false.
esp8266_restart(): сбрасывает модуль ESP8266 и возвращает true если сброс прошел успешно. Если сброс прошел не успешно, она возвращает false.
esp8266_mode(): используется для установки режима работы модуля ESP8266. Возможны следующие режимы работы модуля:
esp8266_mode(1): | Station mode (станция) |
esp8266_mode(2): | Soft AP mode (точка доступа) |
esp8266_mode(3): | Both Station and AP mode (станция и точка доступа) |
esp8266_connect(): позволяет подключиться к сигналу wifi. Например, esp8266_connect(“home”,”12345678”) позволяет подключиться к WiFi сети с именем “home” и паролем ”12345678”.
esp8266_disconnect(): отключает модуль ESP8266 от любой WiFi сети, к которой вы были до этого соединены.
esp8266_ip(): определяет IP адрес модуля ESP8266 и возвращает его.
esp8266_start(): данная функция используется для начала TCP или UDP соединения. Например, esp8266_start("TCP", "192.168.101.110", 80) начнет TCP соединение по указанному IP адресу и порту 80.
esp8266_send(): используется для передачи информации сети TCP/UDP. С помощью данной команды передается HTML скрипт по IP адресу установленного соединения.
esp8266_config_softAP(): используется для настройки программной точки доступа (softAP). Например, esp8266_config_softAP(“office”,”12345678”) создаст точку доступа с именем office и паролем для доступа к ней 12345678.
esp8266_get_stationIP(): в качестве результата функция возвращает IP/MAC адреса клиентов, которые подключены к нашей точке доступа.
Пример программы
Для лучшего понимания рассмотренной библиотеки для работы с модулем ESP8266 рассмотрим небольшую программу, которая будет проверять возможность соединения между модулем ESP8266 и микроконтроллером PIC и если оно возможно, то она будет создавать WiFi точку доступа с заданными именем и паролем доступа к ней. Полный код программы приведен в конце статьи, здесь же мы рассмотрим ее небольшие фрагменты.
Перед началом ознакомления с данной программой рекомендуем прочитать статьи про подключение к микроконтроллеру PIC ЖК дисплея 16х2 и настройку в нем модуля USART (для последовательной связи).
Следующий фрагмент кода программы проверяет все ли работает нормально и показывает на экране ЖК дисплея приветственное сообщение.
1 2 3 4 5 6 7 8 9 |
do { Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP not found"); }while (!esp8266_isStarted()); //wait till the ESP send back "OK" Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP is connected"); __delay_ms(1500); Lcd_Clear(); |
Когда мы передаем команду “AT” модуль ESP8266 должен ответить нам “OK”, что будет свидетельствовать о том, что мы успешно подключились к модулю ESP8266. Если мы получили от модуля ответ “OK” мы выводим на экран ЖК дисплея сообщение “ESP is connected”.
1 2 3 4 5 |
esp8266_mode(2); Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP set as AP"); __delay_ms(1500); Lcd_Clear(); |
Следующие строки кода используются для установки в модуле ESP8266 режима работы “soft AP”. Функция esp8266_mode(2) передает на модуль AT команду “AT+CWMODE=3” и ждет когда модуль ответит на нее “OK”.
1 2 3 4 5 6 7 |
/*Configure the AP name and Password*/ esp8266_config_softAP("CircuitDigest","619007123"); Lcd_Set_Cursor(1,1); Lcd_Print_String("AP configured"); __delay_ms(1500); Lcd_Clear(); /*AP configured*/ |
SSID создаваемой нами WiFi точки доступа будет “CircuitDigest”, а пароль для доступа к ней – “619007123”. Когда WiFi точка доступа будет успешно создана мы покажем на экране ЖК дисплея сообщение "AP configured".
Моделирование работы проекта
Для моделирования работы проекта его авторы использовали симулятор Proteus. Поскольку в данном симуляторе нет библиотеки для работы с модулем ESP8266, то они моделировали работу по последовательному каналу межу микроконтроллером PIC и модулем ESP8266. Внешний вид смоделированной в Proteus схемы проекта приведен на следующем рисунке.
Выходные данные проекта отображаются в окне виртуального терминала (Virtual terminal).
Тестирование работы проекта
После сборки схемы проекта в реальном "железе" и загрузки программы в микроконтроллер PIC можно приступать к тестированию его работы. Контроль результатов работы проекта можно осуществлять по информации, выводимой на экран ЖК дисплея.
После того как на ЖК дисплее появится сообщение о том, что точка доступа WiFi настроена (AP is configured) мы можем проверить ее работу с помощью смартфона или ноутбука.
Как только мы увидели в списке WiFi сетей нашу сеть это будет означать, что мы успешно подключили модуль ESP8266 к микроконтроллеру PIC и настроили его работу в качестве точки доступа.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Добавление функций в библиотеку для модуля ESP8266
Вы можете добавить собственную функцию в библиотеку для модуля ESP8266, которая будет передавать на модуль ту AT команду, которая вам нужна. Для этого вам необходимо изучить документацию на модуль ESP8266. Вы можете непосредственным образом передавать на модуль AT команду, которую вы найдете в инструкции. Но не забывайте добавлять символы “/r/n” в конце каждой AT команды. Например, вы хотите установить множественные соединения с помощью модуля ESP8266. Посмотрев документацию на модуль вы найдете что это можно сделать с помощью команды “AT+CIPMUX=1”.
Теперь вам необходимо передать эту команду “AP+CIPMUX=1” на модуль ESP8266 через последовательный порт. Это можно сделать с помощью команды
_esp8266_print("AT+CIPMUX=1\r\n"")
Это сработает, но это не самый лучший способ выполнить данную задачу. Модуль ESP8266 будет отвечать на ваши команды и в этом случае он ответит вам сообщением “OK”. Поэтому вам необходимо будет считать эти переданные модулем ESP8266 данные и убедиться в том, что модуль передал вам сообщение “OK”.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
#define _XTAL_FREQ 20000000 #define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7 #include <xc.h> #include "esp8266_functions.h" #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT enabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) //****LCD Functions Developed by Circuit Digest.***/// void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines { if(data_bit& 1) D4 = 1; else D4 = 0; if(data_bit& 2) D5 = 1; else D5 = 0; if(data_bit& 4) D6 = 1; else D6 = 0; if(data_bit& 8) D7 = 1; else D7 = 0; } void Lcd_Cmd(char a) { RS = 0; Lcd_SetBit(a); //Incoming Hex value EN = 1; __delay_ms(4); EN = 0; } Lcd_Clear() { Lcd_Cmd(0); //очищаем экран ЖК дисплея Lcd_Cmd(1); //перемещаем курсор на 1-ю позицию } void Lcd_Set_Cursor(char a, char b) { char temp,z,y; if(a== 1) { temp = 0x80 + b - 1; //80H используется для передвижения курсора z = temp>>4; // младшие 8 бит y = temp & 0x0F; // старшие 8 бит Lcd_Cmd(z); // устанавливаем строку Lcd_Cmd(y); // устанавливаем столбец } else if(a== 2) { temp = 0xC0 + b - 1; z = temp>>4; // младшие 8 бит y = temp & 0x0F; // старшие 8 бит Lcd_Cmd(z); // устанавливаем строку Lcd_Cmd(y); // устанавливаем столбец } } void Lcd_Start() { Lcd_SetBit(0x00); for(int i=1065244; i<=0; i--) NOP(); Lcd_Cmd(0x03); __delay_ms(5); Lcd_Cmd(0x03); __delay_ms(11); Lcd_Cmd(0x03); Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD Lcd_Cmd(0x08); //выбираем строку 1 Lcd_Cmd(0x00); //очищаем строку 1 Lcd_Cmd(0x0C); // выбираем строку 2 Lcd_Cmd(0x00); // очищаем строку 2 Lcd_Cmd(0x06); } void Lcd_Print_Char(char data) // передаем 8 бит в 4-битном режиме { char Lower_Nibble,Upper_Nibble; Lower_Nibble = data&0x0F; Upper_Nibble = data&0xF0; RS = 1; // => RS = 1 Lcd_SetBit(Upper_Nibble>>4); //Send upper half by shifting by 4 EN = 1; for(int i=2130483; i<=0; i--) NOP(); EN = 0; Lcd_SetBit(Lower_Nibble); //Send Lower half EN = 1; for(int i=2130483; i<=0; i--) NOP(); EN = 0; } void Lcd_Print_String(char *a) { int i; for(i=0;a[i]!='\0';i++) Lcd_Print_Char(a[i]); //разделяем строку на символы с помощью указателей и по очереди передаем каждый символ } //***End of LCD functions***// void main() { TRISD = 0x00; Lcd_Start(); Initialize_ESP8266() ; Lcd_Set_Cursor(1,1); Lcd_Print_String("Circuit Digest"); Lcd_Set_Cursor(2,1); Lcd_Print_String("ESP5266 with PIC"); __delay_ms(1500); Lcd_Clear(); /*Check if the ESP_PIC communication is successful*/ do { Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP not found"); }while (!esp8266_isStarted()); // ждем пока модуль ESP не передаст нам ответ "OK" Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP is connected"); __delay_ms(1500); Lcd_Clear(); /*Yes ESP communication successful*/ /*настраиваем для модуля режим точки доступа (Soft AP mode)*/ esp8266_mode(2); Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP set as AP"); __delay_ms(1500); Lcd_Clear(); /*Module set as AP */ /*Configure the AP name and Password*/ esp8266_config_softAP("CircuitDigest","619007123"); Lcd_Set_Cursor(1,1); Lcd_Print_String("AP configured"); __delay_ms(1500); /*AP configured*/ while(1) { //do nothing } } |