Как заставить выполняться несколько сценариев без delay

Добрый день.
делаю самоделку “умные весы” и есть такая задача:

если на весы попадает предмет вес которого больше 150 грамм, но меньше 500 и вес этого предмета в данном интервале держится 1 секунду (тензодатчик не быстро устаканивается), и тогда по истечению этой 1 секунды (взвешивания этого предмета) даем команду моргать светодиоду 1 секунду и даем команду открыть пин (к нему будет подключен пневмоцилиндр чтобы сбросить предмет с весов как забракованный). держим этот пин открытым 0,5 сек и потом закрываем его. т.е. делаем несколько задач параллельно.
помогите пожалуйста с кодом(

пока есть вот такой код

#include <HX711_ADC.h> // https://github.com/olkal/HX711_ADC
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C library
HX711_ADC LoadCell(4, 5); // dt pin, sck pin
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD HEX address 0x27
int taree = 6;
int a = 0;
float b = 0;
const int Led1 = 12;
const int Led2 = 11;

bool led1State = 0; 
bool led2State = 0; 

unsigned long prev_ms1 = 0;
unsigned long prev_ms2 = 0;


void setup() {


 pinMode(Led1, OUTPUT);
 pinMode(Led2, OUTPUT);


  pinMode (taree, INPUT_PULLUP);
  LoadCell.begin(); // start connection to HX711
  LoadCell.start(1500); // load cells gets 1000ms of time to stabilize

  /////////////////////////////////////
  LoadCell.setCalFactor(-375); // Calibarate your LOAD CELL with 100g weight, and change the value according to readings
  /////////////////////////////////////
  
  lcd.begin(); // begins connection to the LCD module
  lcd.backlight(); // turns on the backlight
  lcd.setCursor(1, 0); // set cursor to first row
  lcd.print("super scales "); // print out to LCD
  lcd.setCursor(0, 1); // set cursor to first row
  lcd.print(" ...Loading... "); // print out to LCD
delay(3000);
lcd.clear();
}
void loop() { 
  lcd.setCursor(1, 0); // set cursor to first row
  lcd.print("super scales "); // print out to LCD 
  LoadCell.update(); // retrieves data from the load cell
  float i = LoadCell.getData(); // get output value
 if (i<0)
 {
  i = i * (-1);
  lcd.setCursor(5, 1);
  lcd.print("-");
 }
 else
 {
   lcd.setCursor(5, 1);
  lcd.print(" ");
 }
  
  lcd.setCursor(6, 1); // set cursor to secon row
  lcd.print(i, 0); // print out the retrieved value to the second row
  lcd.print("  ");


 


  if ((i > 150) && (i < 500))
  {


unsigned long currentTime = millis(); // текущее время в миллисекундах
 
 if((led1State == 1) && (currentTime - prev_ms1 >= 1000))
 {
    led1State = 0;                      // выключаем
    prev_ms1 = currentTime;             // запоминаем время
    digitalWrite(Led1, led1State);      // Гасим светодиод
 }
  else if ((led1State == 0) && (currentTime - prev_ms1 >= 1000))
  {
    led1State = 1;                      // включаем
    prev_ms1 = currentTime;             // запоминаем время
    digitalWrite(Led1, led1State);      // Зажигаем светодиод
  }



  }





  if (i>=5000)
  {
    i=0;
  lcd.setCursor(0, 0); // set cursor to secon row
  lcd.print("  Over Loaded   "); 
  delay(200);
  }
  if (digitalRead (taree) == LOW)
  {
    lcd.setCursor(0, 1); // set cursor to secon row
    lcd.print(" ...Taring...    ");
    LoadCell.start(1000);
    lcd.setCursor(0, 1);
    lcd.print("                ");
  }
}

Покажите ваши попытки кода реализовать вами описанное)
Что получилось , а что нет?

Вы сами пытались что то сделать? если да, показывайте, если нет и не планируете, тема уйдет в платный раздел.

имеющийся код добавлен. Что дальше делать, ума не приложу

Включать “думатель”

за такое рацпредложение в годы Великой Страны работодателем было заплачено 400рублей, и потом еще два года оплачивали после 1-го и 2-го года использования

1 лайк

я не вижу тут “параллельности” задач

меряем, если не то, моргаем, скидываем и в начало…

+1 аналогично

Удалил.

Удалил.

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

@lilik
ты конечно хороший парень, но тебе надо отдохнуть и не тянуть свои “спрайты” в каждую тему. :grinning:

4 лайка

Сейчас удалю.

Слона надо есть по частям.
Для начала постарайтесь написать программу, которая одновременно мигает тремя разными светодиодами с некратными частотами. Например, 2 раза в секунду, 3 раза в секунду и 5 раз в секунду.