Блог

● Проект 30: Беспроводная связь. Модуль Wi-Fi ESP8266

Опубликовано: 23.04.2018
В этом эксперименте мы познакомимся с модулем ESP8266, с помощью которого можно подключить плату Arduino к сетям Wi-Fi, и напишем скетч для передачи данных датчика температуры на веб-сервис Народный мониторинг.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
модуль ESP8266 ESP-01;
• датчик температуры LM335;
резистор 2,2 кОм;
провода папа-папа.
блок питания +5 в 1 А;
• преобразователь напряжения 3–30 В.

После своего появления платы на базе Wifi чипа ESP8266 стали по-настоящему народными. Огромные возможности и минимальная цена сделали свое дело. Платы на ESP8266 – это не просто модули для связи по Wi-Fi. Чип, по сути, является микроконтроллером со своими интерфейсами SPI, UART, а также портами GPIO, а это значит, что модуль можно использовать автономно без Arduino и других плат с микроконтроллерами. Существует около 11 официальных модификаций платы. В нашем распоряжении самая простая плата – ESP01. Распиновка платы показана на рис. 30.1. Покажем, как использовать ее в качестве Wi-Fi модуля для Arduino.
Распиновка модуля ESP-01
Рис. 30.1. Распиновка модуля ESP-01

Модуль ESP8266 рассчитан только на 3,3 В. Поэтому нам необходим источник питания 3,3 В. Схема подключения модуля ESP-01 к плате Arduino показана на рис. 30.2. Общение с модулем с помощью AT-команд. Список основных AT-команд показан в табл. 30.1. Загрузим на плату Arduino скетч, показанный в листинге 30.1, и будем отправлять в модуль ESP-01 AT-команды. Результат выполнения команд показан на рис. 30.3.
Схема подключения модуля ESP-01 к Arduino
Рис. 30.2. Схема подключения модуля ESP-01 к Arduino

Листинг 30.1

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // указываем пины rx и tx
void setup()
{
pinMode(2,INPUT);
pinMode(3,OUTPUT);
Serial.begin(9600);
mySerial.begin(9600);
}
void loop()
{
if (mySerial.available())
{
int c = mySerial.read(); // читаем из software-порта
Serial.write(c); // пишем в hardware-порт
if (Serial.available())
{
int c = Serial.read(); // читаем из hardware-порта
mySerial.write(c); // пишем в software-порт
}
}

Порядок подключения:

Рис. 30.3. Отправка AT-команд из Arduino IDE

Создадим скрипт отправки данных на сайт Народный мониторинг (http://narodmon.ru). Подключим к плате Arduino датчик температуры LM335 и каждые 10 минут будем отправлять данные. Схема соединений показана на рис. 30.4. Для отправки данных необходимо выполнить следующую последовательность действий:

1. Сброс ESP-01 и проверка готовности модуля (AT+RST).
2. Подключение к сети по Wi-Fi (AT+CWJAP="","").
3. Выбор режима одиночного соединения (AT+CIPMUX=0).
4. Создание TCP-соединения (AT_CIPSTART="TCP","92.39.235.156", 8283).
5. Отправка данных (AT+CIPSEND= и сами данные #\ n#\n#\n##).
6. Закрыть TCP-соединение (AT+CIPCLOSE).
7. Пауза 10 минут и переход к шагу 4.
 
 


Схема подключения модуля ESP-01 к Arduino

Рис. 30.4. Схема подключения модуля ESP-01 к Arduino


Таблица 30.1


Содержимое скетча показано в листинге 30.2.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
const int LM335=A0; // контакт подключения датчика LM335
#define SSID "MacBook Pro - Petin" // введите ваш SSID
#define PASS "19101966" // введите ваш пароль
#define DST_IP "92.39.235.156" // naronmon.ru
void setup()
{
Serial.begin(9600); // для отладки
mySerial.begin(9600);
delay(2000);
Serial.println("Init");
mySerial.println("AT+RST"); // сброс и проверка, если модуль готов
delay(1000);
if(mySerial.find("ready"))
{Serial.println("WiFi - Module is ready");}
else
{Serial.println("Module dosn't respond.");
while(1);
}
delay(1000);
// соединение по wifi
boolean connected=false;
for(int i=0;i<5;i++)
{
if(connectWiFi())
{connected = true;
mySerial.println("Connected to Wi-Fi...");
break;
}
}
if (!connected)
{
mySerial.println("Coudn't connect to Wi-Fi.");
while(1);
}
delay(5000);
mySerial.println("AT+CIPMUX=0"); // режим одиночного соединения
}
void loop()
{
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += DST_IP;
cmd += "\",8283";
Serial.println(cmd);
mySerial.println(cmd);
if(mySerial.find("Error"))
return;
double val = analogRead(LM335); // чтение показаний LM335
double voltage = val*5.0/1024; // перевод в вольты
double temp = voltage*100 - 273.15; // в градусы Цельсия
cmd = "#A0:F3:C1:70:AA:94\n#2881C4BA0200003B1#"+String(temp)+"\n##";
delay(3000);
mySerial.print("AT+CIPSEND=");
mySerial.println(cmd.length());
delay(1000);
Serial.println(">");
mySerial.print(cmd);
Serial.println(cmd);
delay(3000);
mySerial.println("AT+CIPCLOSE");
delay(600000);
}
// процедура установки Wi-Fi-соединения
boolean connectWiFi()
{
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
mySerial.println(cmd);
Serial.println(cmd);
delay(2000);
if(mySerial.find("OK"))
{
Serial.println("OK, Connected to Wi-Fi.");
return true;
}
else
{
Serial.println("Can not connect to the Wi-Fi.");
return false;
}
}


Листинги программ скачать

Читать далее

● Проект 29: Работа с Интернетом на примере Arduino Ethernet shield W5100

Опубликовано: 23.04.2018
В этом эксперименте мы покажем, как нашей плате Arduino получить доступ к сети Интернет с помощью модуля Ethernet shield W5100.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
модуль Ethernet shield W5100;
светодиод – 2 шт.;
резистор 220 Ом – 2 шт.;
провода папа-папа.

Ethernet Shield позволяет легко подключить вашу плату Arduino к локальной сети или сети Интернет. Он предоставляет возможность Arduino отправлять и принимать данные из любой точки мира с помощью интернет-соединения. Например, можно реализовать удаленное управление вашими исполнительными устройствами, подключенными к реле, через веб-сайт или создать устройство, которое с помощью звукового сигнала оповестит вас о новом электронном письме.
В первой части эксперимента рассмотрим использование платы Arduino с подключенным Ethernet Shield в качестве сервера, выдающего клиенту (браузеру) веб-страницу и позволяющего запросами с браузера изменять состояния подключенного к Arduino светодиода.
Подключаем к плате Arduino Ethernet shield, а к выводам D7, D8 – светодиоды через резистор 220 Ом (см. рис. 29.1).

Схема подключения модуля Ethernet shield и светодиодов
Рис. 29.1. Схема подключения модуля Ethernet shield и светодиодов

При написании скетча используем встроенную в Arduino IDE библиотеку Ethernet.
Содержимое скетча показано в листинге 29.1.

#include <SPI.h>
#include <Ethernet2.h>
// mac-адрес платы и ip-адрес сервера
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,7);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
int pins[] = { 7, 8}; // Пины для светодиодов
int pinState[] = {0, 0}; // Состояние пинов
String getData="";
boolean startGet=false;
void setup()
{
Serial.begin(9600);
for(int i=0;i<2;i++)
{
pinMode(pins[i],OUTPUT); // контакты подключения светодиодов
digitalWrite(i,LOW); // выключить светодиоды
}
// инициализации библиотеки Ethernet server
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
// ожидание подключения клиентов
EthernetClient client = server.available();
if (client)
{
boolean currentLineIsBlank = true;
while (client.connected())
{
if (client.available())
{
char c = client.read();
if(startGet==true) // данные после '?'
getData+=c;
if(c == '?') // начало сбора данных после '?'
startGet=true;
if (c == '\n' && currentLineIsBlank) // окончание получения
{
if(getData.length()<1) // запрос без get-данных
{
pinState[0]=0;
pinState[1]=0;
}
else
{
pinState[0]=int(getData[5])-48;
pinState[1]=int(getData[12])-48;
}
// отправка заголовков клиенту
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// формирование страницы ответа
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<h3>Ethernet shield + LEDS</h3>");
client.println("<form method='get'>");
// светодиод 1
client.print("<div>");
client.print("led1 off<input type='radio' name='led1' value=0 onclick='document.getElementById(\"submit\").click();' ");
if (pinState[0] == 0)
client.print("checked");
client.println(">");
client.print("<input type='radio' name='led1' value=1 onclick='document.getElementById(\"submit\").click();' ");
if (pinState[0] == 1)
client.print("checked");
client.println("> on");
client.println("</div>");
// светодиод 2
client.print("<div>");
client.print("led2 off<input type='radio' name='led2' value=0 onclick='document.getElementById(\"submit\").click();' ");
if (pinState[1] == 0)
client.print("checked");
client.println(">");
client.print("<input type='radio' name='led2' value=1 onclick='document.getElementById(\"submit\").click();' ");
if (pinState[1] == 1)
client.print("checked");
client.println("> on");
client.println("</div>");
client.println("<input type='submit' id='submit' style='visibility:hidden;' value='Refresh'>");
client.println("</form>");
client.println("</html>");
break;
}
if (c == '\n')
{currentLineIsBlank = true;}
else if (c != '\r')
{currentLineIsBlank = false;}
}
}
}
// задержка для получения клиентом данных
delay(1);
// закрыть соединение
client.stop();
for(int i=0;i<2;i++) // светодиоды включить или выключить
{digitalWrite(pins[i],pinState[i]);}
startGet=false;
getData="";
}

 

Порядок подключения:
1. Подключаем Ethernet shield к плате Arduino, с помощью кабеля RJ45 подключаем Ethernet shield к сети.
2. Подключаем светодиоды по схеме на рис. 29.1.
3. Загружаем в плату Arduino скетч из листинга 29.1.
4. Открываем браузер на любом компьютере данной сети и в адресной строке набираем http://192.168.0.214 (тот адрес, который вы присваиваете Arduino в скетче).
5. На странице (рис. 29.2), изменяя статус элементов input radio, видим изменение состояния светодиодов, подключенных к плате Arduino.


Рис. 29.2. Веб-страница, формируемая Arduino-сервером

Листинги программ скачать

Для работы шилда на W5500, потребуется установка библиотеки Ethernet2 (https://www.arduino.cc/en/Reference/Ethernet).



 

Читать далее

● Проект 28: Считыватель RFID на примере RC522. Принцип работы, подключение

Опубликовано: 23.04.2018
В этом эксперименте мы покажем, как плата Arduino получает доступ к данным RFID-карт и брелоков Mifare с помощью RFID-считывателя RC522C.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
RFID-считыватель RC522;
брелок;
карта;
провода папа-папа.

Радиочастотная идентификация (RFID) – это технология автоматической бесконтактной идентификации объектов при помощи радиочастотного канала связи. Базовая система RFID состоит из:

• радиочастотной метки;
• считывателя информации (ридера);
• компьютера для обработки информации.

Идентификация объектов производится по уникальному цифровому коду, который считывается из памяти электронной метки, прикрепляемой к объекту идентификации. Считыватель содержит в своем составе передатчик и антенну, посредством которых излучается электромагнитное поле определенной частоты. Попавшие в зону действия считывающего поля радиочастотные метки «отвечают» собственным сигналом, содержащим информацию (идентификационный номер товара, пользовательские данные и т. д.). Сигнал улавливается антенной считывателя, информация расшифровывается и передается в компьютер для обработки. Подавляющее большинство современных систем контроля доступа (СКД) использует в качестве средств доступа идентификаторы, работающие на частоте 125 кГц. Это проксимити-карты доступа (только чтение), самыми распространенными являются карты EM-Marin, а также HID, Indala. Карты этого стандарта являются удобным средством открывания дверей и турникетов. Но не более. Эти карты не обладают никакой защищенностью, легко копируются и подделываются и, соответственно, ничего не дают для защиты объекта от несанкционированного проникновения.

Настоящую защиту от копирования и подделки обеспечивают такие идентификаторы, в чипах которых реализована криптографическая защита. Это бесконтактные смарт-карты, работающие на частоте 13,56 МГц, наиболее распространенными из них являются карты Mifare®. В картах этих стандартов криптозащита организована на высоком уровне, и подделка таких карт практически невозможна.

Модуль RC522 – RFID-модуль 13,56 МГц с SPI-интерфейсом. В комплекте к модулю идут 2 RFID-метки – в виде карты и брелока.

Основные характеристики:

• основан на микросхеме MFRC522;
• напряжение питания: 3,3 В;
• потребляемый ток: 13–26 мА;
• рабочая частота: 13,56 MГц;
• дальность считывания: 0~60 мм;
• интерфейс: SPI, максимальная скорость передачи 10 МБит/с;
• размер: 40×60 мм;
• чтение и запись RFID-меток.

Схема подключения модуля к плате Arduino показана на рис. 28.1.
Схема подключения модуля RFID-считывателя RC522C к Arduino
Рис. 28.1. Схема подключения модуля RFID-считывателя RC522C к Arduino

Напишем скетч считывания с карты и вывода в последовательный порт Arduino UID (уникальный идентификационный номер) RFID-метки (карты или брелока). При написании скетча будем использовать библиотеку MFRC522 (https://github.com/miguelbalboa/rfid). Содержимое скетча показано в листинге 28.1.

// Подключение библиотек
#include <SPI.h>
#include <MFRC522.h>
// константы подключения контактов SS и RST
#define RST_PIN 9
#define SS_PIN 10
// Инициализация MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
void setup()
{
Serial.begin(9600); // инициализация последовательного порта
SPI.begin(); // инициализация SPI
mfrc522.PCD_Init(); // инициализация MFRC522
}
void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// чтение карты
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// показать результат чтения UID и тип метки
Serial.print(F("Card UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print(F("PICC type: "));
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
delay(2000);
}
// Вывод результата чтения данных в HEX-виде
void dump_byte_array(byte *buffer, byte bufferSize)
{
for (byte i = 0; i < bufferSize; i++)
{
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}

Порядок подключения:

1. Подключаем модули RFID-считывателя RC522 к плате Arduino по схеме на рис. 28.1.
2. Загружаем в плату Arduino скетч из листинга 28.1. Открываем монитор последовательного порта.
3. Подносим метку (карту или брелок) к считывателю и видим вывод в последовательный порт данных метки UID и тип (рис. 28.2).

Рис. 28.2. Вывод в последовательный порт информации о метках


Метки Mirafe позволяют записывать на них информацию. В следующем скетче мы организуем на карте счетчик, который будет инкрементироваться при поднесении карты к считывателю. В последовательный порт будем выводить показания счетчика. Содержимое скетча показано в листинге 28.2.

// Подключение библиотек
#include <SPI.h>
#include <MFRC522.h>
// константы подключения контактов SS и RST
#define RST_PIN 9
#define SS_PIN 10
// Инициализация MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
MFRC522:MIFARE_Key key;
byte sector = 1;
byte blockAddr = 4;
byte dataBlock[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte trailerBlock = 7;
byte status;
byte buffer[18];
byte size = sizeof(buffer);
void setup()
{
Serial.begin(9600); // инициализация последовательного порта
SPI.begin(); // инициализация SPI
mfrc522.PCD_Init(); // инициализация MFRC522
// Значение ключа (A или B) – FFFFFFFFFFFFh значение с завода
for (byte i = 0; i < 6; i++)
key.keyByte[i] = 0xFF;
}
void loop()
{
if ( ! mfrc522.PICC_IsNewCardPresent())
return;
// чтение карты
if ( ! mfrc522.PICC_ReadCardSerial())
return;
// показать результат чтения UID и тип метки
Serial.print(F("Card UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print(F("PICC type: "));
byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
// Чтение данных из блока 4
Serial.print(F("Reading data from block "));
Serial.print(blockAddr);
Serial.println(F(" ..."));
Serial.print(F("Data for count ")); Serial.print(blockAddr);
Serial.println(F(":"));
dump_byte_array(buffer, 2); Serial.println();
Serial.println();
for (byte i = 0; i < 16; i++) // запись в buffer[]
dataBlock[i]=buffer[i];
// получение байт счетчика (0 и 1)
int count1=(buffer[0]<<8)+buffer[1];
Serial.print("count1=");Serial.println(count1);
count1=count1+1; // инкремент счетчика
dataBlock[0]=highByte(count1);
dataBlock[1]=lowByte(count1);
// Аутентификация key B
Serial.println(F("Authenticating again using key B..."));
// Запись данных в блок
Serial.print(F("Writing data into block "));
Serial.print(blockAddr);
Serial.println(F(" ..."));
dump_byte_array(dataBlock, 2); Serial.println();
}
// Вывод результата чтения данных в HEX-виде
void dump_byte_array(byte *buffer, byte bufferSize)
{
for (byte i = 0; i < bufferSize; i++)
{
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}


Порядок подключения:

Рис. 28.3. Вывод в последовательный порт информации о счетчике на метках
 
Листинги программ скачать


Читать далее

● Проект 27: SD-карта. Чтение и запись данных

Опубликовано: 23.04.2018
В этом эксперименте мы покажем, как к плате Arduino подключить SD-карту.

Необходимые компоненты:

контроллер Arduino UNO R3;
плата для прототипирования;
модуль SD-card;
модуль часов реального времени DS1307 с батарейкой;
• датчик температуры LM335;
резистор 2,2 кОм;
провода папа-папа.

Если вашим Аrduino-проектам не хватает памяти, а объем энергонезависимой памяти EEPROM в платах Arduino совсем небольшой, можно использовать внешние носители. Один из самых простых по подключению к платам Arduino – это SD-карта. Можно подсоединиться к SD-карте напрямую, а можно использовать модули.
Подсоединим модуль SD-card к плате Arduino и напишем пример сохранения на SD-карте данных аналогового датчика температуры LM335. Для анализа данных температуры потребуется знать и время измерения данных, поэтому будем использовать и модуль часов реального времени RTC. Соберем схему, показанную на рис. 27.1.

Рис. 27.1. Схема подключения модулей SD-card и DS1307 к Arduino

При написании скетча используем библиотеку SD для работы с SD-картой, а также библиотеки Time и DS1307 для работы с модулем RTC. Содержимое скетча показано в листинге 27.1. Каждые 5 минут мы считываем данные с датчика LM335, подключенного к аналоговому входу A0, и заносим время измерения и данные температуры в файл вида d-m-Y. В начале суток создаем новый файл на новый день.

Листинг 27.1

// подключение библиотек для RTC
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
// подключение библиотеки для SD
#include <SD.h>
File myFile;
String sfilename;
char filename[20];
const int LM335=A0; // для подключения LM335
tmElements_t tm;
unsigned long millis1=0;
void setup()
{;}
void loop()
{
// проверка прошло 5 минут?
if(millis()-millis1>5*60*000)
{
millis1=millis();
// получить имя файла для текущего дня
sfilename=get_file_name();
sfilename.toCharArray(filename,20);
// открыть файл или создать
myFile = SD.open(filename, FILE_WRITE);
// получить температуру
double val = analogRead(lm335); // чтение
double voltage = val*5.0/1024; // перевод в вольты
double temp = voltage*100 - 273.15; // в градусы Цельсия
// получить время H:m
// создать запись для файла
record=get_time();
record+=" ";
record+=String(temp);
myFile.println(record);
myFile.close();
}
// получение времени дня
String get_time()
{
String time1;
RTC.read(tm);
if(tm.Hour()<10)
time1="0"+String(tm.Hour(),DEC);
else
time1=String(tm.Hour(),DEC);
if(tm.Minute()<10)
time1+=":0"+String(tm.Minute(),DEC);
else
time1+=":"+String(tm.Minute(),DEC);
return time1;
}


Порядок подключения:

1. Подключаем модули SD card, DS1307 и датчик температуры LM335 к плате Arduino по схеме на рис. 27.1.
2. Загружаем в плату Arduino скетч из листинга 27.1. Ждем продолжительное время, затем вынимаем карту, вставляем в компьютер, открываем файл, соответствующий текущему дню, и смотрим его содержимое – по строкам времени замера и показания температуры.

Листинги программ скачать




 
Читать далее

Главное меню

Каталог

Полезные ссылки

Цена
от
до