Создание "контроллера" Мини бетонного завода

Привет всем, задался целью сделать для ускорения производства мини рбу. Суть простая, в бункеры нагружается песок и щебень, открываются окошки внизу, всё падает на весы, а потом закидывается в мешалку, ну и цемент и вода само собой. Собственно проблем ”пока” не встретил, но вот вопрос. Задача ардуино тут просто “знать” Рецепты и соответственно проделывать всё операции. Программу уже написали( с помощью нейросети) на коленке всё работает. Вопрос простой, потянет ли ардуино в этом деле, просто уже после того как программу написали, начали попадаться более мощные контроллеры, но нужны ли они? В том плане я не понял, есть ли у них лучшие защиты от наводок(помех) и всего остального. Самая “сложная” Задача у ардуино, включать 11квт двигатель(естественно ступенчато) а остальное вроде сильно проще. Кому интересно могу скинуть скетч, или видео, как это работает “на коленке”.

конечно скидывайте, как минимум скетч, и видео если можно, и схему подключения…

Поржём …

2 лайка

во что вообще превращается этот форум? :thinking:

1 лайк

Видео получилось только она ютуб залить, сюда не хочет, если нельзя ссылки на ютуб, скажите, я удалю. Просто гляньте как работает, и что посоветуете.

кхе кхе вот так исходный код))) надеюсь все правильно скопировал! вооо если понадобится кому

‘#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include “HX711.h”
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h>

// ==========================================
// — НАСТРОЙКИ (РЕДАКТИРОВАТЬ ЗДЕСЬ) —
// ==========================================

const int SD_CS_PIN = 53;

// — НАСТРОЙКА ЛАМПЫ ОЖИДАНИЯ —
// 0 = Лампа горит постоянно (не мигает) в режиме ожидания.
// 1000 = Мигает раз в 1 секунду. 500 = Быстро. 2000 = Медленно.
const unsigned long IDLE_LAMP_SPEED = 1000;

// Дозирование
const float DOSING_THRESHOLD = 0.70;
const int PULSE_ON_MS = 300;
const int PULSE_OFF_MS = 1000;

// Конвейер
const int CONVEYOR_SMART_SHIFT_TIME = 2000;
const int TIME_MOVE_AFTER_STONE = 20;
const int TIME_MOVE_AFTER_SAND = 20;

// ==========================================

LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 rtc;

// — ПЕРЕМЕННЫЕ СТАТУСА —
int sdState = 0; // 0=Fail, 1=OK, 2=WriteError
bool needScreenClear = true;
int waterPercent = 100;

// — KEYPAD —
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{‘1’,‘4’,‘7’,‘*’},
{‘2’,‘5’,‘8’,‘0’},
{‘3’,‘6’,‘9’,‘#’},
{‘A’,‘B’,‘C’,‘D’}
};
byte rowPins[ROWS] = {11, 10, 9, 8};
byte colPins[COLS] = {7, 6, 5, 4};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// — SENSORS —
const int LOADCELL_DOUT_PIN = A12;
const int LOADCELL_SCK_PIN = A13;
HX711 scale;
float SCALE_CALIBRATION = 420.0;

const int FLOW_SENSOR_PIN = 2;
volatile unsigned long flowPulseCount = 0;
float FLOW_CALIBRATION = 4.5;

// — RELAYS —
const int RELAY_STONE_1 = 22;
const int RELAY_SAND = 23;
const int RELAY_WATER = 24;
const int RELAY_CEMENT = 25;
const int RELAY_CONVEYOR = 26;
const int RELAY_CEM_VALVE = 27;
const int RELAY_IDLE_LAMP = 28;
const int RELAY_MIXER = 29;

// — BUTTONS —
const int BTN_EXT_START = 3;
const int BTN_EMERGENCY = 30;

// — LOGIC —
bool isSystemIdle = true;
unsigned long lastLampTime = 0; // Таймер для лампы
unsigned long lastScreenTime = 0; // Таймер для часов на экране
bool lampState = false;
unsigned long batchCounter = 0;

String product[3][5] = {
{“Ring 1m”, “Ring 1,5m”, “Ring 2m”, “Kryshka”, “Dnishe”},
{“Block S”, “Block M”, “Block L”, “”, “”},
{“Beton M100”, “Beton M150”, “Beton M200”, “Beton M250”, “Beton M300”}
};
String productTypes = {“Kolca”, “Bloki”, “Beton”};

int mainMenu = -1;
int subMenu = -1;
int lastMainMenu = -1;
int lastSubMenu = -1;

struct Recipe {
int stone1;
int sand;
int water;
int cement;
};
Recipe currentRecipe;

// — PROTOTYPES —
void pulseCounterISR();
void runBatch();
float performStep(String stepName, int targetValue, int relayPin, bool isWater, bool useConveyor);
void runUnload(String name, int relayPin, int seconds);
void displayInfo(String info);
void updateIdleScreen();
void printTwoDigits(int number);
void checkExternalButton();
bool checkGlobalStop();
void logToSD_Full(String prodName, float s1_act, float sand_act, int w_plan, float w_act, float cem_act);
void viewLogs();

void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();

pinMode(RELAY_STONE_1, OUTPUT);
pinMode(RELAY_SAND, OUTPUT);
pinMode(RELAY_WATER, OUTPUT);
pinMode(RELAY_CEMENT, OUTPUT);
pinMode(RELAY_CONVEYOR, OUTPUT);
pinMode(RELAY_CEM_VALVE, OUTPUT);
pinMode(RELAY_IDLE_LAMP, OUTPUT);
pinMode(RELAY_MIXER, OUTPUT);

pinMode(BTN_EXT_START, INPUT_PULLUP);
pinMode(BTN_EMERGENCY, INPUT_PULLUP);

digitalWrite(RELAY_STONE_1, HIGH);
digitalWrite(RELAY_SAND, HIGH);
digitalWrite(RELAY_WATER, HIGH);
digitalWrite(RELAY_CEMENT, HIGH);
digitalWrite(RELAY_CONVEYOR, HIGH);
digitalWrite(RELAY_CEM_VALVE, HIGH);
digitalWrite(RELAY_IDLE_LAMP, HIGH);
digitalWrite(RELAY_MIXER, HIGH);

if (!rtc.begin()) {
lcd.setCursor(0, 0); lcd.print(“RTC Error!”); delay(2000);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(DATE), F(TIME)));
}

lcd.setCursor(0, 0); lcd.print(“Init Scales…”);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
if (scale.wait_ready_timeout(2000)) {
scale.set_scale(SCALE_CALIBRATION); scale.tare();
} else {
lcd.setCursor(0, 1); lcd.print(“Scale Error!”); delay(2000);
}

lcd.setCursor(0, 1); lcd.print(“Init SD Card…”);
if (!SD.begin(SD_CS_PIN)) {
lcd.setCursor(0, 2); lcd.print(“SD Fail/No Card”);
sdState = 0; delay(2000);
} else {
lcd.setCursor(0, 2); lcd.print(“SD Card OK!”);
sdState = 1;
if (!SD.exists(“log_full.csv”)) {
File dataFile = SD.open(“log_full.csv”, FILE_WRITE);
if (dataFile) {
dataFile.println(“Date;Time;ID;Product;Stone_Plan;Stone_Fact;Sand_Plan;Sand_Fact;Water_Plan;Water_Fact;Cement_Plan;Cement_Fact”);
dataFile.close();
}
}
delay(1000);
}

pinMode(FLOW_SENSOR_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(FLOW_SENSOR_PIN), pulseCounterISR, RISING);

lcd.clear();
isSystemIdle = true;
}

void pulseCounterISR() {
flowPulseCount++;
}

void loop() {
if (checkGlobalStop()) return;
updateIdleScreen();
checkExternalButton();
char key = keypad.getKey();
if (key) {
buttonPress(key);
}
}

// — ОБНОВЛЕННАЯ ФУНКЦИЯ ЭКРАНА И ЛАМПЫ —
void updateIdleScreen() {
if (!isSystemIdle) return;

// 1. Отрисовка статики при входе
if (needScreenClear) {
lcd.clear();
lcd.setCursor(0, 0); lcd.print(“Vyberite regim:”);
needScreenClear = false;
}

unsigned long currentMillis = millis();

// 2. Логика ЛАМПЫ (Отдельный таймер)
if (IDLE_LAMP_SPEED == 0) {
// Если 0 - просто включить (LOW)
digitalWrite(RELAY_IDLE_LAMP, LOW);
} else {
// Если задана скорость - мигаем
if (currentMillis - lastLampTime > IDLE_LAMP_SPEED) {
lastLampTime = currentMillis;
lampState = !lampState;
digitalWrite(RELAY_IDLE_LAMP, lampState ? LOW : HIGH);
}
}

// 3. Логика ОБНОВЛЕНИЯ ЭКРАНА (Часы) - Раз в 1 сек
if (currentMillis - lastScreenTime > 1000) {
lastScreenTime = currentMillis;

  // ВРЕМЯ (Стр 2)
  DateTime now = rtc.now();
  lcd.setCursor(0, 1);
  printTwoDigits(now.day()); lcd.print('/');
  printTwoDigits(now.month()); lcd.print('/');
  lcd.print(now.year() % 100); 
  lcd.print(" ");
  printTwoDigits(now.hour()); lcd.print(':');
  printTwoDigits(now.minute()); lcd.print(':');
  printTwoDigits(now.second());

  // СТАТУС SD (Стр 3)
  lcd.setCursor(0, 2);
  lcd.print("SD:");
  if (sdState == 1) lcd.print("OK  ");
  else if (sdState == 0) lcd.print("ERR ");
  else if (sdState == 2) lcd.print("WR! ");
  
  // ВОДА И МЕНЮ (Стр 4)
  lcd.setCursor(0, 3);
  lcd.print("H2O:");
  if (waterPercent < 100) lcd.print(" "); 
  lcd.print(waterPercent);
  lcd.print("% A-Go D-Log");

}
}

void printTwoDigits(int number) {
if (number < 10) lcd.print(“0”);
lcd.print(number);
}

// — ПРОСМОТР ЛОГОВ —
void viewLogs() {
isSystemIdle = false;
digitalWrite(RELAY_IDLE_LAMP, HIGH); // Гасим лампу при входе

lcd.clear();
lcd.print(“Reading Logs…”);

File dataFile = SD.open(“log_full.csv”);
if (!dataFile) {
lcd.setCursor(0, 1); lcd.print(“SD Error”);
sdState = 0; delay(2000); needScreenClear = true; isSystemIdle = true; return;
} else { sdState = 1; }

unsigned long totalLines = 0;
while (dataFile.available()) {
if (dataFile.read() == ‘\n’) totalLines++;
}

if (totalLines < 2) {
lcd.setCursor(0, 1); lcd.print(“Log Empty”);
dataFile.close(); delay(2000); needScreenClear = true; isSystemIdle = true; return;
}

unsigned long currentLineIndex = totalLines - 1;
bool showDetails = false;

while (true) {
dataFile.close();
dataFile = SD.open(“log_full.csv”);

unsigned long linesToSkip = currentLineIndex; 
String line = "";
unsigned long currentSeek = 0;
while (dataFile.available()) {
   char c = dataFile.read();
   if (c == '\n') {
     currentSeek++;
     if (currentSeek > linesToSkip) break; 
     line = ""; 
   } else { if (currentSeek == linesToSkip) line += c; }
}

String tokens[12]; 
int tokenIdx = 0;
int lastDelimiter = -1;
for (int i = 0; i < line.length(); i++) {
  if (line[i] == ';') {
    if (tokenIdx < 12) {
       tokens[tokenIdx] = line.substring(lastDelimiter + 1, i);
       tokenIdx++;
    }
    lastDelimiter = i;
  }
}
if (tokenIdx < 12) tokens[tokenIdx] = line.substring(lastDelimiter + 1);

lcd.clear();
if (tokens[2].length() > 0) { 
    if (!showDetails) {
      lcd.setCursor(0, 0); lcd.print("#"); lcd.print(tokens[2]); lcd.print(" "); lcd.print(tokens[1]); 
      lcd.setCursor(0, 1); lcd.print(tokens[0]); 
      lcd.setCursor(0, 2); lcd.print(tokens[3]); 
      lcd.setCursor(0, 3); lcd.print("<2 8> (5-More) C-Ex");
    } else {
      lcd.setCursor(0, 0); lcd.print("St:"); lcd.print(tokens[5]); lcd.print(" Sd:"); lcd.print(tokens[7]); 
      lcd.setCursor(0, 1); lcd.print("Wt:"); lcd.print(tokens[9]); lcd.print(" Cm:"); lcd.print(tokens[11]); 
      lcd.setCursor(0, 3); lcd.print("Back: Press 5");
    }
} else { lcd.print("Read Error"); }

char key = 0;
while(key == 0) {
   key = keypad.getKey();
   if (checkGlobalStop()) { dataFile.close(); return; } 
}

if (key == '2') { if (currentLineIndex > 1) currentLineIndex--; }
else if (key == '8') { if (currentLineIndex < totalLines - 1) currentLineIndex++; }
else if (key == '5') { showDetails = !showDetails; }
else if (key == 'C' || key == '#') { 
   dataFile.close(); needScreenClear = true; isSystemIdle = true; return;
}

}
}

// — ЗАПИСЬ В ФАЙЛ —
void logToSD_Full(String prodName, float s1_act, float sand_act, int w_plan, float w_act, float cem_act) {
File dataFile = SD.open(“log_full.csv”, FILE_WRITE);

if (dataFile) {
sdState = 1;
DateTime now = rtc.now();
batchCounter++;

dataFile.print(now.year(), DEC); dataFile.print('/');
dataFile.print(now.month(), DEC); dataFile.print('/');
dataFile.print(now.day(), DEC); dataFile.print(";");

dataFile.print(now.hour(), DEC); dataFile.print(':');
dataFile.print(now.minute(), DEC); dataFile.print(':');
dataFile.print(now.second(), DEC); dataFile.print(";");

dataFile.print(batchCounter); dataFile.print(";");
dataFile.print(prodName); dataFile.print(";");

dataFile.print(currentRecipe.stone1); dataFile.print(";");
dataFile.print(s1_act); dataFile.print(";");

dataFile.print(currentRecipe.sand); dataFile.print(";");
dataFile.print(sand_act); dataFile.print(";");

dataFile.print(w_plan); dataFile.print(";"); 
dataFile.print(w_act); dataFile.print(";");

dataFile.print(currentRecipe.cement); dataFile.print(";");
dataFile.println(cem_act); 

dataFile.close();

} else {
sdState = 2;
}
}

bool checkGlobalStop() {
char key = keypad.getKey();
if (digitalRead(BTN_EMERGENCY) == LOW) {
digitalWrite(RELAY_STONE_1, HIGH);
digitalWrite(RELAY_SAND, HIGH);
digitalWrite(RELAY_WATER, HIGH);
digitalWrite(RELAY_CEMENT, HIGH);
digitalWrite(RELAY_CONVEYOR, HIGH);
digitalWrite(RELAY_CEM_VALVE, HIGH);
digitalWrite(RELAY_MIXER, HIGH);
digitalWrite(RELAY_IDLE_LAMP, HIGH);

lcd.clear();
lcd.print("!!! EMERGENCY !!!");
lcd.setCursor(0, 1);
lcd.print("STOP PRESSED");

while(digitalRead(BTN_EMERGENCY) == LOW) { delay(100); }

delay(2000);
needScreenClear = true; 
mainMenu = -1;
subMenu = -1;
isSystemIdle = true;
return true; 

}
return false;
}

void checkExternalButton() {
if (digitalRead(BTN_EXT_START) == LOW && isSystemIdle) {
delay(50);
if (digitalRead(BTN_EXT_START) == LOW) {
buttonPress(‘B’);
while(digitalRead(BTN_EXT_START) == LOW);
}
}
}

void buttonPress(char button) {
// ВОДА (* / #)
if (isSystemIdle && mainMenu == -1) {
if (button == ‘*’) {
waterPercent -= 5;
if (waterPercent < 10) waterPercent = 10;
needScreenClear = true; // Перерисовать
updateIdleScreen();
return;
}
if (button == ‘#’) {
waterPercent += 5;
if (waterPercent > 200) waterPercent = 200;
needScreenClear = true;
updateIdleScreen();
return;
}
}

if (button == ‘A’) {
if (mainMenu != -1 && subMenu != -1) {
lastMainMenu = mainMenu;
lastSubMenu = subMenu;
chooseProgram(mainMenu, subMenu);
} else { displayInfo(“Regim ne vybran”); delay(1000); needScreenClear = true; }
}
else if (button == ‘B’) {
if (lastMainMenu != -1 && lastSubMenu != -1) {
mainMenu = lastMainMenu;
subMenu = lastSubMenu;
chooseProgram(mainMenu, subMenu);
} else { displayInfo(“Istorii net”); delay(1000); needScreenClear = true; }
}
else if (button == ‘D’) {
viewLogs();
}
else if (button == ‘C’) {
mainMenu = -1;
subMenu = -1;
displayInfo(“SBROS…”);
delay(1000);
needScreenClear = true;
isSystemIdle = true;
}
else {
if (button >= ‘0’ && button <= ‘9’) {
needScreenClear = false;
isSystemIdle = false;
digitalWrite(RELAY_IDLE_LAMP, HIGH);

  int num = button - '0';
  int index = num - 1; 
  if (index < 0 || index > 8) return;
  if (mainMenu == -1) {
    if (index >= 0 && index < 3) {
      mainMenu = index;
      subMenu = -1;
      lcd.clear();
      lcd.print("Type: ");
      lcd.print(productTypes[mainMenu]);
    }
  } else {
    if (index >= 0 && index < 5 && product[mainMenu][index] != "") {
       subMenu = index;
       lcd.clear();
       lcd.print("Prod: ");
       lcd.print(product[mainMenu][subMenu]);
       lcd.setCursor(0,1);
       lcd.print("A - Start");
    }
  }
}

}
}

void chooseProgram(int mainM, int subM) {
isSystemIdle = false;
digitalWrite(RELAY_IDLE_LAMP, HIGH);

if (mainM == 0 && subM == 0) { // Ring 1m
currentRecipe = {500, 300, 30, 50};
}
else if (mainM == 0 && subM == 1) { // Ring 1.5m
currentRecipe = {700, 400, 45, 70};
}
else {
currentRecipe = {5, 5, 2, 2};
}

lcd.clear();
lcd.print(“Start Batch…”);
delay(1000);
runBatch();
}

void runBatch() {
float realStone = 0, realSand = 0, realWater = 0, realCement = 0;

realStone = performStep(“Scheben”, currentRecipe.stone1, RELAY_STONE_1, false, true);
if (isSystemIdle) { needScreenClear = true; return; }

runUnload(“Move Stone ->”, RELAY_CONVEYOR, TIME_MOVE_AFTER_STONE);
if (isSystemIdle) { needScreenClear = true; return; }

realSand = performStep(“Pesok”, currentRecipe.sand, RELAY_SAND, false, true);
if (isSystemIdle) { needScreenClear = true; return; }

runUnload(“Move Sand ->”, RELAY_CONVEYOR, TIME_MOVE_AFTER_SAND);
if (isSystemIdle) { needScreenClear = true; return; }

int correctedWater = currentRecipe.water * (waterPercent / 100.0);
realWater = performStep(“Voda”, correctedWater, RELAY_WATER, true, false);
if (isSystemIdle) { needScreenClear = true; return; }

realCement = performStep(“Cement”, currentRecipe.cement, RELAY_CEMENT, false, false);
if (isSystemIdle) { needScreenClear = true; return; }

lcd.clear();
lcd.print(“Saving Log…”);
logToSD_Full(product[mainMenu][subMenu], realStone, realSand, correctedWater, realWater, realCement);
delay(500);

runUnload(“Vygruzka Cem.”, RELAY_CEM_VALVE, 10);
if (isSystemIdle) { needScreenClear = true; return; }

runUnload(“Start Mixer!”, RELAY_MIXER, 10);

lcd.clear();
lcd.print(“ZAMES GOTOV!”);
delay(2000);

mainMenu = -1;
subMenu = -1;
needScreenClear = true;
isSystemIdle = true;
}

void runUnload(String name, int relayPin, int seconds) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(name);

digitalWrite(relayPin, LOW);

for (int i = seconds; i > 0; i–) {
if (checkGlobalStop()) return;
lcd.setCursor(0, 1);
lcd.print("Wait: “);
lcd.print(i);
lcd.print(” sec ");
delay(1000);
}

digitalWrite(relayPin, HIGH);
}

float performStep(String stepName, int targetValue, int relayPin, bool isWater, bool useConveyor) {
if (targetValue <= 0) return 0;
if (checkGlobalStop()) return 0;

float currentVal = 0;
bool shifted1 = false;
bool shifted2 = false;
unsigned long lastPulseTime = 0;
bool pulseState = false;

lcd.clear();
lcd.setCursor(0, 0);
lcd.print(stepName);
lcd.setCursor(12, 0);
lcd.print(“T:”);
lcd.print(targetValue);

if (isWater) {
flowPulseCount = 0;
} else {
scale.tare();
}

digitalWrite(relayPin, LOW);

while (currentVal < targetValue) {
if (checkGlobalStop()) {
digitalWrite(relayPin, HIGH);
return currentVal;
}

if (isWater) {
  currentVal = flowPulseCount / FLOW_CALIBRATION;
} else {
  currentVal = scale.get_units(3);
  if (currentVal < 0) currentVal = 0;
}

if (useConveyor && !isWater) {
    if (!shifted1 && currentVal > (targetValue * 0.33)) {
        digitalWrite(relayPin, HIGH); 
        lcd.setCursor(0, 1);
        lcd.print("Smart Shift 1...");
        digitalWrite(RELAY_CONVEYOR, LOW); 
        delay(CONVEYOR_SMART_SHIFT_TIME);
        digitalWrite(RELAY_CONVEYOR, HIGH);
        shifted1 = true;
        digitalWrite(relayPin, LOW); 
    }
    if (!shifted2 && currentVal > (targetValue * 0.66)) {
        digitalWrite(relayPin, HIGH); 
        lcd.setCursor(0, 1);
        lcd.print("Smart Shift 2...");
        digitalWrite(RELAY_CONVEYOR, LOW);
        delay(CONVEYOR_SMART_SHIFT_TIME);
        digitalWrite(RELAY_CONVEYOR, HIGH);
        shifted2 = true;
        digitalWrite(relayPin, LOW); 
    }
}

if (currentVal >= (targetValue * DOSING_THRESHOLD)) {
   unsigned long now = millis();
   if (pulseState) { 
      if (now - lastPulseTime >= PULSE_ON_MS) {
         digitalWrite(relayPin, HIGH); 
         pulseState = false;
         lastPulseTime = now;
      }
   } else { 
      if (now - lastPulseTime >= PULSE_OFF_MS) {
         digitalWrite(relayPin, LOW); 
         pulseState = true;
         lastPulseTime = now;
      }
   }
} else {
   if (digitalRead(relayPin) == HIGH) digitalWrite(relayPin, LOW);
}

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

}

digitalWrite(relayPin, HIGH);
delay(1000);

return currentVal;
}

void displayInfo(String info) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(info);
}

так клуб же… по интересам

нет

у вас есть еще вопросы по существу, или вы решили свою “супер” разработку показать?

вот это действительно “задача”, дерзайте, нам потом покажите.

1 лайк

давно ты “Мини бетонными заводами” интересуешься?
как байт ужал в один бит, скучновато стало, интересы сместились, ой сорян, расширились))

Да нет, решил спросить у профи, почему например нельзя включить им двигатель на какое то колличество киловат, но профи блин походу тут нет)).

Какая тут “супер” разработка, если тем более говорите что работать не будет. Я понимаю конечно что вы сами не знаете, у вас нет опыта подобного, но теоретически хоть можно объяснить в чем проблема? Я могу переписать на другой контроллер, просто подскажите какой, если есть такие знания.

А что плохого в нём)) кроме того что половину нейросетей сделала)) он даже вполне работает))

Самая сложная задача я имел в виду ему не сойти с ума от больших помех, остальное всë сильно слабже по нагрузкам

нафиг они нужны, я больше по коду, и я тут в аыти решил пойти, портфолио нужно, создал вакансию на хх ру, указал в резюме присылать готовые примеры работ, так никто нечего не прислал….(что бы я их работы, за свои выдавал) вот приходится по крохам собирать проекты, главное видео есть!

видео то смотрели ?))) проект не особо простой вроде))) что думаете о коде ?
мне в него еще вникнуть надо…

да откуда тут профи, мы лошки, издеваться тока можем.
вам видимо на форум по бетонным заводам надо.

собирать “КОНТРОЛЕРЫ” из модулей RTC и реле у нас только @BABOS может, кстати тоже с ИИ только.
к нему, к нему…

теперь по серьезному
такие вот “проЭкты” мы не поддерживаем, даже осуждаем

я те в сотый раз говорю, не форматированный код, я не то что оценивать, даже смотреть не буду.

1 лайк

Намёк понял, но не совсем, какая связь с ардуино в данном лифте, представим что там мегасупер умный и крутой контроллер, но собрали так же, на нормально замкнутые контакты, при чем тут ардуино? Правда не понял)) извините может за тупой вопрос.

надеюсь при просмотре моего резюме тоже смотреть не будут…

а контроллер то может ему посоветуете ?
или что добавить, может там опторазвязку, или еще что…

Pahannew проблемы могут быть, лучший способ собрать и посмотреть будет работать, или нет… и что будет не так…
дополнительными компонентами можете решить проблемы, и если много времени потратите, и ардуино может хватить… но это все же не точно)))

Да код просто выложил для ознакомления желающих, он нормально работает, я даже пробовал тестить, какие то моменты делать не по задумке программы, вроде всё норм. Для итогового решения будут куплены другие компоненты, ну типа реле не эти за 500 рублей 8 штук, а за 1500 штука(с чипдип) с опторазвязкой нормальной. Ну и всë остальное. Просто если контроллер изначально не очень, подскажите какой очень. Мы на него перенесём код, и будем тестить.

есть понятие DIY, а есть промышленное производство, они не совместимы.

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