Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по учебной практике ИБ-1401 Владимиров, Поликарпов, Смирнов.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.13 Mб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Санкт-Петербургский государственный экономический университет»

Кафедра вычислительных систем и программирования

Отчет по учебной практике

Выполнили:

Студенты группы ИБ-1401

Владимиров Павел

Поликарпов Александр

Смирнов Геннадий

Проверил:

Морозов С.К., ст. преподаватель.

Санкт-Петербург

2016

Оглавление

1. Цель работы 3

2. InsideArduino 4

3. OutsideArduino 8

4. Данные о комплектующих 10

5. ИК передача данных 12

6. Статистические данные 15

7. Вывод 19

8. Список литературы 20

1. Цель работы

Создать систему из двух устройств на базе процессоров Arduino. Первое устройство(InsideArduino) должно иметь дисплей для отображения информации, RTC, датчик температуры и ИК-приемник для работы с вторым устройством(OutsideArduino). Второе же включает в себя датчик температуры и ИК-передатчик. При разработке учесть экономическую составляющую.

2. InsideArduino

Рис.1 Схема InsideArduino

Комплектующие:

1) Arduino Promini (ATmega168 20MU)

2) IR receiver (KY-022)

3) Real Time Clock (DS3231SN)

4) LCD Keypad Shield (LCD1602 IIC/I2C)

Функционал:

Во-первых, устройство выполняет все общие функции часов, то есть отображение и настройка даты и времени. Во-вторых, принятие ИК сигнала от OutsideArduino, декодировка данных и сравнение с снятыми данными с встроенного в RTC датчика температуры. Так же присутствуют разные режимы: отображение принимаемого ИК сигнала, часы с температурными показаниями с улицы и из помещения, режим настройки даты и времени.

Режимы работы:

1. Режим цикличного отображения

Запускается при загрузке InsideArduino или при нажатии кнопки Right. Представляет из себя отображение на экране считываемой с датчиков информации: температуры с RTC, температуры принятой по ИК и даты с RTC. Эти данные отображаются по очереди с задержкой на верхней строке дисплея. Так же постоянно отображается время на нижней строке дисплея. Режим можно изменить в любой момент работы этого режима.

2. Режим постоянного принятия ИК сигнала

Запускается при нажатии кнопки Left. В этом режиме отображается принимаемые 16 бит данных в виде шестнадцатеричного числа на верхней строке и те же данные после обработки и приведении к формату температуры на нижней строке дисплея. Режим можно изменить в любой момент работы этого режима.

3. Режим настройки RTC

Запускается нажатием кнопки Select. При запуске этого режима на RTC устанавливается дата - 01.01.2010 и время - 00:00:00. Далее отображается дата, и одной из кнопок Select, Left или Up увеличивается день, месяц или год соответственно. Чтобы продолжить или пропустить нужно нажать кнопку Right. После этого отображается время. Кнопками Select и Left можно увеличить час и минуты соответственно. Далее нажимается Right, и настройка заканчивается. После этого вы снова можете выбрать режим. Настройка хоть и не удобна пользователю, но выгодна в плане объёма кода, что было важно в нашем проекте (см. 4.1).

Код:

// Подключаем библиотеки для работы с RTC, дисплеем и ИК приемником.

#include <DS3231.h>

#include <OneWire.h>

#include <Wire.h>

#include <LiquidCrystal.h>

#include <IRremote.h>

#define ONE_WIRE_BUS 2

int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN);// Назначение 2 цифрового выхода для работы с ИК приемником.

IRsend irsend;

decode_results results;

DS3231 rtc(11, 10); // Назначение 10 и 11 цифровых выходов для работы с RTC.

LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); // Назначение цифровых выходов с 4 по 9 включительно для работы с дисплеем.

int button;

int k=1;

int getPressedButton() // Функция для работы с кнопками дисплея.

{

int buttonValue = analogRead(0); // Считывание показателей с аналогового выхода 0.

if (buttonValue < 100) {return 1;}

else if (buttonValue < 200) {return 2;}

else if (buttonValue < 400){return 3;}

else if (buttonValue < 600){return 4;}

else if (buttonValue < 800){return 5;}

return 0;}

void setup() // Загрузочная функция.

{

lcd.begin(16, 2); // Подключение LCD.

Serial.begin(9600);

irrecv.enableIRIn(); // Подключение ИК приемника.

rtc.begin(); // Подключение RTC.

}

void loop(void) // Функция цикла.

{

delay(50); // Задержка на 50 мс.

if (k!=1){button = getPressedButton();}

button = getPressedButton(); // Считывание значения нажатия кнопки.

if (k==1){button=1;k=0;}// Условие для автозапуска режима с Right(1) кнопки.

switch (button)

{

case 1:{ // Режим отображения даты, времени, температур внутри и снаружи.

int c4=0; // Переменная для цикличного и последовательного отображения информации.

while(getPressedButton()==0 || getPressedButton()==1){

if(c4>49){

lcd.setCursor(0, 0);

lcd.print(rtc.getDateStr()); // Получение данных о дате с RTC.

lcd.print(" ");}

if(c4>24&&c4<50){

lcd.setCursor(0, 0);

lcd.print("Outside C: ");

if (irrecv.decode(&results)) // Получение данных с ИК приемника.

{

if(results.value!=0x0&&results.value!=0xffffffff){ // Отсеивание искаженных сигналов.

float p; // Переменная для принятого сигнала (данных о температуре).

p=results.value; // Присвоение данных переменной.

p/=100; // Преобразование цифры обратно, после увеличения на OutsideArduino.

if(p>-40&&p<200){ // Отсеивание искаженных сигналов.

lcd.setCursor(11, 0);

lcd.print(p);

lcd.print(" ");}

}irrecv.resume();}}

if(c4<25){

lcd.setCursor(0, 0);

lcd.print("Inside C: ");

lcd.print(rtc.getTemp()); // Получение данных о температуре с RTC.

lcd.print(" ");}

lcd.setCursor(0, 1);

lcd.print(rtc.getTimeStr()); // Получение данных о времени с RTC.

delay(200);

if(c4==76 || c4> 76){c4=0;}else{c4++;}

}

break;}

case 5: { // Режим настройки даты и времени.

lcd.clear();

// В целях оптимизации и сокращения обьема кода настройка была упрощена.

// И при запуске данного режима полностью откатывается RTC.

int m=1;

int d=1;

int y=2010;

int mi=0;

int h=0;

int c=1;

while(c==1){

lcd.setCursor(0, 0);

lcd.print(rtc.getDateStr());

delay(200);

if (getPressedButton()==5){

d+=1;}

if (getPressedButton()==4){

m+=1;}

if (getPressedButton()==3){

y+=1;}

if (getPressedButton()==1){

c=0;}

rtc.setDate(d,m,y);

}

c=1;

while(c==1){

lcd.setCursor(0, 1);

lcd.print(rtc.getTimeStr());

delay(200);

if (getPressedButton()==5){

mi+=1;}

if (getPressedButton()==4){

h+=1;}

if (getPressedButton()==1){

c=0;}

rtc.setTime(mi,h,0);

}

}

case 3:{ // Режим принятия ИК сигнала с отображением принятого сигнала и декодированной температуры.

// Прием и обработка описаны выше.

lcd.setCursor(0, 0);

lcd.print(" ");

lcd.setCursor(0, 1);

lcd.print(" ");

while(getPressedButton()==0 || getPressedButton()==3){

if (irrecv.decode(&results))

{

if(results.value!=0x0&&results.value!=0xffffffff){

lcd.setCursor(0, 0);

lcd.print(" ");

lcd.setCursor(0, 0);

lcd.print(results.value, HEX);

lcd.setCursor(0, 1);

lcd.print(" ");

float p;

p=results.value;

p/=100;

lcd.setCursor(0, 1);

lcd.print(p);

}irrecv.resume();}

delay(200);}

break;}

}}

3. OutsideArduino

Рис.2 Схема OutsideArduino

Комплектующие:

1) Arduino Promini (ATmega168 20MU)

2) IR transmitter (KY-005)

3) Temperature sensor (DS18B20)

Функционал:

Считывание данных с датчика температуры, кодировка и передача данных по средствам ИК сигнала.

Код:

// Подключение необходимых библиотек для работы с ИК передатчиком и с датчиком температуры.

#include <OneWire.h>

#include <DallasTemperature.h>

#define ONE_WIRE_BUS 6

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

#include "IRremote.h"

IRsend irsend;

int t; // Переменная для данных о температуре.

void setup() // Загрузочная функция.

{

Serial.begin(9600);

sensors.begin();

}

void loop() { // Функция основного цикла.

sensors.requestTemperatures(); // Получение данных с датчика температуры.

Serial.println(sensors.getTempCByIndex(0));

t=sensors.getTempCByIndex(0)*100; // Увеличение данных о темпретуре в 100 раз для упрощения передачи числа.

Serial.println(t, HEX);

unsigned long data =0x0;// Преобразование температуры из десятичной системы счисления в шестнадцатиричную.

data=+t;

int nbits = 16;// Кол-во бит в сигнале.

irsend.sendNEC(data, nbits);// Кодировка данных в сигнал формата NEC.

delay(100);

}