#1 2023-06-06 14:35:03

Vitaliy_D
Учасник
Зареєстрований: 2023-06-06
Повідомлень: 2

Програмування на виробницві.

Вітаю! Допоможіть новачку вирішити наступне завдання:

Є кілька ємностей для води. Потрібно в них наливати певну к-сть води, завжди різну.
Як я це бачу:
Стійка оператора, з клавіатурою та простим дисплеем. На клавіатурі вибирається номер ємкості та кількість літрів. Програматор посилає сигнал на електромагнітний клапан (нормально закритий), що стоїть на магістралі відповідної ємності. Клапан відкривається, вода починає проходити через розходомір води. Після проходження необхідної кількості води знімається живлення з клапану і він закривається. Потрібно, щоб одночасно можна було набирати в кілька ємкостей (до 6), тобто керувати кількома релюшками.

Хто може допомогти підібрати необхідні деталі та запрограмувати НА ПЛАТНІЙ основі?

Остання редакція Vitaliy_D (2023-06-06 16:17:05)

Неактивний

#2 2023-06-06 22:09:56

chatGPT
Гість

Re: Програмування на виробницві.

Цих кодів в інтернеті для лічильників води - цистерна і маленький стаканчик. smile Навітья я можу написати такий код:

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

const int NUM_CONTAINERS = 6;
const int PULSE_PINS[NUM_CONTAINERS] = {2, 3, 4, 5, 6, 7};
const int VALVE_PINS[NUM_CONTAINERS] = {8, 9, 10, 11, 12, 13};
const float PULSES_PER_LITER = 1000.0; // Кількість пульсів на один літр

LiquidCrystal_I2C lcd(0x27, 16, 2); // Адреса та розмір LCD дисплея
Keypad keypad(A0, A1, A2, A3, A4, A5); // Піни клавіатури

volatile float litersRemaining[NUM_CONTAINERS];
volatile bool valvesOpen[NUM_CONTAINERS];
volatile unsigned long pulses[NUM_CONTAINERS];

void setup() {
  lcd.begin(16, 2);
  lcd.print("Water Dispenser");
  attachInterrupt(digitalPinToInterrupt(PULSE_PINS[0]), countPulse0, FALLING);
  attachInterrupt(digitalPinToInterrupt(PULSE_PINS[1]), countPulse1, FALLING);
  attachInterrupt(digitalPinToInterrupt(PULSE_PINS[2]), countPulse2, FALLING);
  attachInterrupt(digitalPinToInterrupt(PULSE_PINS[3]), countPulse3, FALLING);
  attachInterrupt(digitalPinToInterrupt(PULSE_PINS[4]), countPulse4, FALLING);
  attachInterrupt(digitalPinToInterrupt(PULSE_PINS[5]), countPulse5, FALLING);
  for (int i = 0; i < NUM_CONTAINERS; i++) {
    litersRemaining[i] = 0.0;
    valvesOpen[i] = false;
    pinMode(VALVE_PINS[i], OUTPUT);
    digitalWrite(VALVE_PINS[i], HIGH);  // Закриття клапану
  }
}

void loop() {
  char key = keypad.getKey();

  if (key != NO_KEY) {
    switch (key) {
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
        selectContainer(key - '1');
        break;
      case '#':
        dispenseWater();
        break;
      default:
        break;
    }
  }
}

void selectContainer(int containerIndex) {
  lcd.clear();
  lcd.print("Container: ");
  lcd.print(containerIndex + 1);

  lcd.setCursor(0, 1);
  lcd.print("Liters: ");

  char litersInput[4];
  int i = 0;

  while (true) {
    char key = keypad.getKey();
    if (key != NO_KEY && key != '#' && i < 3) {
      lcd.setCursor(8 + i, 1);
      lcd.print(key);
      litersInput[i] = key;
      i++;
    } else if (key == '#') {
      litersInput[i] = '';
      float liters = atof(litersInput);
      litersRemaining[containerIndex] = liters;
      lcd.clear();
      lcd.print("Ready to dispense");
      delay(1000);
      lcd.clear();
      break;
    }
  }
}

void dispenseWater() {
  lcd.clear();
  lcd.print("Dispensing...");

  for (int i = 0; i < NUM_CONTAINERS; i++) {
    if (valvesOpen[i] && litersRemaining[i] > 0.0) {
      pulses[i] = 0;
      digitalWrite(VALVE_PINS[i], LOW); // Відкриття клапану
    }
  }

  while (true) {
    bool allContainersEmpty = true;
    for (int i = 0; i < NUM_CONTAINERS; i++) {
      if (valvesOpen[i] && litersRemaining[i] > 0.0) {
        allContainersEmpty = false;
        break;
      }
    }

    if (allContainersEmpty) {
      for (int i = 0; i < NUM_CONTAINERS; i++) {
        if (valvesOpen[i]) {
          digitalWrite(VALVE_PINS[i], HIGH); // Закриття клапану
          valvesOpen[i] = false;
        }
      }
      lcd.clear();
      lcd.print("Dispensing done");
      delay(2000);
      lcd.clear();
      break;
    }
  }
}

void countPulse0() {
  pulses[0]++;
  litersRemaining[0] -= (1.0 / PULSES_PER_LITER);
}

void countPulse1() {
  pulses[1]++;
  litersRemaining[1] -= (1.0 / PULSES_PER_LITER);
}

void countPulse2() {
  pulses[2]++;
  litersRemaining[2] -= (1.0 / PULSES_PER_LITER);
}

void countPulse3() {
  pulses[3]++;
  litersRemaining[3] -= (1.0 / PULSES_PER_LITER);
}

void countPulse4() {
  pulses[4]++;
  litersRemaining[4] -= (1.0 / PULSES_PER_LITER);
}

void countPulse5() {
  pulses[5]++;
  litersRemaining[5] -= (1.0 / PULSES_PER_LITER);
}

#3 2023-06-06 22:33:38

akapulko
Гість

Re: Програмування на виробницві.

Vitaliy_D пише:

Вітаю! Допоможіть новачку вирішити наступне завдання:

Є кілька ємностей для води. Потрібно в них наливати певну к-сть води, завжди різну.
Як я це бачу:
Стійка оператора, з клавіатурою та простим дисплеем. На клавіатурі вибирається номер ємкості та кількість літрів. Програматор посилає сигнал на електромагнітний клапан (нормально закритий), що стоїть на магістралі відповідної ємності. Клапан відкривається, вода починає проходити через розходомір води. Після проходження необхідної кількості води знімається живлення з клапану і він закривається. Потрібно, щоб одночасно можна було набирати в кілька ємкостей (до 6), тобто керувати кількома релюшками.

Хто може допомогти підібрати необхідні деталі та запрограмувати НА ПЛАТНІЙ основі?

Яке місто? Який бюджет?

#4 2023-06-07 09:25:24

Vitaliy_D
Учасник
Зареєстрований: 2023-06-06
Повідомлень: 2

Re: Програмування на виробницві.

Чернівці, бюджет озвучте

Неактивний

#5 2023-06-07 09:39:51

akapulko
Гість

Re: Програмування на виробницві.

Vitaliy_D пише:

Чернівці, бюджет озвучте

Нажаль далеко від мене. Я не знаю ваших купівельних спроможностей

#6 2023-06-13 18:04:58

Олег02
Гість

Re: Програмування на виробницві.

Вам надо расписать особенности производства. Стандарты учесть. Влагозащиту ту же например и многое другое. Какой бы простой не казалась программа (например подергать реле или клапаном) всегда есть "особенности". + сопроводительная документация, + поддержка. Если проект - не полив домашних растений с питанием от повербанка - подходите к задаче по взрослому.

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму