From 271daff85d099f834040c886ea0b19df5209338a Mon Sep 17 00:00:00 2001 From: eachboy Date: Mon, 3 Apr 2023 11:19:00 +0300 Subject: [PATCH] Add files --- Dinamika/Dinamika.ino | 586 ++++++++++++++++++++++++++++++++++++ Laboratory/Laboratory.ino | 609 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 1195 insertions(+) create mode 100644 Dinamika/Dinamika.ino create mode 100644 Laboratory/Laboratory.ino diff --git a/Dinamika/Dinamika.ino b/Dinamika/Dinamika.ino new file mode 100644 index 0000000..c290d22 --- /dev/null +++ b/Dinamika/Dinamika.ino @@ -0,0 +1,586 @@ +#include //библиотека для I2C интерфейса + + +#include // библиотека для моторной платы +Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x70); +#include "Adafruit_APDS9960.h" +Adafruit_APDS9960 apds9960; + + +#define sensor_addr 0x3F // Переключатели адреса в положении "OFF" + +#define I2C_HUB_ADDR 0x70 // настройки I2C для платы MGB-I2C63EN +#define EN_MASK 0x08 +#define DEF_CHANNEL 0x00 +#define MAX_CHANNEL 0x08 + +// Colors // +#define RED 1 +#define GRAY 2 +#define PURPLE 3 +#define BROWN 4 +#define PINK 5 + +#define OTHER 255 +// Colors // + +int speed = 60; +uint16_t values[13]; +uint16_t colors[13]; +int sum(uint16_t*); +bool check = true; +bool pynkt = true; // до станции +//bool pynkt = false; // до лаборатории +bool lab = true; +bool check_black = false; + +void setup() { + // Инициализация последовательного порта + Serial.begin(115200); + // Инициализация датчика + Wire.begin(); + Wire.setClock(100000L); + pwm.begin(); + // Частота (Гц) + pwm.setPWMFreq(100); + // Все порты выключены + pwm.setPWM(8, 0, 4096); + pwm.setPWM(9, 0, 4096); + pwm.setPWM(10, 0, 4096); + pwm.setPWM(11, 0, 4096); + delay(100); + setBusChannel(0x06); + apds9960.begin(); + apds9960.enableColor(true); + setBusChannel(0x07); + init_sensor(); +} + +void loop() { + setBusChannel(0x07); + poll_sensor(); + if (pynkt == true){ + for (int i = 0; i < 13; i++){ + colors[i] = (values[i]>1400); + } + if ((sum(colors) == 13) && (check_black == false)){ + motorA_setpower(speed, false); + motorB_setpower(speed, true); + delay(300); + check_black = true; + } + setBusChannel(0x07); + poll_sensor(); + for (int i = 0; i < 13; i++){ + colors[i] = (values[i]>1400); + } + if ((sum(colors) == 13) && check_black){ + motorA_setpower(speed, false); + motorB_setpower(speed, true); + delay(300); + motorA_setpower(speed, true); + motorB_setpower(speed, true); + delay(400); + motorA_setpower(0, true); + motorB_setpower(0, true); + Serial.println(2); + } + setBusChannel(0x06); + if (getColor() == 1){ + motorA_setpower(0, false); + motorB_setpower(0, true); + pynkt == false; + Serial.println(3); + + } else{ + //Serial.println(getColor()); + setBusChannel(0x07); + float u = PID(6.0, 0.1, 12.4); + motorA_setpower(speed - u, false); + motorB_setpower(speed + u, true); + delay(10); + Serial.println(1); + } + //Serial.println(pynkt,lab); + } else if (lab == true){ + for (int i = 0; i < 13; i++){ + colors[i] = (values[i]>1400); + } + //Serial.println(pynkt,lab); + setBusChannel(0x06); + if (getColor() == 1) + { + motorA_setpower(speed, false); + motorB_setpower(speed, false); + delay(900); + motorA_setpower(0, true); + motorB_setpower(0, true); + } + setBusChannel(0x07); + float u = PID(6.0, 0.1, 12.4); + motorA_setpower(speed - u, false); + motorB_setpower(speed + u, true); + setBusChannel(0x06); + //Serial.println(getColor()); + if ((getColor() == 3) && (check == true)) + { + motorA_setpower(speed, false); + motorB_setpower(speed, true); + delay(500); + motorA_setpower(speed, false); + motorB_setpower(speed, false); + delay(450); + motorA_setpower(speed, false); + motorB_setpower(speed, true); + delay(600); + motorA_setpower(0, true); + motorB_setpower(0, true); + check = false; + } + + if ((sum(colors) == 13 && lab)) + { + motorA_setpower(speed, true); + motorB_setpower(speed, true); + delay(1000); + motorA_setpower(0, false); + motorB_setpower(0, true); + delay(200); + setBusChannel(0x07); + poll_sensor(); + for (int i = 0; i < 13; i++){ + colors[i] = (values[i]>1400); + } + Serial.println(sum(colors)); + + while (sum(colors) != 13) + { + setBusChannel(0x07); + poll_sensor(); + for (int i = 0; i < 13; i++){ + colors[i] = (values[i]>1400); + } + motorA_setpower(speed, true); + motorB_setpower(speed, false); + } + motorA_setpower(0, false); + motorB_setpower(0, true); + lab = false; + + } + //Serial.println(gg); + } + +} + + +void motorA_setpower(float pwr, bool invert) { + // Проверка, инвертирован ли мотор + if (invert) { + pwr = -pwr; + } + // Проверка диапазонов + if (pwr < -100) { + pwr = -100; + } + if (pwr > 100) { + pwr = 100; + } + int pwmvalue = fabs(pwr) * 40.95; + if (pwr < 0) { + pwm.setPWM(10, 0, 4096); + pwm.setPWM(11, 0, pwmvalue); + } else { + pwm.setPWM(11, 0, 4096); + pwm.setPWM(10, 0, pwmvalue); + } + +} + +// Мощность мотора "B" от -100% до +100% (от знака зависит направление вращения) +void motorB_setpower(float pwr, bool invert) { + // Проверка, инвертирован ли мотор + if (invert) { + pwr = -pwr; + } + // Проверка диапазонов + if (pwr < -100) { + pwr = -100; + } + if (pwr > 100) { + pwr = 100; + } + int pwmvalue = fabs(pwr) * 40.95; + if (pwr < 0) { + pwm.setPWM(8, 0, 4096); + pwm.setPWM(9, 0, pwmvalue); + } else { + pwm.setPWM(9, 0, 4096); + pwm.setPWM(8, 0, pwmvalue); + } +} + +int getErrPID(int val) { + float e = 0; + for (int i = 0; i < 13; i++) { + e+= (values[i] > val) * (i - 6); + + } + return e; +} + +int16_t PID(float Kp, float Ki, float Kd) { + static float I = 0; + static int old_err = 0; + float err = getErrPID(1400); + uint32_t old_t = 0; + float dt = (millis() - old_t) / 1000; + I += err; + float D = (err - old_err) / dt; + return ((float)Kp * err + Ki * I + Kd * D); +} + +uint8_t getColor() { + uint16_t red, green, blue, clear; + while (!apds9960.colorDataReady()) { + delay(5); + } + apds9960.getColorData(&red, &green, &blue, &clear); + uint16_t full = red + green + blue; + if (full != 0) { + uint8_t r, g, b; + r = (float)red / full * 100; + g = (float)green / full * 100; + b = (float)blue / full * 100; + // Serial.print(r); + // Serial.print(" "); + // Serial.print(g); + // Serial.print(" "); + // Serial.print(b); + // Serial.print(" "); + // Serial.println(); + + if (17 <= r && r <= 19) { + if (30 <= g && g <= 32) { + if (49 <= b && b <= 52) { + return PURPLE; + } + } + } else if (35 <= r && r <= 45) { + if (21 <= g && g <= 28) { + if (32 <= b && b <= 38) { + return RED; + } + } + } + return OTHER; + } + return 0; +} +// Инициализация датчика +void init_sensor() { + Wire.beginTransmission(sensor_addr); + Wire.write(0x10); // Регистр настройки всей микросхемы + Wire.write(0b00000000); // Нормальный режим работы + Wire.write(0b01001111); // АЦП в непрерывном режиме, 200 ksps, встроенный ИОН для ЦАП + Wire.endTransmission(); + delay(1000); + Wire.beginTransmission(sensor_addr); + Wire.write(0x20); // Регистр настройки порта 0 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x21); // Регистр настройки порта 1 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x22); // Регистр настройки порта 2 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x23); // Регистр настройки порта 3 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x24); // Регистр настройки порта 4 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x25); // Регистр настройки порта 5 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x26); // Регистр настройки порта 6 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x27); // Регистр настройки порта 7 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x28); // Регистр настройки порта 8 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x29); // Регистр настройки порта 9 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2A); // Регистр настройки порта 10 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2B); // Регистр настройки порта 11 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2C); // Регистр настройки порта 12 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2D); // Регистр настройки порта 13 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2E); // Регистр настройки порта 14 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2F); // Регистр настройки порта 15 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x30); // Регистр настройки порта 16 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x31); // Регистр настройки порта 17 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x32); // Регистр настройки порта 18 (подключен к оптическому сенсору) + Wire.write(0b00000000); // Сброс конфигурации порта + Wire.write(0b00000000); + Wire.endTransmission(); + delay(1000); + Wire.beginTransmission(sensor_addr); + Wire.write(0x20); // Регистр настройки порта 0 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x21); // Регистр настройки порта 1 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x22); // Регистр настройки порта 2 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x23); // Регистр настройки порта 3 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x24); // Регистр настройки порта 4 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x25); // Регистр настройки порта 5 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x26); // Регистр настройки порта 6 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x27); // Регистр настройки порта 7 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x28); // Регистр настройки порта 8 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x29); // Регистр настройки порта 9 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2A); // Регистр настройки порта 10 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2B); // Регистр настройки порта 11 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2C); // Регистр настройки порта 12 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2D); // Регистр настройки порта 13 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2E); // Регистр настройки порта 14 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x2F); // Регистр настройки порта 15 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x30); // Регистр настройки порта 16 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x31); // Регистр настройки порта 17 (подключен к оптическому сенсору) + Wire.write(0b01110001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + Wire.beginTransmission(sensor_addr); + Wire.write(0x32); // Регистр настройки порта 18 (подключен к оптическому сенсору) + Wire.write(0b01111001); // Диапазон входного напряжения 0 ... 10 В, встроенный ИОН, порт в режиме входа АЦП + Wire.write(0b11100000); // Порт не ассоциирован с другим портом, количество выборок АЦП - 128 + Wire.endTransmission(); + delay(1000); +} + +// Получение данных с датчика +void poll_sensor() { + int adc_sensor_data[38] = {0}; + Wire.beginTransmission(sensor_addr); + Wire.write(0x40); // Регистр данных АЦП + Wire.endTransmission(); + Wire.requestFrom(sensor_addr, 10); + if (Wire.available() == 10) + { + adc_sensor_data[0] = Wire.read(); + adc_sensor_data[1] = Wire.read(); // ADC03 + adc_sensor_data[2] = Wire.read(); + adc_sensor_data[3] = Wire.read(); // ADC04 + adc_sensor_data[4] = Wire.read(); // ADC02 + adc_sensor_data[5] = Wire.read(); + adc_sensor_data[6] = Wire.read(); // ADC03 + adc_sensor_data[7] = Wire.read(); + adc_sensor_data[8] = Wire.read(); // ADC04 + adc_sensor_data[9] = Wire.read(); + } + Wire.beginTransmission(sensor_addr); + Wire.write(0x45); // Регистр данных АЦП + Wire.endTransmission(); + Wire.requestFrom(sensor_addr, 10); + if (Wire.available() == 10) + { + adc_sensor_data[10] = Wire.read(); // ADC05 + adc_sensor_data[11] = Wire.read(); + adc_sensor_data[12] = Wire.read(); // ADC06 + adc_sensor_data[13] = Wire.read(); + adc_sensor_data[14] = Wire.read(); // ADC07 + adc_sensor_data[15] = Wire.read(); + adc_sensor_data[16] = Wire.read(); // ADC08 + adc_sensor_data[17] = Wire.read(); + adc_sensor_data[18] = Wire.read(); // ADC09 + adc_sensor_data[19] = Wire.read(); + } + Wire.beginTransmission(sensor_addr); + Wire.write(0x4A); // Регистр данных АЦП + Wire.endTransmission(); + Wire.requestFrom(sensor_addr, 10); + if (Wire.available() == 10) + { + adc_sensor_data[20] = Wire.read(); // ADC10 + adc_sensor_data[21] = Wire.read(); + adc_sensor_data[22] = Wire.read(); // ADC11 + adc_sensor_data[23] = Wire.read(); + adc_sensor_data[24] = Wire.read(); // ADC12 + adc_sensor_data[25] = Wire.read(); + adc_sensor_data[26] = Wire.read(); // ADC13 + adc_sensor_data[27] = Wire.read(); + adc_sensor_data[28] = Wire.read(); // ADC14 + adc_sensor_data[29] = Wire.read(); + } + Wire.beginTransmission(sensor_addr); + Wire.write(0x4F); // Регистр данных АЦП + Wire.endTransmission(); + Wire.requestFrom(sensor_addr, 8); + if (Wire.available() == 8) + { + adc_sensor_data[30] = Wire.read(); // ADC15 + adc_sensor_data[31] = Wire.read(); + adc_sensor_data[32] = Wire.read(); // ADC16 + adc_sensor_data[33] = Wire.read(); + adc_sensor_data[34] = Wire.read(); // ADC17 + adc_sensor_data[35] = Wire.read(); + adc_sensor_data[36] = Wire.read(); // ADC18 + adc_sensor_data[37] = Wire.read(); + } + values[0] = adc_sensor_data[30] * 256 + adc_sensor_data[31]; + values[1] = adc_sensor_data[28] * 256 + adc_sensor_data[29]; + values[2] = adc_sensor_data[26] * 256 + adc_sensor_data[27]; + values[3] = adc_sensor_data[24] * 256 + adc_sensor_data[25]; + values[4] = adc_sensor_data[22] * 256 + adc_sensor_data[23]; + values[5] = adc_sensor_data[20] * 256 + adc_sensor_data[21]; + values[6] = adc_sensor_data[18] * 256 + adc_sensor_data[19]; + values[7] = adc_sensor_data[16] * 256 + adc_sensor_data[17]; + values[8] = adc_sensor_data[14] * 256 + adc_sensor_data[15]; + values[9] = adc_sensor_data[12] * 256 + adc_sensor_data[13]; + values[10] = adc_sensor_data[10] * 256 + adc_sensor_data[11]; + values[11] = adc_sensor_data[8] * 256 + adc_sensor_data[9]; + values[12] = adc_sensor_data[6] * 256 + adc_sensor_data[7]; +} + +bool setBusChannel(uint8_t i2c_channel) // смена I2C порта +{ + if (i2c_channel >= MAX_CHANNEL) + { + return false; + } + else + { + Wire.beginTransmission(I2C_HUB_ADDR); + Wire.write(i2c_channel | EN_MASK); + Wire.endTransmission(); + return true; + } +} +int sum(uint16_t *sp){ + int count; + for (int i = 0;i < 13;i++){ + count += sp[i]; + } + return count; +} \ No newline at end of file diff --git a/Laboratory/Laboratory.ino b/Laboratory/Laboratory.ino new file mode 100644 index 0000000..5929466 --- /dev/null +++ b/Laboratory/Laboratory.ino @@ -0,0 +1,609 @@ +#define AP_SSID "" // имя точки доступа (WiFi) +#define AP_PASS "" // параль от точки доступа (WiFi) + +#include +GyverPortal ui; + +int i_1 = 0; +int i_2 = 0; +int i_3 = 0; +int i_4 = 0; +int i_5 = 0; +int i_6 = 0; +int i_7 = 0; +int i_8 = 0; +int i_9 = 0; +int i_10 = 0; +int i_11 = 0; +int i_12 = 0; +int i_13 = 0; +int i_14 = 0; +int i_15 = 0; +int i_16 = 0; + +String y = "Стабильно"; +String n = "Ошибка"; +String p = "Лаборатория"; +String num = "12"; +String of = "Выкл"; + +void build() { + GP.BUILD_BEGIN(GP_DARK); + GP.PAGE_TITLE("TAHK"); + + GP.UPDATE("c1,job_MGS-A6,lighting,temp,hud,pres,CO2,err_mode,err_chs, request_KomSer,position,volume_transp,volume_perekach,volume_save,LOS,lightning,tok,watt,giroscope,material_current,material_need,status_water,max_water,gercon_window,gercon_door,status_door,status_window,status_pump,status_wind,status_light"); + + GP.UI_BODY(); + + GP.GRID_RESPONSIVE(700); + + if (ui.uri("/")) { + + GP.TITLE("Панель управления"); + GP.HR(GP_VIOL_B); + + GP.BLOCK_BEGIN(GP_THIN, "100%", "Уведомления", GP_CYAN); + GP.TABLE_BORDER(true); + GP.TABLE_BEGIN(); + + GP.TR(); + GP.TD(); + GP.LABEL("Аварийный режим"); + GP.TD(); + GP.LABEL("NAN", "err_mode"); + + GP.TR(); + GP.TD(); + GP.LABEL("Режим ЧС"); + GP.TD(); + GP.LABEL("NAN", "err_chs"); + + GP.TR(); + GP.TD(); + GP.LABEL("Запрос ЦС"); + GP.TD(); + GP.LABEL("NAN", "request_KomSer"); + + GP.TABLE_END(); + GP.BLOCK_END(); + + GP.TITLE("Динамика"); + GP.HR(GP_VIOL_B); + GP.BLOCK_BEGIN(GP_THIN, "100%", "Управление роботом", GP_CYAN); + + + GP.BOX_BEGIN(GP_CENTER); + GP.LABEL("Геопозиция:"); + GP.LABEL("NAN", "position"); + GP.BOX_END(); + + GP.HR(); + + GP.BOX_BEGIN(GP_CENTER); + GP.LABEL("Переместиться в"); + GP.BOX_END(); + GP.BOX_BEGIN(GP_CENTER); + GP.BUTTON("btn_lab", "Лаборатория", "btn_lb", GP_VIOL); + GP.BUTTON("btn_kom", "Командный пункт", "btn_kp", GP_VIOL); + GP.BOX_END(); + + GP.BLOCK_END(); + + GP.TITLE("Лаборатория"); + GP.HR(GP_VIOL_B); + GP.BLOCK_BEGIN(GP_THIN, "100%", "Управление датчиками", GP_CYAN); + GP.TABLE_BORDER(true); + GP.TABLE_BEGIN(); + + GP.TR(); + GP.TD(); + GP.LABEL("MGS-A6"); + GP.TD(); + GP.SWITCH("job_MGS-A6", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("MGS-CLM60"); + GP.TD(); + GP.SWITCH("job_MGS-CLM60", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("MGS-WT1"); + GP.TD(); + GP.SWITCH("job_MGS-WT1", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("Поток воды"); + GP.TD(); + GP.SWITCH("job_water", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("MGS-D20"); + GP.TD(); + GP.SWITCH("job_MGS-D20", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("MGS-THP80"); + GP.TD(); + GP.SWITCH("job_MGS-THP80", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("MGS-L75"); + GP.TD(); + GP.SWITCH("job_MGS-L75", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("Датчик тока"); + GP.TD(); + GP.SWITCH("job_tok", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("MGS-CO30"); + GP.TD(); + GP.SWITCH("job_MGS-CO30", true, GP_VIOL); + + GP.TABLE_END(); + GP.BLOCK_END(); + + GP.BLOCK_BEGIN(GP_THIN, "100%", "Показания датчиков", GP_CYAN); + GP.TABLE_BORDER(true); + GP.TABLE_BEGIN(); + + GP.TR(); + GP.TD(); + GP.LABEL("Ресурс (нужный)"); + GP.TD(); + GPcolor color1(0, 0, 0); + GP.COLOR("color_need", color1, true); + + GP.TR(); + GP.TD(); + GP.LABEL("Ресурс (текущий)"); + GP.TD(); + GP.COLOR("color_current", color1, true); + + GP.TR(); + GP.TD(); + GP.LABEL("Объем (трансп.)"); + GP.TD(); + GP.LABEL("NAN", "volume_transp"); + + GP.TR(); + GP.TD(); + GP.LABEL("Статус перекачки"); + GP.TD(); + GP.LED("status_water"); + + GP.TR(); + GP.TD(); + GP.LABEL("Объем (перекач.)"); + GP.TD(); + GP.LABEL("NAN", "volume_perekach"); + + GP.TR(); + GP.TD(); + GP.LABEL("Объем (хранения)"); + GP.TD(); + GP.LABEL("NAN", "volume_save"); + + GP.TR(); + GP.TD(); + GP.LABEL("Перелив"); + GP.TD(); + GP.LABEL("NAN", "max_water"); + + GP.TR(); + GP.TD(); + GP.LABEL("ЛОС"); + GP.TD(); + GP.LABEL("NAN", "LOS"); + + GP.TR(); + GP.TD(); + GP.LABEL("CO2"); + GP.TD(); + GP.LABEL("NAN", "CO2"); + + GP.TR(); + GP.TD(); + GP.LABEL("Геркон+Окно"); + GP.TD(); + GP.LED("gercon_window"); + + GP.TR(); + GP.TD(); + GP.LABEL("Геркон+Дверь"); + GP.TD(); + GP.LED("gercon_door"); + + GP.TR(); + GP.TD(); + GP.LABEL("Освещенность"); + GP.TD(); + GP.LABEL("NAN", "lighting"); + + GP.TR(); + GP.TD(); + GP.LABEL("Датчик тока"); + GP.TD(); + GP.LABEL("NAN", "tok"); + + GP.TR(); + GP.TD(); + GP.LABEL("Ватт"); + GP.TD(); + GP.LABEL("NAN", "watt"); + + GP.TR(); + GP.TD(); + GP.LABEL("Гироскоп"); + GP.TD(); + GP.LABEL("num", "giroscope"); + + GP.TR(); + GP.TD(); + GP.LABEL("Давление"); + GP.TD(); + GP.LABEL("NAN", "pres"); + + GP.TR(); + GP.TD(); + GP.LABEL("Влажноть"); + GP.TD(); + GP.LABEL("NAN", "hud"); + + GP.TR(); + GP.TD(); + GP.LABEL("Температура"); + GP.TD(); + GP.LABEL("NAN", "temp"); + + GP.TABLE_END(); + GP.BLOCK_END(); + + GP.BLOCK_BEGIN(GP_THIN, "100%", "Дополнительные функции", GP_CYAN); + GP.TABLE_BORDER(true); + GP.TABLE_BEGIN(); + + GP.TR(); + GP.TD(); + GP.LABEL("Умное освещение"); + GP.TD(); + GP.SWITCH("work_light", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("Помпа"); + GP.TD(); + GP.SWITCH("work_pump", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("Вентилятор"); + GP.TD(); + GP.SWITCH("work_wind", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("Сервопривод (окно)"); + GP.TD(); + GP.SWITCH("work_servo-window", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("Сервопривод (дверь)"); + GP.TD(); + GP.SWITCH("work_servo-door", true, GP_VIOL); + + GP.TR(); + GP.TD(); + GP.LABEL("Светодиодная лента"); + GP.TD(); + GP.SWITCH("work_lamp", true, GP_VIOL); + + GP.TABLE_END(); + GP.BLOCK_END(); + + GP.TITLE("Обслуживание"); + GP.HR(GP_VIOL_B); + + GP.BLOCK_BEGIN(GP_THIN, "100%", "Статус датчиков", GP_CYAN); + GP.TABLE_BORDER(true); + GP.TABLE_BEGIN(); + + GP.TR(); + GP.TD(); + GP.LABEL("Дверь"); + GP.TD(); + GP.LED("status_door"); + + GP.TR(); + GP.TD(); + GP.LABEL("Окно"); + GP.TD(); + GP.LED("status_window"); + + GP.TR(); + GP.TD(); + GP.LABEL("Помпа"); + GP.TD(); + GP.LED("status_pump"); + + GP.TR(); + GP.TD(); + GP.LABEL("Вентилятор"); + GP.TD(); + GP.LED("status_wind"); + + GP.TR(); + GP.TD(); + GP.LABEL("Светодиодная лента"); + GP.TD(); + GP.LED("status_light"); + + GP.TABLE_END(); + GP.BLOCK_END(); + + GP.BUTTON("btn_service", "Выполнить проверку датчиков", "btn_check", GP_VIOL); + } + + GP.UI_END(); // завершить окно панели управления <<<<------------- + GP.BUILD_END(); +} + +void setup() { + Serial.begin(115200); + WiFi.mode(WIFI_STA); + WiFi.begin(AP_SSID, AP_PASS); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(WiFi.localIP()); + + ui.attachBuild(build); + ui.attach(action); + ui.start(); + + ui.enableAuth("admin", "1234"); +} + +void action() { + if (ui.click()) { + if (ui.click("c1")) Serial.println(ui.getString()); + if (ui.click("btn_lab")) { + Serial.println("btn to lab"); + } else if (ui.click("btn_kom")) { + Serial.println("btn to komand punkt"); + } else if (ui.click("btn_service")) { + i_16 = 1; + Serial.println("btn to service"); + } else if (ui.click("job_MGS-A6")) { + if (i_1 == 1) { + //if on + Serial.println("switch job_MGS-A6 - on"); + + i_1 = 0; + } else { + Serial.println("switch job_MGS-A6 - off"); + i_1 = 1; + } + } else if (ui.click("job_MGS-CLM60")) { + if (i_2 == 1) { + //if on + Serial.println("switch job_MGS-CLM60 - on"); + i_2 = 0; + } else { + Serial.println("switch job_MGS-CLM60 - off"); + i_2 = 1; + } + } else if (ui.click("job_MGS-WT1")) { + if (i_3 == 1) { + //if on + Serial.println("switch job_MGS-WT1 - on"); + i_3 = 0; + } else { + Serial.println("switch job_MGS-WT1 - off"); + i_3 = 1; + } + } else if (ui.click("job_water")) { + if (i_4 == 1) { + //if on + Serial.println("switch job_water - on"); + i_4 = 0; + } else { + Serial.println("switch job_water - off"); + i_4 = 1; + } + } else if (ui.click("job_MGS-D20")) { + if (i_5 == 1) { + //if on + Serial.println("switch job_MGS-D20 - on"); + i_5 = 0; + } else { + Serial.println("switch job_MGS-D20 - off"); + i_5 = 1; + } + } else if (ui.click("job_MGS-THP80")) { + if (i_6 == 1) { + Serial.println("switch job_MGS-THP80 - on"); + i_6 = 0; + } else { + Serial.println("switch job_MGS-THP80 - off"); + i_6 = 1; + } + } else if (ui.click("job_MGS-L75")) { + if (i_7 == 1) { + Serial.println("switch job_MGS-L75 - on"); + i_7 = 0; + } else { + Serial.println("switch job_MGS-L75 - off"); + i_7 = 1; + } + } else if (ui.click("job_tok")) { + if (i_8 == 1) { + Serial.println("switch job_tok - on"); + i_8 = 0; + } else { + Serial.println("switch job_tok - off"); + i_8 = 1; + } + } else if (ui.click("job_MGS-CO30")) { + if (i_9 == 1) { + Serial.println("switch job_MGS-CO30 - on"); + i_9 = 0; + } else { + Serial.println("switch job_MGS-CO30 - off"); + i_9 = 1; + } + } else if (ui.click("work_pump")) { + if (i_10 == 1) { + Serial.println("switch work_pump - on"); + i_10 = 0; + } else { + Serial.println("switch work_pump - off"); + i_10 = 1; + } + } else if (ui.click("work_light")) { + if (i_11 == 1) { + Serial.println("switch work_light - on"); + i_11 = 0; + } else { + Serial.println("switch work_light - off"); + i_11 = 1; + } + } else if (ui.click("work_wind")) { + if (i_12 == 1) { + //if on + Serial.println("switch work_wind - on"); + i_12 = 0; + } else { + Serial.println("switch work_wind - off"); + i_12 = 1; + } + } else if (ui.click("work_servo-window")) { + if (i_13 == 1) { + //if on + Serial.println("switch work_servo-window - on"); + i_13 = 0; + } else { + Serial.println("switch work_servo-window - off"); + i_13 = 1; + } + } else if (ui.click("work_servo-door")) { + if (i_14 == 1) { + //if on + Serial.println("switch work_servo-door - on"); + i_14 = 0; + } else { + Serial.println("switch work_servo-door - off"); + i_14 = 1; + } + } else if (ui.click("work_lamp")) { + if (i_15 == 1) { + //if on + Serial.println("switch work_lamp - on"); + i_15 = 0; + } else { + Serial.println("switch work_lamp - off"); + i_15 = 1; + } + } + } + + if (ui.update()) { + ui.updateString("err_mode", y); + ui.updateString("err_chs", y); + ui.updateString("request_KomSer", n); + if (i_4 == 0) { + ui.updateString("volume_perekach", num); + } else { + ui.updateString("volume_perekach", of); + } + ui.updateString("position", p); + if (i_5 == 0) { + ui.updateString("volume_transp", num); + } else { + ui.updateString("volume_transp", of); + } + if (i_9 == 0) { + ui.updateString("LOS", num); + ui.updateString("CO2", num); + } else { + ui.updateString("LOS", of); + ui.updateString("CO2", of); + } + if (i_7 == 0) { + ui.updateString("lighting", num); + } else { + ui.updateString("lighting", of); + } + if (i_8 == 0) { + ui.updateString("tok", num); + ui.updateString("watt", num); + } else { + ui.updateString("tok", of); + ui.updateString("watt", of); + } + + if (i_1 == 0) { + ui.updateString("giroscope", num); + } else { + ui.updateString("giroscope", of); + } + if (i_6 == 0) { + ui.updateString("pres", num); + ui.updateString("hud", num); + ui.updateString("temp", num); + } else { + ui.updateString("pres", of); + ui.updateString("hud", of); + ui.updateString("temp", of); + } + if (i_2 == 0) { + if (ui.update("material_current")) ui.answer("Ожидание"); + } else { + if (ui.update("material_current")) ui.answer(of); + } + if (i_10 == 0) { + if (ui.update("status_water")) ui.answer(true); + } else { + if (ui.update("status_water")) ui.answer(false); + } + if (i_3 == 0) { + if (ui.update("max_water")) ui.answer("Работает"); + ui.updateString("volume_save", num); + } else { + if (ui.update("max_water")) ui.answer(of); + ui.updateString("volume_save", of); + } + if (i_13 == 0) { + if (ui.update("gercon_window")) ui.answer(true); + } else { + if (ui.update("gercon_window")) ui.answer(false); + } + + if (i_14 == 0) { + if (ui.update("gercon_door")) ui.answer(true); + } else { + if (ui.update("gercon_door")) ui.answer(false); + } + + if (ui.update("status_door")) ui.answer(0); + if (ui.update("status_window")) ui.answer(0); + if (ui.update("status_pump")) ui.answer(0); + if (ui.update("status_wind")) ui.answer(0); + if (ui.update("status_light")) ui.answer(0); + } +} + +void loop() { + ui.tick(); +} \ No newline at end of file