1. КОМАНДА "Домино" 

Фисунов Антон Бельцов Иван Быков Владимир Даниил Кустов

Наша команда состоит из четырех человек: Быков Владимир - лидер команды, Кустов Даниил - программист IoT-устройств на микроконтроллере Arduino, Антон Фисунов - программист IoT-сервера , Бельцов Иван - инженер- разработчик схем IoT устройств на микроконтроллере Arduino. Опыт работы с микроконтроллером Arduino каждого участника варьируется от двух до четырех лет. Мы - ученики гимназии №5 города Чебоксары, решили поучаствовать в олимпиаде чтобы проверить наши знания и применить их на практике. 

1 задача

Использумые компоненты:

Arduino Uno - 1 шт

Мини реле AMP-B066 - 2 шт.

Встраиваемый блок питания 5В - 1 шт

Встраиваемый блок питания 12В - 1 шт

Водяной насос (MICRO-WATER-PUMP (385)) - 2 шт

Датчик уровня воды (угловой) AMP-X221 - 1 шт

Датчик потока воды (модель YF-S201) - 1 шт

Датчик углекислого газа MQ-135 - 2 шт 

Вентилятор (12В, 25х25х10мм)

Шланги для воды, соединительные провода, крепеж

Светодиоды: 2 красных, 1 желтый, 1 зеленый

Описание работы устройства:

Motor shield используется для управления водяными насосами, из которых один отвечает за подачу воду, другой за её выкачивание. Питание обеспечивается встраиваемым блоком питания 12V.

Два датчика углекислого газа используется для увеличения точности замеров.

Вентилятор обеспечивает приток воздуха в бокс.

Датчик уровня воды установлен немного ниже максимального уровня для ограничения переполнения.

Датчик потока воды используется при откачке для недопущения опаскания уровня воды ниже минимального.

Если показания дачтика СO2 в норме, следующий замер производиться через 10 секунд.

Светодиоды служат для отображения получаемых данных.

 

Принципиальная схема:

 

Алгоритм работы:

 

 

Возможный вариант исполнения бокса:

 

 

Задача 2:

Написать и отладить на удаленном учебном стенде программу автоматической работы устройства контроля микроклимата (см Базовую схему и таблицу межблочных электрических соединений), которое выполняет следующие действия

1. Закачивает в "жилой бокс" слабогазированную воду до максимальной отметки, фиксируемой датчиком уровня воды.

2. Измеряет уровень СО2 (измеряется в ppm) в момент достижения максимальной отметки и через 10 сек. Принимает среднее значение этих двух измерения за ОПТИМАЛЬНЫЙ уровень СО2.

3. С помощью вентилятора, выкачивающего воздух, и погружных насосов, удерживает уровень СО2 в "жилом боксе" в течение 5 минут на ОПТИМАЛЬНОМ уровне +/- 20 ppm.

В случае если во время удаленного тестирования или финального испытания уровень воды в "жилом боксе" поднялся до красной отметки, расположенной выше датчика уровня воды, устройство выключается в организаторами в ручном, аварийном порядке.

Описание устройства контроля микроклимата

Базовая схема устройства контроля микроклимата

Таблица межблочных электрических соединений

 Элемент  Контакт  Контакт  Элемент

Датчик углекислого газа MQ-135 (Troyka-модуль)

Артикул AMP-B094

S

5V

Arduino UNO R3

V

A0

G

GND

E

09

Ультразвуковой дальномер HC-SR04

Артикул AMP-X142-U2

GND

GND

Echo

11

Trig

10

VCC

08

Датчик уровня воды (угловой)

Артикул AMP-X221

*

GND

*

12

Motor Shield (2 канала, 2 А)

Артикул AMP-B001

H2

07

E2

06

E1

05

H1

04

M1 +

Красный провод

Погружная помпа с трубкой

Артикул AMP-X157 №1

M1 -

Черный провод

M2 +

Красный провод

Погружная помпа с трубкой

Артикул AMP-X157 №2

M2 -

Черный провод

+

-V

Встраиваемый блок питания (12 В, 2100 мА)

Артикул AMP-X285

-

+V

Реле (Troyka-модуль)

Артикул AMP-B010

S

A5

Arduino UNO R3

V

3,3V

G

-V

Встраиваемый блок питания (12 В, 2100 мА)

Артикул AMP-X285

NO

COM

Черный провод

Вентилятор Evercool EC2510H12B (12В, 25х25х10мм)

Встраиваемый блок питания (12 В, 2100 мА)

Артикул AMP-X285

+V

Красный провод

Примечания:
1. У датчика углекислого газа MQ-135 (Troyka-модуль) Артикул AMP-B094 перемычка «H=V» установлена
2. У Motor Shield (2 канала, 2 А) Артикул AMP-B001 перемычка «PWR JOINT» установлена
3. Погружная помпа с трубкой Артикул AMP-X157 №1 – установлена в "жилом боксе". 
4. Погружная помпа с трубкой Артикул AMP-X157 №2 – установлена в боксе с газированной водой

 

Код программы управления:

#include <TroykaMQ.h>
#include <ARpcDevice.h>
//--------------------------------
#define RELAY_PIN 19
#define PIN_MQ135 A0
#define SPEED_1 5
#define DIR_1 4
#define SPEED_2 6
#define DIR_2 7
#define trigPin 10
#define echoPin 11
#define vcc 8
#define water 12
//--------------------------------
MQ135 mq135(PIN_MQ135);
int minlevel, maxlevel, optimal, levelscnd, levelfst, level, distWater = 0;
//IOT Часть
unsigned long newTime=0,prevSinTime=0;
const char *deviceName="IoT_Domino";//имя устройства
const ARpcUuid deviceId("{13657853-57f4-41fd-904a-d3e6c6d0aaa1}");//идентификатор устройства
const char *sensorsDef="<sensors>"
"<sensor name=\"gas\" type=\"u32_sv\"/>" // Датчик CO2
"<sensor name=\"distance\" type=\"u32_sv\"/>"
"</sensors>";
//--------------------------------
class WriteCallback
:public ARpcIWriteCallback
{
public:
virtual void writeData(const char *data,unsigned long sz)
{
Serial.write(data,sz);
}
virtual void writeStr(const char *str)
{
Serial.print(str);
}
virtual void writeStr(const __FlashStringHelper *str)
{
Serial.print(str);
}
}wcb;
//-------------------------------
ARpcDevice dev(300,&wcb,&deviceId,deviceName);

void setup() {
Serial.begin(9600);
pinMode(water, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT);
pinMode(vcc, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(vcc, HIGH);
for (int i = 4; i < 8; i++) {
pinMode(i, OUTPUT);
}
mq135.calibrate();
while(digitalRead(water) == 1 || get_distance() > 8) {
digitalWrite(DIR_1, HIGH);
analogWrite(SPEED_1, 255);
delay(1000);
analogWrite(SPEED_1, 0);
}
levelfst = mq135.readCO2();
delay(10000);
levelscnd = mq135.readCO2();
optimal = (levelfst + levelscnd) / 2;
minlevel = optimal - 20;
maxlevel = optimal + 20;
dev.disp().setSensors(sensorsDef);
dev.resetStream();
}

void loop() {
distWater = get_distance();
level = mq135.readCO2();
Serial.print("CO2: ");
Serial.println(level);
//---------------------------------------------------------------------------------
while(Serial.available())
dev.putByte(Serial.read());//если данные есть, передаем в объект библиотеки
newTime=millis();
if((newTime-prevSinTime)>=10000) { //если оно на 10000 мсек больше предыдущего
dev.disp().writeMeasurement("gas",String(level).c_str());
dev.disp().writeMeasurement("distance",String(distWater).c_str());
prevSinTime=newTime;
}
//---------------------------------------------------------------------------------
delay(1);
// Если CO2 низкий:
if (level < minlevel) {
while(get_distance() < 11){
digitalWrite(DIR_2, HIGH);
analogWrite(SPEED_2, 255);
delay(1000); //ВРЕМЯ ЗАСЕЧЬ ПО ФАКТУ ДО ДОСТИЖЕНИЯ МИНИМАЛЬНОЙ ОТМЕТКИ
analogWrite(SPEED_2, 0);
// Закачка воды
}

while(digitalRead(water) == 1 || get_distance() > 8) {
digitalWrite(DIR_1, HIGH);
analogWrite(SPEED_1, 255);
delay(100);
analogWrite(SPEED_1, 0);
}
}
// Если CO2 высокий
else if (level > maxlevel) {
digitalWrite(RELAY_PIN, HIGH); // Включение реле
while (level > maxlevel) {
delay(1000);
level = mq135.readCO2();
}
digitalWrite(RELAY_PIN, LOW);
}
delay(1000);
}

int get_distance(){
int duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance= duration / 58;
return distance;
}

 Интерактивные графики:

Датчик углекислого газа:

-

Датчик расстояния:

-

 


/messages/6349