Ви не увійшли.
Сторінки 1
Вітаю! Допоможіть новачку вирішити наступне завдання:
Є кілька ємностей для води. Потрібно в них наливати певну к-сть води, завжди різну.
Як я це бачу:
Стійка оператора, з клавіатурою та простим дисплеем. На клавіатурі вибирається номер ємкості та кількість літрів. Програматор посилає сигнал на електромагнітний клапан (нормально закритий), що стоїть на магістралі відповідної ємності. Клапан відкривається, вода починає проходити через розходомір води. Після проходження необхідної кількості води знімається живлення з клапану і він закривається. Потрібно, щоб одночасно можна було набирати в кілька ємкостей (до 6), тобто керувати кількома релюшками.
Хто може допомогти підібрати необхідні деталі та запрограмувати НА ПЛАТНІЙ основі?
Остання редакція Vitaliy_D (2023-06-06 16:17:05)
Неактивний
Цих кодів в інтернеті для лічильників води - цистерна і маленький стаканчик. Навітья я можу написати такий код:
#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);
}
Вітаю! Допоможіть новачку вирішити наступне завдання:
Є кілька ємностей для води. Потрібно в них наливати певну к-сть води, завжди різну.
Як я це бачу:
Стійка оператора, з клавіатурою та простим дисплеем. На клавіатурі вибирається номер ємкості та кількість літрів. Програматор посилає сигнал на електромагнітний клапан (нормально закритий), що стоїть на магістралі відповідної ємності. Клапан відкривається, вода починає проходити через розходомір води. Після проходження необхідної кількості води знімається живлення з клапану і він закривається. Потрібно, щоб одночасно можна було набирати в кілька ємкостей (до 6), тобто керувати кількома релюшками.Хто може допомогти підібрати необхідні деталі та запрограмувати НА ПЛАТНІЙ основі?
Яке місто? Який бюджет?
Чернівці, бюджет озвучте
Нажаль далеко від мене. Я не знаю ваших купівельних спроможностей
Вам надо расписать особенности производства. Стандарты учесть. Влагозащиту ту же например и многое другое. Какой бы простой не казалась программа (например подергать реле или клапаном) всегда есть "особенности". + сопроводительная документация, + поддержка. Если проект - не полив домашних растений с питанием от повербанка - подходите к задаче по взрослому.
Сторінки 1