В современном мире, когда все больше устройств подключается к Интернету, необходимость в модулях GSM/GPRS стала очевидной. Одним из таких модулей является SIM800L, который позволяет Arduino взаимодействовать с сетью GSM и GPRS. В этой статье мы рассмотрим подключение модуля SIM800L к Arduino Uno, его основные характеристики, а также примеры использования.
Модуль SIM800L – это миниатюрный GSM-модем, который можно использовать в различных проектах IoT. С его помощью можно выполнить практически все, что может делать обычный сотовый телефон, такие как отправка SMS-сообщений, совершение телефонных звонков, подключение к Интернету через GPRS. Кроме того, модуль поддерживает сети GSM/GPRS в 4 полосах, что означает, что он будет работать практически в любой части мира.
Arduino Uno – это одна из самых популярных плат разработки, используемых для прототипирования и создания разнообразных проектов. Её основные характеристики и достоинства включают:
- Микроконтроллер ATmega328P: Arduino Uno оснащена микроконтроллером ATmega328P, который обладает достаточной производительностью для большинства проектов.
- Многочисленные цифровые и аналоговые входы/выходы: Плата имеет разнообразные порты для подключения датчиков, актуаторов и других устройств.
- Простое программирование: Arduino IDE предоставляет удобную среду для написания и загрузки кода на плату.
- Активное сообщество: Arduino имеет большое сообщество разработчиков и обширную базу знаний.
Схема подключения
Подключение модуля SIM800L к Arduino Uno осуществляется следующим образом:
SIM800L | Arduino Uno |
---|---|
VCC | 5V |
GND | GND |
TXD | Пин 3 |
RXD | Пин 2 |
Опционально к модулю можно подключить микрофон и динамик для совершения голосовых вызовов.
Обратите внимание, что уровень логической единицы на модуле SIM800L равен 3.3 В, поэтому для подключения пина RXD к Arduino, необходимо использовать делитель напряжения. Для этого вам понадобятся резисторы на 10 кОм и 20 кОм.
Настройка модуля
Для настройки модуля мы будем использовать AT-команды. Вот как это делается:
- Подключите модуль к Arduino.
- Загрузите следующий скетч на Arduino:
12345678910111213141516171819202122#include <SoftwareSerial.h>SoftwareSerial sim800(3, 2); // RX, TXvoid setup() {Serial.begin(9600); // Инициализируем последовательное соединение для монитора порта.sim800.begin(38400); // Инициализируем программное последовательное соединение для GSM модуля на скорости 38400.}void loop() {// Ожидаем, пока данные появятся на мониторе порта.if (Serial.available()) {char data = Serial.read(); // Читаем символ из монитора порта.sim800.print(data); // Отправляем символ на GSM модуль.}// Ожидаем и выводим ответ от GSM модуля.if (sim800.available()) {char data = sim800.read(); // Читаем символ из GSM модуля.Serial.print(data); // Выводим символ в монитор порта.}} - Откройте монитор порта. Теперь вы можете отправлять AT-команды, которые будут передаваться на GSM модуль, и ответы от модуля будут отображаться в мониторе порта. Попробуйте отправить на модуль команду
AT
, если все подключено правильно, модуль должен ответитьOK
.
Настройка модуля для выхода в Интернет:
AT+CPIN?
Проверка состояния SIM-карты. Если модуль готов к работе, он должен ответитьREADY
.AT+CREG?
Проверка регистрации в сети. Если модуль зарегистрирован в сети, он должен ответить1
.AT+CGATT?
Активация GPRS. Если GPRS активирован, он должен ответить1
.AT+CIICR
Подключение к Интернету.AT+CIFSR
Получение IP-адреса. Модуль должен вернуть свой IP-адрес.- Тестирование подключения к Интернету. Используйте команду
AT+CIPSTART
, чтобы начать сессию TCP/IP. Затем используйте командуAT+CIPSEND
для отправки HTTP-запроса на сервер. Наконец, используйте командуAT+CIPCLOSE
для закрытия сессии TCP/IP.
AT+CIPSTART=\"TCP\",\"www.google.com\",80
AT+CIPSEND
GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n
AT+CIPCLOSE
Пример кода
Строго говоря, модуль SIM800L не предназначен для работы в режиме сервера, однако, можно использовать его для создания простого HTTP-сервера, который будет отвечать на HTTP-запросы для управления светодиодом, встроенным в Arduino Uno. Вот пример кода, который демонстрирует, как это можно сделать:
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 |
#include <SoftwareSerial.h> SoftwareSerial sim800l(3, 2); // RX, TX // Определение пина для светодиода #define LED_PIN 13 void setup() { // Начало серийной коммуникации с Arduino и Arduino IDE (Serial Monitor) Serial.begin(9600); // Начало серийной коммуникации с SIM800L sim800l.begin(9600); // Инициализация модуля SIM800L sim800l.println("AT"); delay(1000); sim800l.println("AT+CGATT?"); // Подключение GPRS-сервиса delay(1000); sim800l.println("AT+CIICR"); // Установка беспроводного соединения с GPRS delay(1000); sim800l.println("AT+CIFSR"); // Получение локального IP-адреса delay(1000); sim800l.println("AT+CIPMUX=0"); // Запуск многозадачного IP-соединения delay(1000); sim800l.println("AT+CIPSERVER=1,80"); // Конфигурация модуля как сервера delay(1000); // Инициализация пина для светодиода pinMode(LED_PIN, OUTPUT); } void loop() { if (sim800l.available()) { String data = sim800l.readString(); Serial.println(data); // Проверка наличия запроса на включение светодиода if (data.indexOf("GET /ledon") != -1) { digitalWrite(LED_PIN, HIGH); sim800l.println("AT+CIPSEND=0,18"); delay(1000); sim800l.println("HTTP/1.1 200 OK\r\n\r\nLED is ON"); delay(1000); sim800l.println("AT+CIPCLOSE=0"); delay(1000); } // Проверка наличия запроса на выключение светодиода if (data.indexOf("GET /ledoff") != -1) { digitalWrite(LED_PIN, LOW); sim800l.println("AT+CIPSEND=0,19"); delay(1000); sim800l.println("HTTP/1.1 200 OK\r\n\r\nLED is OFF"); delay(1000); sim800l.println("AT+CIPCLOSE=0"); delay(1000); } // Проверка наличия запроса на получение состояния светодиода if (data.indexOf("GET /ledstate") != -1) { String state = digitalRead(LED_PIN) == HIGH ? "ON" : "OFF"; sim800l.println("AT+CIPSEND=0,23"); delay(1000); sim800l.println("HTTP/1.1 200 OK\r\n\r\nLED state is " + state); delay(1000); sim800l.println("AT+CIPCLOSE=0"); delay(1000); } } } |