Відповісти

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

Назад

Огляд теми (нові повідомленні вгорі)

Олег02
2023-06-13 18:04:58

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

akapulko
2023-06-07 09:39:51
Vitaliy_D пише:

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

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

Vitaliy_D
2023-06-07 09:25:24

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

akapulko
2023-06-06 22:33:38
Vitaliy_D пише:

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

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

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

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

chatGPT
2023-06-06 22:09:56

Цих кодів в інтернеті для лічильників води - цистерна і маленький стаканчик. 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);
}
Vitaliy_D
2023-06-06 14:35:03

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

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

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

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