1. КОМАНДА "C++minus" 

Романов Дмитрий Курылев Артем Заика Тимофей Фомичев Роман

 

Команда C++minus это дружная и сплоченная команда, в которой каждый участник знает свое дело на высшем уровне. На счету команды былоне мало участий в таких олимпиадах как worldskills и РОСТЕЛЕКОМ.Сейчас наша главная цель это победа в чемпионате НТИ!

 

                                  Работа устройства:

Устройство мониторит и контролирует микроклимат в "жилом боксе".
Устройство предназначено для работы в ограниченных условиях, например на космической станции, где микроклимат необходим для поддержания жизни экипажа.

 

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


• На вход поступают данные с датчиков периодом в n сек.


• Если уровень воды достигает максимального значения, загорается красный светодиод, что является индикацией того, что уровень воды стал отличаться от значения нормы, водяной насос начинает выкачивать воду до тех пор, пока уровень воды не опустится ниже максимального.


• Если уровень воды достигает минимального значения, загорается зеленый светодиод, что является индикацией того, что уровень воды стал отличаться от значения нормы, водяной насос начинает перекачивать слабогазированную воду из бокса - источника в "жилой бокс" n сек.


• Если уровень содержани углекислого газа становится ниже константы дельта, загорается синий светодиод, что является индикацией того, что уровень углекислого газа стал отличаться от значения дельта, воздух из "жилого бокса" начинает выкачиваться при помощи вентилятора.


• Если уровень содержани углекислого газа становится выше константы дельта, загорается желтый светодиод, что является индикацией того, что уровень углекислого газа стал отличаться от значения дельта, водяной насос начинает перекачивать воду из бокса - источника в жилой бокс до тех пор, пока уровень углекислого газа не будет равен константе дельта.

 

Схема устройства:

логическая схема:

 

 



Описание условия задачи:
Написать и отладить на удаленном учебном стенде программу автоматической работы устройства контроля микроклимата (см Базовую схему и таблицу межблочных электрических соединений), которое выполняет следующие действия
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 – установлена в боксе с газированной водой

 

Код для Arduino:

#include <ARpcDevice.h>
#include <TroykaMQ.h>

#define analogGas A0 //подключение аналогового сигналоьного пина
#define motor1 4
#define motor10 5
#define motor2 7
#define motor20 6
long duration, cm;
int distance = 0;
unsigned long newTime = 0;
unsigned long oldTime = 0;
float gasValueNow;
float optimal;
//MQ135 gasSensor = MQ135(analogGas);
MQ135 mq135(analogGas);
float gasValue; //переменная для хранения количества газа
float gasValue1; //переменная для хранения количества газа
float gasValue2; //переменная для хранения количества газа
const char *deviceName="WaterIoT";
const ARpcUuid deviceId ("{31f277f2-f021-4a2c-b8cb-2c8d2f14dd92}");

const char *sensorsDef = "<sensors>"
"<sensor name =\"gassensor\" type=\"f32_sv\"/>"
"<sensor name=\"dalsensor\" type=\"u16_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);

int dist(){
digitalWrite(10, LOW);
delayMicroseconds(5);
digitalWrite(10, HIGH);
// Выставив высокий уровень сигнала, ждем около 10 микросекунд. В этот момент датчик будет посылать сигналы с частотой 40 КГц.
delayMicroseconds(10);
digitalWrite(10, LOW);
// Время задержки акустического сигнала на эхолокаторе.
duration = pulseIn(11, HIGH);
cm = (duration / 2) / 29.1;
return cm;
// Теперь осталось преобразовать время в расстояние

}

void setup() {
Serial.begin(9600); //инициализация Serial порта
mq135.calibrate();
pinMode(analogGas, INPUT);
pinMode(motor1, OUTPUT);
pinMode(motor10, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(motor20, OUTPUT);
pinMode(12, INPUT_PULLUP);
pinMode(A5, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, INPUT);
pinMode(8, OUTPUT);
digitalWrite(8, 1);

dev.disp().setSensors(sensorsDef);
dev.resetStream();

while (digitalRead(12) == 0)
{
digitalWrite(motor1, HIGH);
analogWrite(motor10, HIGH);
}
digitalWrite(motor1, LOW);
analogWrite(motor10, LOW);
gasValue1 = mq135.readCO2();
delay(10000);
gasValue2 = mq135.readCO2();
optimal = (gasValue2 + gasValue1)/2;
}

void loop() {
distance = dist();
Serial.print("дистанция: ");
Serial.println(distance);
gasValueNow = mq135.readCO2();
newTime = millis();
while(Serial.available())
dev.putByte(Serial.read());

if((newTime - oldTime) >= 1000)//если оно на 1000 мсек больше предыдущего
{
dev.disp().writeMeasurement("gassensor",String(gasValueNow).c_str());
dev.disp().writeMeasurement("dalsensor",String(gasValueNow).c_str());
oldTime=newTime;
}
while(digitalRead(12) == 0) {
analogWrite(motor20, 255);
analogWrite(motor10, 0);
}
//oldTime = newTime;
if (gasValueNow < optimal - 20)
{
digitalWrite(A5, LOW);
analogWrite(motor10, 255);
analogWrite(motor20, 0);
}
else if (gasValueNow > optimal + 20 || distance > 8)
{
analogWrite(motor10, 0);
analogWrite(motor20, 255);
digitalWrite(A5, HIGH);
while (gasValueNow > optimal + 20) {
gasValueNow = mq135.readCO2();
}
digitalWrite(A5, LOW);
} else {
digitalWrite(A5, LOW);
analogWrite(motor10,0);
analogWrite(motor20,0);
}

delay(300);
}

 

Интерактивные графики показаний датчиков устройства:

 

 


/messages/6355