Помогите уйти от delay

saltysoff
Offline
Зарегистрирован: 05.02.2018

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

#include <Q2HX711.h>

Q2HX711 cell(4, 2);
const int relPin1 = 3;
const int relPin2 = 5;

void setup() {
    pinMode(relPin1, OUTPUT);
    pinMode(relPin2, OUTPUT);
    digitalWrite(relPin1, HIGH);
    digitalWrite(relPin2, HIGH);
}
long val = 0;
void loop(){
  val = cell.read();
   if (cell.read() > 8000000 ) //если давление больше 8000000
    { 
        digitalWrite(relPin1, LOW);  //вкл
        delay(300);
        digitalWrite(relPin1, HIGH); //выкл
        delay(1000);
        digitalWrite(relPin2, LOW); //вкл
        delay(300);
        digitalWrite(relPin2, HIGH); //выкл
        delay(1000);
        digitalWrite(relPin2, LOW); //вкл
        delay(300);
        digitalWrite(relPin2, HIGH); //выкл
        delay(10000);                 //пауза
    }

else if (cell.read() <= 7800000 ); //если давление меньше или равно 7800000
    {
    
        digitalWrite(relPin1, HIGH); //выключено
        digitalWrite(relPin2, HIGH); //выключено
    }      

if (cell.read() < 7500000)          
{
  digitalWrite(relPin1, LOW);       //вкл
        delay(300);
        digitalWrite(relPin1, HIGH); //выкл
        delay(1000);
        digitalWrite(relPin2, LOW); //вкл
        delay(300);
        digitalWrite(relPin2, HIGH); //выкл
        delay(1000);
        digitalWrite(relPin1, LOW); //вкл
        delay(300);
        digitalWrite(relPin1, HIGH); //выкл
        delay(10000);                //пауза
}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

строки с 32 по 39 можно выкинуть - они не нужны.

Что касается перехода на миллис - ваш скетч состояит из одних делеев, его нет смысла править,  надо писать новый с нуля. Вряд ли кто-то будет делать это за вас.

saltysoff
Offline
Зарегистрирован: 05.02.2018

Ненадо с нуля, объясните как переключать в определенной последовательности реле в зависимости от того что имеем на входе

Иван_123
Offline
Зарегистрирован: 17.01.2018

Итак, In My Humble Opinion...

delay(n) == следующему:

unsigned long timing;
timing = millis();
while((millis() - timing) < n) {
        
      }

...где n - время в миллисекундах

Если есть желание - меняй делэи на что то подобное.

Я делаю так.

Поправьте, если кто-то считает иначе...

b707
Offline
Зарегистрирован: 26.05.2017

Иван_123 пишет:

Итак, In My Humble Opinion...

delay(n) == следующему:

unsigned long timing;
timing = millis();
while((millis() - timing) < n) {
        
      }

...где n - время в миллисекундах

Если есть желание - меняй делэи на что то подобное.

Я делаю так.

Поправьте, если кто-то считает иначе...

этот код полностью эквивалентен функции delay() - и ровно точно также подвешивает программу, как сам делей. Менять делей на это - нет ни малейшего смысла.

Иван_123
Offline
Зарегистрирован: 17.01.2018

Смысл все равно есть. В цикле можно выводить данные на дисплей. Правда это возможно и с delay... ТС, исходя из кода, Вы даже не попытались вклинить дисплей.

Morroc
Offline
Зарегистрирован: 24.10.2016

Можно. Еще и кнопки туда можно :) Но это... блин... ппц :) А если 5 реле - пять раз код вклинивать ?

saltysoff пишет:
Ненадо с нуля, объясните как переключать в определенной последовательности реле в зависимости от того что имеем на входе

Подход в принципе разный. Ваш код в том месте, где delay, выпоняется команда за командой последовательно. В случае правильной замены ваш код будет выполняться непрерывно в цикле и в определенные моменты включать/выключать нужные реле. Вам для чего это нужно ? Просто так взять и пару строк поменять тут не получится, код будет сложнее для понимания.

bwn
Offline
Зарегистрирован: 25.08.2014

Изучаем до просветления, проще вроде уже никак не объяснить. Параллельные темы тоже не грех просмотреть. А вот во вхули цикл бабушку миллис заворачивать не нужно. Пожалейте старушку. ИМХО.

saltysoff
Offline
Зарегистрирован: 05.02.2018

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

b707
Offline
Зарегистрирован: 26.05.2017

saltysoff пишет:

 надо последовательное, и последовательность должна быть определённая и разная в зависимости от того что подано на вход.

это называется "конечный автомат". ЕвгенийП где-то писал про него трактат - поищите поиском

alecksis
alecksis аватар
Offline
Зарегистрирован: 13.10.2017

здравствуйте. у меня что-то похожее, но я использую маленькие задержки SYSCOUNT.

код примерно такой:

main()

{

uint16_t syscount=0;

while(1){

if (syscount%200==0 ) {  // если 200 тиков по 50мс прошло, то входим в событие

      

        ............

       }

if (syscount%10==0) { если 10 тиков по 50мс прошло входим в событие

....

       }

delay(50);

    syscount++;

    }

}

успехов

Morroc
Offline
Зарегистрирован: 24.10.2016

Так уже millis есть - можно использовать вместо syscount, а принцип такой, да.

saltysoff пишет:

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

Последовательность будет какая угодно, но сам алгоритм должен бегать в цикле постоянно и оперативно реагировать на воздействия / дергать ногами. Просто когда вам нужно включить реле на 3 секунды - вызываете функцию типа включить_реле(n, 3000), она отмечает (запоминает) время включения этого реле и время выключения (ну или запоминает на сколько включили), а после в любом месте основного цикла вызываете что то типа выключение_всех_реле() и эта функция смотрит, где текущий счетчик millis превысил время отключения каждого реле - отключает такие, никаких delay. Чтобы получить четкую последовательность можно во второй функции при отключении одного реле сразу запускать другое или контролировать необходимость отключения отдельно от самого выключения в основном цикле ( чем то типа функции не_пришло_ли_время_отключить_реле(n) ).

saltysoff
Offline
Зарегистрирован: 05.02.2018

У меня даже включить их поочереди не удаётся

#include <Q2HX711.h> // библиотека HX711
#define printinterval 1000UL  // периодичность вывода времени в Serial (1 секунда)
#define serialspeed 9600 // скорость работы Serial
#define interval500 500000UL // интервал 500 секунд
Q2HX711 cell(4, 2); // назначаем пины для подключения HX711
int relPin1 = 3; // номер пина с реле1
int relState1 = HIGH; // состояние реле1
unsigned long previousMillis1 = 0;
long OnTime1 = 300; // длительность включения реле1
long OffTime1 = 1000; // реле1 выключено

int relPin2 = 5; // номер пина с реле2
int relState2 = HIGH; // состояние реле2
unsigned long previousMillis2 = 0;
long OnTime2 = 300; // длительность включения реле2
long OffTime2 = 1000; // реле2 выключено



void setup() 
{
    pinMode(relPin1, OUTPUT); // задаем режим выхода для порта, подключенного к реле1
    pinMode(relPin2, OUTPUT); // задаем режим выхода для порта, подключенного к реле2
    digitalWrite(relPin1, HIGH); // задаем высокий уровень для реле1
    digitalWrite(relPin2, HIGH); // задаем высокий уровень для реле2
    Serial.begin(serialspeed); // задаем скорость работы ком-порта
}

long val = 0;


void loop()
{

  
 static unsigned long prevPrintTime = 0;
 if(millis()- prevPrintTime > printinterval)
 {
  prevPrintTime = millis();
  val = cell.read();
  Serial.println(val);
 }
 
  
  unsigned long currentMillis = millis();
if((relState1 == HIGH) && (currentMillis - previousMillis1 >= OffTime1))
  {
    relState1 = LOW; // включаем
    previousMillis1 = currentMillis; // запоминаем момент времени
    digitalWrite(relPin1, relState1); // реализуем новое состояние
  }
if ((relState1 == LOW) && (currentMillis - previousMillis1 >= OnTime1))
  {
   relState1 = HIGH; // выключаем
   previousMillis1 = currentMillis ; // запоминаем момент времени
   digitalWrite(relPin1, relState1); // реализуем новое состояние  
  }
if((relState2 == HIGH) && (currentMillis - previousMillis2 >= OffTime2))
  {
    relState2 = LOW; // включаем
    previousMillis2 = currentMillis; // запоминаем момент времени
    digitalWrite(relPin2, relState2); // реализуем новое состояние
  }
if ((relState2 == LOW) && (currentMillis - previousMillis2 >= OnTime2))
  {
   relState2 = HIGH; // выключаем
   previousMillis2 = currentMillis ; // запоминаем момент времени
   digitalWrite(relPin2, relState2); // реализуем новое состояние
  }
 
}  

 

bwn
Offline
Зарегистрирован: 25.08.2014

Вы пытаетесь их использовать как делей, создавая последовательный код, что в корне неверно, вам нужен псевдопараллельный. Напишите сценарий исполнения (про конечные автоматы уже писали), выведите из лупа в отдельные функции (намного легче отлаживать) и в них отрабатывайте ваш сценарий. Интервалы можете передавать или назначать в функции различные, в зависимости от номера прохода. Как пример - функция с двумя разными действиями и разными интервалами. По образу и подобию можете расширить на требуемое количество шагов.

saltysoff
Offline
Зарегистрирован: 05.02.2018

Давайте не будем говорить о тех - о ком нам нельзя говорить. Я не специалист в ардуино, а вы мне про номера прохода. Если для вас проблема объяснить на доступном для начинающего языке, то так и напишите, или не пишите ничего - зачем тратить ваше и моё время на пустое. Сразу бы отправили меня в гугл и вопрос исчерпан.

Старый
Offline
Зарегистрирован: 09.10.2016

saltysoff если можно , опишите алгоритм работы вашего устройства. А то я из первого скетча  недопонял. например ,

если

cell.read() > 8000000

  реле повключались -повыключались.

А потом все остановилось на 10 сек.

По прошествии 10 сек опять все по кругу? Так и задумано? Или по другому как-то?

А там вместе подумаем как реализовать вашу задумку через миллис. А остальные нам помогут.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

saltysoff пишет:

Давайте не будем говорить о тех - о ком нам нельзя говорить. Я не специалист в ардуино, а вы мне про номера прохода. Если для вас проблема объяснить на доступном для начинающего языке, то так и напишите, или не пишите ничего - зачем тратить ваше и моё время на пустое. Сразу бы отправили меня в гугл и вопрос исчерпан.

Вот вы попытайтесь объяснить первокласснику "простым для него языком" что такое система линейных уравнений. Вот так без понимания что есть знаки + - * / и = . А потом без  расcказывания, что есть неизвестные переменные х,y,z . И что такое уравнения, и что есть еще и системма уравнений.

Так вот . Без определенного минимума знаний просто невозможно объснить некоторые приемы. Можно только (цензура). Подтяните ваш минимум и все станет ясно , или плюньте на решение этой проблемы.

bwn
Offline
Зарегистрирован: 25.08.2014

saltysoff пишет:

Давайте не будем говорить о тех - о ком нам нельзя говорить. Я не специалист в ардуино, а вы мне про номера прохода. Если для вас проблема объяснить на доступном для начинающего языке, то так и напишите, или не пишите ничего - зачем тратить ваше и моё время на пустое. Сразу бы отправили меня в гугл и вопрос исчерпан.

А при чем здесь специалист-неспециалист? Это ваша программа и только вы знаете как она должна работать. Только вы можете написать ее сценарий, к примеру: у вас три варианта давления, у меня возникает вопрос, если мы начали выполнять первый блок if (из первого поста), а давление опустилось до второго уровня, должны мы прекратить выполнение первого сценария и перейти ко второму или нет и т.д. Может ли такое снижение  произойти физически? Если может, но первый сценарий должен быть выполнен до конца, надо предусматривать проверку окончания первого сценария и только потом переходить к следующему. Пока вы не ответите на эти вопросы и не создадите таблицы разрешенных и запрещенных состояний, вы не сможете двигаться дальше. Псевдопараллельный код обладает всеми свойствами параллельного (в нашем восприятии времени), он не ждет окончательного исполнения предыдущего блока, а переходит к следующему и т.д. И здесь уже все на совести и усмотрение разработчика.

saltysoff
Offline
Зарегистрирован: 05.02.2018

Тот код не совсем правильный.

Правильный:

#include <Q2HX711.h>

Q2HX711 cell(4, 2);
const int relPin1 = 3;
const int relPin2 = 5;

void setup() {
    pinMode(relPin1, OUTPUT);
    pinMode(relPin2, OUTPUT);
    digitalWrite(relPin1, HIGH);
    digitalWrite(relPin2, HIGH);
}
long val = 0;
void loop(){
  val = cell.read();
   if (cell.read() <  5950000 )
    { 
        digitalWrite(relPin1, LOW); 
        delay(300);
        digitalWrite(relPin1, HIGH);
        delay(1000);
        digitalWrite(relPin2, LOW);
        delay(300);
        digitalWrite(relPin2, HIGH);
        delay(1000);
        digitalWrite(relPin2, LOW);
        delay(300); 
        digitalWrite(relPin2, HIGH);
        delay(600000);
    }

else if (cell.read() >= 5960000 );
    {
    
        digitalWrite(relPin1, HIGH);
        digitalWrite(relPin2, HIGH);
    }      

if (cell.read() > 6200000)
{
        digitalWrite(relPin1, LOW); 
        delay(300);
        digitalWrite(relPin1, HIGH);
        delay(1000);
        digitalWrite(relPin2, LOW);
        delay(300);
        digitalWrite(relPin2, HIGH);
        delay(1000);
        digitalWrite(relPin1, LOW);
        delay(300);
        digitalWrite(relPin1, HIGH);
        delay(600000);
}
}

Устройство должно реагировать на изменение давления. Если давление меньше чем 5950000 то должно включиться первое реле, потом дважды второе и остановиться на 6 минут, так как инерционность и нужно подождать 6 минут, если давление продолжает быть меньше чем 5950000, то процедура повторяется. Если давление в норме - больше или равно 5960000 - то система не должна реагировать. И соответственно если давление больше, чем 6200000,то должно вкючиться 1-ое - 2-ое - 1-ое реле и опять пауза в шесть минут. Получается гистерезис 5950000-6200000 и задержка в шесть минут. релюхи управляют регулятором-стабилизатором напряжения.

alecksis
alecksis аватар
Offline
Зарегистрирован: 13.10.2017

в момент 6 минут давление проверяется?

b707
Offline
Зарегистрирован: 26.05.2017

saltysoff пишет:

Тот код не совсем правильный.

Правильный:

Как и в первом коде - здесь второй блок лишний, его можно выкинуть без ущерба для скетча (строки 32 -37)

saltysoff - думал вам пример набросать, как работает машина состояний - но смотрю, вы тут бычить начали, указываете. кому и что следует вам писать. Похоже, вы типичная ленивая Ж., которая ничему учиться не желает, а ждет чтоб ей все разжевали и в рот положили. С вашим уровнем знаний написать подобную систему будет трудно, нужно слушать советы, рыться в гугле, изучать статьи, примеры и пробовать писать код. Вы же за целый день ничего из этого и не начали. При таком подходе варианта только два - либо вам кто-то "добрый" даст готовый код, либо вы пойдете с форума решать свои проблемы в одиночку.

saltysoff
Offline
Зарегистрирован: 05.02.2018

Есть высокоточный регулятор мощности РМ-2, и я ничего умнее не придумал, как подключить контакты реле параллельно кнопкам этого регулятора. Сейчас я визуально контролирую давление по механическому манометру, а хотелось бы прейти на дисплей. шесть минут для того, чтобы дать время привести давление в норму. если шести минут будет не достаточно - цикл повторяется - и снова шесть минут и т.д

saltysoff
Offline
Зарегистрирован: 05.02.2018

Я к тому, что все вокруг только разжевывают, как мигать светодиодом, а как что по серьёзнее - ленивая Ж. Я никого не принуждаю, попросил помощи - помогли - хорошо, не помогли - ну чтож... я у мамы "инженер", найду другой выход решения своей проблемы. прежде чем я сюда написал, я три месяца "курил" форумы, но кроме как умных миганий светодиодом... и ссылок на форумы где учат мигать я ничего не почерпнул.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

saltysoff, чтобы научиться писать стихи, сначала нужно научиться писать буквы. Потому научиться из букв складывать слова. Затем из слов - предложения. С учетом орфографии и пунктуации. Затем нужно понять, что такое рифма, размер и пр.

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

Так не получится.

Либо начинайте со светодтода либо бросайте это дело - значит, оно не Ваше.

bwn
Offline
Зарегистрирован: 25.08.2014

Как вы не поймете, мигать диодом - это выполнение действия. Что подключите вместо диода, то и будет это действие выполнять. У цифровой логики только два состояния - включено и выключено, все остальное их совокупность.
Я сегодня добрый, на миллисе и простенько на ифах для первого блока:
 

Глобальные переменные
Все флаги тру если ни один сценарий не задействован
boolean unoFlag = true;
boolean twoFlag = true;


void unoScen() {
  static unsigned long prevTime = 0;
  static unsigned long interval = 0;
  static byte shag = 0;
  if (millis() - prevTime >= interval) {
    prevTime = millis();
    unoFlag = false;
    if (shag == 0) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      shag++;
    }
    if (shag == 1) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      shag++;
    }
    .......
    здесь остальные
    ......
    if (shag == 4) {
      digitalWrite(relPin, HIGH);
      interval = 10000;
      shag++;
    }
    if (shag == 5) {
      shag = 0;
      interval = 0;
      unoFlag = true;
    }
  }
}

void loop() {
  .......
  //Если давление выше и остальные сценарии не задействованы
  if (cellRead() > 8000000 && twoFlag && здесь флаги если нужны) {
    unoScen();
  }
  if (!unoFlag) { /Если сценарий начал исполняться, а давление упало
    unoScen();
  }
    
    
    

P/S return забыл в ифах шагов.((((

saltysoff
Offline
Зарегистрирован: 05.02.2018

Спасибо! буду думать, расшифровывать)

saltysoff
Offline
Зарегистрирован: 05.02.2018

Что то пошло не так


//Глобальные переменные
//Все флаги true если ни один сценарий не задействован
boolean unoFlag = true;
boolean twoFlag = true;

#include <Q2HX711.h>
#define interval1 1000UL
Q2HX711 cell(4, 2);
const int relPin1 = 3;
const int relPin2 = 5;

void setup() {
    pinMode(relPin1, OUTPUT);
    pinMode(relPin2, OUTPUT);
    Serial.begin(9600);
}

void unoScen() {
  static unsigned long prevTime = 0;
  static unsigned long interval = 0;
  static byte shag = 0;
  if (millis() - prevTime >= interval) {
    prevTime = millis();
    unoFlag = false;
    if (shag == 0) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      shag++;
      return;
    }
     if (shag == 1) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      shag++;
      return;
     }
     if (shag == 2) {
      digitalWrite(relPin2, LOW);
      interval = 300;
      shag++;
      return;
     }
     if (shag == 3) {
      digitalWrite(relPin2, HIGH);
      interval = 1000;
      shag++;
      return;
     }
     if (shag == 4) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      shag++;
      return;
     }
     if (shag == 5) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      shag++;
      return;
     }
     if (shag == 6) {
      shag = 0;
      interval = 0;
      unoFlag = true;
      return;
     }
  }
}

void twoScen() {
  static unsigned long prevTime = 0;
  static unsigned long interval = 0;
  static byte shag = 0;
  if (millis() - prevTime >= interval) {
    prevTime = millis();
    twoFlag = false;
    if (shag == 0) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      shag++;
      return;
    }
     if (shag == 1) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      shag++;
      return;
     }
     if (shag == 2) {
      digitalWrite(relPin2, LOW);
      interval = 300;
      shag++;
      return;
     }
     if (shag == 3) {
      digitalWrite(relPin2, HIGH);
      interval = 1000;
      shag++;
      return;
     }
     if (shag == 4) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      shag++;
      return;
     }
     if (shag == 5) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      shag++;
      return;
     }
     if (shag == 6) {
      shag = 0;
      interval = 0;
      twoFlag = true;
      return;
     }
  }
}

long val = 0;

void loop() {
  val = cell.read();
static unsigned long prevPrintTime=0;
if(millis()-prevPrintTime>interval1);
  prevPrintTime=millis();
  Serial.println(val);
  
  val = cell.read();
  if (cell.read() <  5950000 && unoFlag) {
    unoScen();
  }
  if (cell.read() > 6200000 && twoFlag) {
   twoScen();
  }
  if (!unoFlag) {
    unoScen();
  }
if (!twoFlag) {
    twoScen();
  }
}
evgta
Offline
Зарегистрирован: 02.09.2016

как-то так, наверное. не провнрял


Q2HX711 cell(4, 2);
const int relPin1 = 3;
const int relPin2 = 5;

unsigned long timemillis = 0;
byte flag = 0;

void setup() {
    pinMode(relPin1, OUTPUT);
    pinMode(relPin2, OUTPUT);
    digitalWrite(relPin1, HIGH);
    digitalWrite(relPin2, HIGH);
}
long val = 0;
void loop(){
  val = cell.read();
   if (cell.read() > 5950000 && flag==0){timemillis=millis(); flag = 2}
    
      if (millis()-timemillis<=300 && flag == 2) {digitalWrite(relPin1, LOW);}
      if (millis()-timemillis>300 &&  millis()-timemillis<=1300 && flag == 2) {digitalWrite(relPin1, HIGH);}
      if (millis()-timemillis>1300 && millis()-timemillis<=1600 && flag == 2) digitalWrite(relPin2, LOW);}    // дальше самому написать
      ...
      ....
      .....
      if (millis()-timemillis>666666 && flag == 2) {flag=0;}
    

else if (cell.read() >= 5960000 );
    {
    
        digitalWrite(relPin1, HIGH);
        digitalWrite(relPin2, HIGH);
        
    }      

if (cell.read() > 6200000 && flag==0){timemillis=millis(); flag = 1}

      if (millis()-timemillis<=300 && flag == 1) {digitalWrite(relPin1, LOW);}
      if (millis()-timemillis>300 &&  millis()-timemillis<=1300 && flag == 1) {digitalWrite(relPin1, HIGH);}
      if (millis()-timemillis>1300 && millis()-timemillis<=1600 && flag == 1) digitalWrite(relPin2, LOW);}
      ...
      ....
      .....
      if (millis()-timemillis>666666 && flag == 1) {flag=0;}

}

 

bwn
Offline
Зарегистрирован: 25.08.2014

saltysoff пишет:

Что то пошло не так

Что не так то? У меня все так. Вам же уже сказали, синтаксис подучите и логику подтяните:

//Глобальные переменные
//Все флаги true если ни один сценарий не задействован
boolean unoFlag = true;
boolean twoFlag = true;

//#include <Q2HX711.h>
//#define interval1 1000UL
//Q2HX711 cell(4, 2);
const int relPin1 = 3;
const int relPin2 = 5;

long val = 5900000;

void setup() {
    pinMode(relPin1, OUTPUT);
    pinMode(relPin2, OUTPUT);
    Serial.begin(9600);
}

void unoScen() {
  static unsigned long prevTime = 0;
  static unsigned long interval = 0;
  static byte shag = 0;
  if (millis() - prevTime >= interval) {
    prevTime = millis();
    unoFlag = false;
    Serial.println(val, DEC);
    val = 6300000;
    if (shag == 0) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      Serial.println("unoShag = 0");
      shag++;
      return;
    }
     if (shag == 1) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      Serial.println("unoShag = 1");
      shag++;
      return;
     }
     if (shag == 2) {
      digitalWrite(relPin2, LOW);
      interval = 300;
      Serial.println("unoShag = 2");
      shag++;
      return;
     }
     if (shag == 3) {
      digitalWrite(relPin2, HIGH);
      interval = 1000;
      Serial.println("unoShag = 3");
      shag++;
      return;
     }
     if (shag == 4) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      Serial.println("unoShag = 4");
      shag++;
      return;
     }
     if (shag == 5) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      Serial.println("unoShag = 5");
      shag++;
      return;
     }
     if (shag == 6) {
      shag = 0;
      interval = 0;
      Serial.println("unoShag = 6");
      unoFlag = true;
     }
  }
}

void twoScen() {
  static unsigned long prevTime = 0;
  static unsigned long interval = 0;
  static byte shag = 0;
  if (millis() - prevTime >= interval) {
    prevTime = millis();
    twoFlag = false;
    Serial.println(val, DEC);
    val = 5900000;
    if (shag == 0) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      Serial.println("twoShag = 0");
      shag++;
      return;
    }
     if (shag == 1) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      Serial.println("twoShag = 1");
      shag++;
      return;
     }
     if (shag == 2) {
      digitalWrite(relPin2, LOW);
      interval = 300;
      Serial.println("twoShag = 2");
      shag++;
      return;
     }
     if (shag == 3) {
      digitalWrite(relPin2, HIGH);
      interval = 1000;
      Serial.println("twoShag = 3");
      shag++;
      return;
     }
     if (shag == 4) {
      digitalWrite(relPin1, LOW);
      interval = 300;
      Serial.println("twoShag = 4");
      shag++;
      return;
     }
     if (shag == 5) {
      digitalWrite(relPin1, HIGH);
      interval = 1000;
      Serial.println("twoShag = 5");
      shag++;
      return;
     }
     if (shag == 6) {
      shag = 0;
      interval = 0;
      twoFlag = true;
      Serial.println("twoShag = 6");
     }
  }
}

void loop() {
  
  if (val <  5950000 && twoFlag) {
    unoScen();
  }
  if (val > 6200000 && unoFlag) {
   twoScen();
  }
  if (!unoFlag) {
    unoScen();
  }
if (!twoFlag) {
    twoScen();
  }
}

Здесь принты вместо светодиода, они поинформативней, подключите светики вместо реле, они еще и мигать будут. Теперь скажите, в чем отличие вашей хотелки с реле от мигания светодиодами из так нелюбимых вами несерьезных примеров?

saltysoff
Offline
Зарегистрирован: 05.02.2018

bwn пишет:

Что не так то? У меня все так. Вам же уже сказали, синтаксис подучите и логику подтяните:

Лет так эдак 25 назад, я бы с легкостью подучил и подтянул, но сейчас мне это очень тяжело даётся, и поэтому я здесь, по крупицам пытаюсь разобраться. Светодиоды у меня есть на релюхах. но они не мигают без конца и цели, а работают только по необходимости, когда давление находится вне пределов гистерезиса.

bwn
Offline
Зарегистрирован: 25.08.2014

Лет эдак 20 назад я забыл что такое программировать и паять, а года три назад вернулся, тогда же про ардуину узнал, точнее наоборот. Для того чтобы написать вашу программу не требуется иметь компрессор с его реле, датчиками, ресиверами...., не нужны ваши библиотеки, все можно сэмулировать с помощью переменной val. Обладая этим минимумом можно написать и отладить полностью работоспособную программу. Вот нахрена мне на столе этот здоровый пускатель, со всем его питанием и обвязкой, если загорается светодиод, то при правильном согласовании пускатель тоже обязан включиться. Если при работе на живом железе начнуться сбои, то к программе это отношения не имеет, это аппаратные проблемы и решать их надо на уровне железа. ИМХО.

b707
Offline
Зарегистрирован: 26.05.2017

saltysoff пишет:

Лет так эдак 25 назад, я бы с легкостью подучил и подтянул, но сейчас мне это очень тяжело даётся

вы, наверное, думаете, что тут все мальчики по 20 лет?:) не-а - средний возраст форума, мо моим прикидкам - лет 45 - 50 :)

предлагаю unoScen чуть переписать


void unoScen() {
  const byte NUMBER_OF_STEPS = 6;
  const unsigned long intervals[NUMBER_OF_STEPS] = {300, 1000, 300, 1000, 300, 600000 };
  static unsigned long prevTime = 0;
  static unsigned long interval = 0;
  static byte shag = 0;
  if (millis() - prevTime < interval)  return;
    prevTime = millis();
    unoFlag = false;
    switch (shag) {
      0: digitalWrite(relPin1, LOW); break;
      1: digitalWrite(relPin1, HIGH); break;
      2: digitalWrite(relPin2, LOW); break;
      3: digitalWrite(relPin2, HIGH); break;
      4: digitalWrite(relPin1, LOW); break;
      5: digitalWrite(relPin1, HIGH); break;
      6: shag = 0;
         interval = 0;
         unoFlag = true;
         return;
   }
      interval =  intervals[shag];
      Serial.print("unoShag = ");
      Serial.println(shag);
      shag++;
     
}

 

alecksis
alecksis аватар
Offline
Зарегистрирован: 13.10.2017
вместо delay я написла функцию delay_n_update там каждую секунду дергается экран. далше напиши функцию updatelcd. ты же знаешь как выводить на экран то что ты хочешь?
 
_delay_n_update(int sec){
int i;
for(i=0;i<sec;i++) {
   updatelcd();
   delay(1000);
   }
}
 
setup()
{
 
}
 
loop(){
  val = cell.read();
      if (cell.read() <  5950000 )
 
        digitalWrite(relPin1, LOW); 
        delay(300);
        digitalWrite(relPin1, HIGH);
        delay(1000);
        digitalWrite(relPin2, LOW);
        delay(300);
        digitalWrite(relPin2, HIGH);
        delay(1000);
        digitalWrite(relPin2, LOW);
        delay(300); 
        digitalWrite(relPin2, HIGH);
        _delay_n_update(3600);
    }
 
else if (cell.read() >= 5960000 );
    {
    
        digitalWrite(relPin1, HIGH);
        digitalWrite(relPin2, HIGH);
    }      
 
if (cell.read() > 6200000)
{
        digitalWrite(relPin1, LOW); 
        delay(300);
        digitalWrite(relPin1, HIGH);
        delay(1000);
        digitalWrite(relPin2, LOW);
        delay(300);
        digitalWrite(relPin2, HIGH);
        delay(1000);
        digitalWrite(relPin1, LOW);
        delay(300);
        digitalWrite(relPin1, HIGH);
        _delay_n_update(3600);
}
}
bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

предлагаю unoScen чуть переписать

Специально не стал свитч с массивами использовать, это уже следующий шаг и его лучше делать самостоятельно. ИМХО.

b707
Offline
Зарегистрирован: 26.05.2017

bwn пишет:

Специально не стал свитч с массивами использовать, это уже следующий шаг и его лучше делать самостоятельно. ИМХО.

извините, что влез.

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

bwn пишет:

Специально не стал свитч с массивами использовать, это уже следующий шаг и его лучше делать самостоятельно. ИМХО.

извините, что влез.

Отнюдь, отнюдь, очень даже приветствую, чисто объяснил мотивацию.))))

saltysoff
Offline
Зарегистрирован: 05.02.2018

Вот этот код работает, только как-то несоответствует время вкл;выкл заданным параметрам

#include <Q2HX711.h>
#define printinterval 1000UL  // периодичность вывода времени в Serial (1 секунда)
#define serialspeed 9600 // скорость работы Serial

Q2HX711 pressure(4, 2);
const int reley1 = 3;
const int reley2 = 5;

unsigned long timeMillis = 0;
byte flag = 0;

void setup() {
    pinMode(reley1, OUTPUT);
    pinMode(reley2, OUTPUT);
    digitalWrite(reley1, HIGH);
    digitalWrite(reley2, HIGH);
    Serial.begin(serialspeed); // задаем скорость работы ком-порта
}

long val = 0;

void loop(){
static unsigned long prevPrintTime = 0;
 if(millis()- prevPrintTime > printinterval)
 
 {
  prevPrintTime = millis();
  val = pressure.read();
  Serial.println(val);
 }
  
  
   if (pressure.read() < 5950000 && flag == 0){timeMillis = millis(); flag = 1;}
      if (millis()-timeMillis<=300 && flag == 1)
      {digitalWrite(reley1, LOW);}
      if (millis() - timeMillis >300  && millis()-timeMillis<=1300 && flag == 1) 
      {digitalWrite(reley1, HIGH);}
      if (millis() - timeMillis > 1300  && millis()-timeMillis<=1800 && flag == 1) 
      {digitalWrite(reley2, LOW);}  
      if (millis() - timeMillis > 1800  && millis()-timeMillis<=2800 && flag == 1)
      {digitalWrite(reley2, HIGH);}
      if (millis() - timeMillis > 2800  && millis()-timeMillis<=3100 && flag == 1)
      {digitalWrite(reley2, LOW);}
      if (millis() - timeMillis > 3100  && millis()-timeMillis<=4100 && flag == 1)
      {digitalWrite(reley2, HIGH);}
      if (millis() - timeMillis > 600000 && flag == 1) 
      {flag = 0;}
      
else if (pressure.read() >= 5960000 && flag ==0){timeMillis = millis(); flag = 2;}
    if (millis()-timeMillis<=300 && flag == 2)
       { digitalWrite(reley1, HIGH);
        digitalWrite(reley2, HIGH);}
        if (millis() - timeMillis > 100 && flag == 2) 
        {flag = 0;}

        if (pressure.read() > 6200000 && flag == 0){timeMillis = millis(); flag = 3;}
      if (millis()-timeMillis<=300 && flag == 3)
      {digitalWrite(reley1, LOW);}
      if (millis()-timeMillis > 300  && millis()-timeMillis<=1300 && flag == 3) 
      {digitalWrite(reley1, HIGH);}
      if (millis()-timeMillis > 1300  && millis()-timeMillis<=1800 && flag == 3) 
      {digitalWrite(reley2, LOW);}  
      if (millis()-timeMillis > 1800  && millis()-timeMillis<=2800 && flag == 3)
      {digitalWrite(reley2, HIGH);}
      if (millis()-timeMillis > 2800  && millis()-timeMillis<=3100 && flag == 3)
      {digitalWrite(reley1, LOW);}
      if (millis()-timeMillis > 3100  && millis()-timeMillis<=4100 && flag == 3)
      {digitalWrite(reley1, HIGH);}
      if (millis()-timeMillis > 600000 && flag == 3) 
      {flag = 0;}
        

    
}

      

 

bwn
Offline
Зарегистрирован: 25.08.2014

Ню, ню, ребусы тоже дело хорошее.))))

Morroc
Offline
Зарегистрирован: 24.10.2016

alecksis пишет:

вместо delay я написла функцию delay_n_update там каждую секунду дергается экран. далше напиши функцию updatelcd. ты же знаешь как выводить на экран то что ты хочешь?

Лучше сразу нормально делать. Ничего хитрого нет - один раз в голове уложить и забыть о delay(), один черт в более сложных девайсах придется нормально писать.

evgta
Offline
Зарегистрирован: 02.09.2016

saltysoff пишет:

Вот этот код работает, только как-то несоответствует время вкл;выкл заданным параметрам

что значит несоответсвует?

здесь отсчет не один за другим идет, а от того момента когда засекается точка отсчета, т.е 300+1000+300+500

будет 300, 1300, 1600, 2100

saltysoff
Offline
Зарегистрирован: 05.02.2018

Это значит что вместо 300+1000+300+1000+300 идёт к примеру 300+1000+218+1000+300. Не знаю какая взаимосвязь, но при отключении HX711 всё начинает работать правильно, при подключении обратно цикл "сбивается".

evgta
Offline
Зарегистрирован: 02.09.2016

Опрос hx711 надо убрать из каждого цикла, хотя странно что цифры меньше, поидее больше должны быть

как часто надо опрашивать? 

вот так как работает?

#include <Q2HX711.h>
#define printinterval 1000UL  // периодичность вывода времени в Serial (1 секунда)
#define serialspeed 9600 // скорость работы Serial

Q2HX711 pressure(4, 2);
const int reley1 = 3;
const int reley2 = 5;

unsigned long timeMillis = 0;
byte flag = 0;

void setup() {
    pinMode(reley1, OUTPUT);
    pinMode(reley2, OUTPUT);
    digitalWrite(reley1, HIGH);
    digitalWrite(reley2, HIGH);
    Serial.begin(serialspeed); // задаем скорость работы ком-порта
}

long val = 0;

void loop(){
static unsigned long prevPrintTime = 0;
 if(millis()- prevPrintTime > printinterval)
 
 {
  prevPrintTime = millis();
  val = pressure.read();
  Serial.println(val);
 }
  
  
   if (val < 5950000 && flag == 0){timeMillis = millis(); flag = 1;}
      if (millis()-timeMillis<=300 && flag == 1)
      {digitalWrite(reley1, LOW);}
      if (millis() - timeMillis >300  && millis()-timeMillis<=1300 && flag == 1) 
      {digitalWrite(reley1, HIGH);}
      if (millis() - timeMillis > 1300  && millis()-timeMillis<=1800 && flag == 1) 
      {digitalWrite(reley2, LOW);}  
      if (millis() - timeMillis > 1800  && millis()-timeMillis<=2800 && flag == 1)
      {digitalWrite(reley2, HIGH);}
      if (millis() - timeMillis > 2800  && millis()-timeMillis<=3100 && flag == 1)
      {digitalWrite(reley2, LOW);}
      if (millis() - timeMillis > 3100  && millis()-timeMillis<=4100 && flag == 1)
      {digitalWrite(reley2, HIGH);}
      if (millis() - timeMillis > 600000 && flag == 1) 
      {flag = 0;}
      
else if (val >= 5960000 && flag ==0){timeMillis = millis(); flag = 2;}
    if (millis()-timeMillis<=300 && flag == 2)
       { digitalWrite(reley1, HIGH);
        digitalWrite(reley2, HIGH);}
        if (millis() - timeMillis > 100 && flag == 2) 
        {flag = 0;}

        if (val > 6200000 && flag == 0){timeMillis = millis(); flag = 3;}
      if (millis()-timeMillis<=300 && flag == 3)
      {digitalWrite(reley1, LOW);}
      if (millis()-timeMillis > 300  && millis()-timeMillis<=1300 && flag == 3) 
      {digitalWrite(reley1, HIGH);}
      if (millis()-timeMillis > 1300  && millis()-timeMillis<=1800 && flag == 3) 
      {digitalWrite(reley2, LOW);}  
      if (millis()-timeMillis > 1800  && millis()-timeMillis<=2800 && flag == 3)
      {digitalWrite(reley2, HIGH);}
      if (millis()-timeMillis > 2800  && millis()-timeMillis<=3100 && flag == 3)
      {digitalWrite(reley1, LOW);}
      if (millis()-timeMillis > 3100  && millis()-timeMillis<=4100 && flag == 3)
      {digitalWrite(reley1, HIGH);}
      if (millis()-timeMillis > 600000 && flag == 3) 
      {flag = 0;}
        

    
}

      

 

evgta
Offline
Зарегистрирован: 02.09.2016

или так



 #include <Q2HX711.h>
#define printinterval 1000UL  // периодичность вывода времени в Serial (1 секунда)
#define serialspeed 9600 // скорость работы Serial

Q2HX711 pressure(4, 2);
const int reley1 = 3;
const int reley2 = 5;

unsigned long timeMillis = 0;
byte flag = 0;

void setup() {
    pinMode(reley1, OUTPUT);
    pinMode(reley2, OUTPUT);
    digitalWrite(reley1, HIGH);
    digitalWrite(reley2, HIGH);
    Serial.begin(serialspeed); // задаем скорость работы ком-порта
}

long val = 0;

void loop(){
static unsigned long prevPrintTime = 0;
 if(millis()- prevPrintTime > printinterval)
 
 {
  prevPrintTime = millis();
  val = pressure.read();
  Serial.println(val);
 }
  
  
  if (val < 5950000 && flag == 0 || val > 6200000 && flag == 0){timeMillis = millis(); flag = 1;}
  else if(flag ==0){timeMillis = millis(); flag = 2;}
  // if ((val < 5950000 && flag == 0) || (val > 6200000 && flag == 0)){timeMillis = millis(); flag = 1;} // или так  
      if (flag == 1){
                      if (millis()-timeMillis<=300){digitalWrite(reley1, LOW);}
                      if (millis() - timeMillis >300  && millis()-timeMillis<=1300) {digitalWrite(reley1, HIGH);}
                       if (millis() - timeMillis > 1300  && millis()-timeMillis<=1800)  {digitalWrite(reley2, LOW);}  
                      if (millis() - timeMillis > 1800  && millis()-timeMillis<=2800){digitalWrite(reley2, HIGH);}
                       if (millis() - timeMillis > 2800  && millis()-timeMillis<=3100){digitalWrite(reley2, LOW);}
                       if (millis() - timeMillis > 3100  && millis()-timeMillis<=4100){digitalWrite(reley2, HIGH);}
                     if (millis() - timeMillis > 600000) {flag = 0;}
                    }

    if (flag == 2){
                   if (millis()-timeMillis<=300){ digitalWrite(reley1, HIGH);digitalWrite(reley2, HIGH);}
                   if (millis() - timeMillis > 100){flag = 0;}
                   }
        

    
}

      
saltysoff
Offline
Зарегистрирован: 05.02.2018

Спасибо! Вы мне очень помогли! Заменил pressure.read() на val и всё заработало корректно.

#include <Q2HX711.h>
#define printinterval 1000UL  // периодичность вывода времени в Serial (1 секунда)
#define serialspeed 9600 // скорость работы Serial

Q2HX711 pressure(4, 2);
const int reley1 = 3;
const int reley2 = 5;

unsigned long timeMillis = 0;
byte flag = 0;

void setup() {
    pinMode(reley1, OUTPUT);
    pinMode(reley2, OUTPUT);
    digitalWrite(reley1, HIGH);
    digitalWrite(reley2, HIGH);
    Serial.begin(serialspeed); // задаем скорость работы ком-порта
}

long val = 0;

void loop(){
static unsigned long prevPrintTime = 0;
 if(millis()- prevPrintTime > printinterval)
 
 {
  prevPrintTime = millis();
  val = pressure.read();
  Serial.println(val);
 }
  
  
   if (val < 5950000 && flag == 0){timeMillis = millis(); flag = 1;}
      if (millis()-timeMillis<=300 && flag == 1)
      {digitalWrite(reley1, LOW);}
      if (millis() - timeMillis >300  && millis()-timeMillis<=1300 && flag == 1) 
      {digitalWrite(reley1, HIGH);}
      if (millis() - timeMillis > 1300  && millis()-timeMillis<=1600 && flag == 1) 
      {digitalWrite(reley2, LOW);}  
      if (millis() - timeMillis > 1600  && millis()-timeMillis<=2600 && flag == 1)
      {digitalWrite(reley2, HIGH);}
      if (millis() - timeMillis > 2600  && millis()-timeMillis<=2900 && flag == 1)
      {digitalWrite(reley2, LOW);}
      if (millis() - timeMillis > 2900  && millis()-timeMillis<=3900 && flag == 1)
      {digitalWrite(reley2, HIGH);}
      if (millis() - timeMillis > 600000 && flag == 1) 
      {flag = 0;}
      
else if (val >= 5960000 && flag ==0){timeMillis = millis(); flag = 2;}
    if (millis()-timeMillis<=300 && flag == 2)
       { digitalWrite(reley1, HIGH);
        digitalWrite(reley2, HIGH);}
        if (millis() - timeMillis > 100 && flag == 2) 
        {flag = 0;}

        if (val > 6200000 && flag == 0){timeMillis = millis(); flag = 3;}
      if (millis()-timeMillis<=300 && flag == 3)
      {digitalWrite(reley1, LOW);}
      if (millis()-timeMillis > 300  && millis()-timeMillis<=1300 && flag == 3) 
      {digitalWrite(reley1, HIGH);}
      if (millis()-timeMillis > 1300  && millis()-timeMillis<=1600 && flag == 3) 
      {digitalWrite(reley2, LOW);}  
      if (millis()-timeMillis > 1600  && millis()-timeMillis<=2600 && flag == 3)
      {digitalWrite(reley2, HIGH);}
      if (millis()-timeMillis > 2600  && millis()-timeMillis<=2900 && flag == 3)
      {digitalWrite(reley1, LOW);}
      if (millis()-timeMillis > 2900  && millis()-timeMillis<=3900 && flag == 3)
      {digitalWrite(reley1, HIGH);}
      if (millis()-timeMillis > 600000 && flag == 3) 
      {flag = 0;}
        

    
}

      

 

evgta
Offline
Зарегистрирован: 02.09.2016

вот так получше выглядит

а если между значениями 5950000 и 5960000 что должно присходить? если должно быть в пределах от 5950000 до 6200000

то лучше так записать


#include <Q2HX711.h>
#define printinterval 1000UL  // периодичность вывода времени в Serial (1 секунда)
#define serialspeed 9600 // скорость работы Serial

Q2HX711 pressure(4, 2);
const int reley1 = 3;
const int reley2 = 5;

unsigned long timeMillis = 0;
byte flag = 0;

void setup() {
    pinMode(reley1, OUTPUT);
    pinMode(reley2, OUTPUT);
    digitalWrite(reley1, HIGH);
    digitalWrite(reley2, HIGH);
    Serial.begin(serialspeed); // задаем скорость работы ком-порта
}

long val = 0;

void loop(){
static unsigned long prevPrintTime = 0;
 if(millis()- prevPrintTime > printinterval)
 
 {
  prevPrintTime = millis();
  val = pressure.read();
  Serial.println(val);
 }
  
  
   if (val < 5950000 && flag == 0){timeMillis = millis(); flag = 1;}
   else if (val > 6200000 && flag == 0){timeMillis = millis();flag = 3;}
   else if (flag ==0){timeMillis = millis(); flag = 2;}
   
   
   if(flag == 1){
      if (millis()-timeMillis<=300)
      {digitalWrite(reley1, LOW);}
      if (millis() - timeMillis >300  && millis()-timeMillis<=13001) 
      {digitalWrite(reley1, HIGH);}
      if (millis() - timeMillis > 1300  && millis()-timeMillis<=1600) 
      {digitalWrite(reley2, LOW);}  
      if (millis() - timeMillis > 1600  && millis()-timeMillis<=2600)
      {digitalWrite(reley2, HIGH);}
      if (millis() - timeMillis > 2600  && millis()-timeMillis<=2900)
      {digitalWrite(reley2, LOW);}
      if (millis() - timeMillis > 2900  && millis()-timeMillis<=3900)
      {digitalWrite(reley2, HIGH);}
      if (millis() - timeMillis > 600000) 
      {flag = 0;}
   }
    
    if(flag == 2){  
    if (millis()-timeMillis<=300)
       { digitalWrite(reley1, HIGH);
        digitalWrite(reley2, HIGH);}
        if (millis() - timeMillis > 100) 
        {flag = 0;}
    }

        if(flag == 3){
      if (millis()-timeMillis<=300 && flag == 3)
      {digitalWrite(reley1, LOW);}
      if (millis()-timeMillis > 300  && millis()-timeMillis<=1300) 
      {digitalWrite(reley1, HIGH);}
      if (millis()-timeMillis > 1300  && millis()-timeMillis<=1600) 
      {digitalWrite(reley2, LOW);}  
      if (millis()-timeMillis > 1600  && millis()-timeMillis<=2600)
      {digitalWrite(reley2, HIGH);}
      if (millis()-timeMillis > 2600  && millis()-timeMillis<=2900)
      {digitalWrite(reley1, LOW);}
      if (millis()-timeMillis > 2900  && millis()-timeMillis<=3900)
      {digitalWrite(reley1, HIGH);}
      if (millis()-timeMillis > 600000) 
      {flag = 0;}
        }
        

    
}

      
b707
Offline
Зарегистрирован: 26.05.2017

код #41 извиняет лишь то, что он приведен в учебных целях...  код #42 чуть лучше.  Очень некрасивый код, в котором легко запутаться и который трудно отлаживать. Куча лишних вызовов миллис, огромные неуклюжие условия IF. 

Код bwn из сообщения #24 на порядок лучше, советую ТС ориентироваться на него. Всегда нужно стремится писать так, чтобы код не просто работал, а еще был понятным и логичным. И красивым.

Все что выше - ИМХО.

 

saltysoff
Offline
Зарегистрирован: 05.02.2018

Я не собирался останавливаться и планирую его изучить (код #24). так сказать следующий шаг в ардуино.

b707
Offline
Зарегистрирован: 26.05.2017

сорри за резкое суждение #45

На уровне ассоциаций - код #41 это как бурелом из миллис и условий IF.  в то время как #24 - ровная просека с отворотами под каждую стадию :)

Чисто ИМХО

saltysoff
Offline
Зарегистрирован: 05.02.2018

Это было бы ещё меньшим буреломом, если всё это на шим перевести, но с моим уровнем познаний пока не реально.

evgta
Offline
Зарегистрирован: 02.09.2016

так получше читается ?  хотя новичку с #24 по мне так еще хуже читается

#include <Q2HX711.h>
#define printinterval 1000UL  // периодичность вывода времени в Serial (1 секунда)
#define serialspeed 9600 // скорость работы Serial

Q2HX711 pressure(4, 2);
const int reley1 = 3;
const int reley2 = 5;

unsigned long timeMillis = 0;
unsigned long interval = 0;
byte flag = 0;

void setup() {
    pinMode(reley1, OUTPUT);
    pinMode(reley2, OUTPUT);
    digitalWrite(reley1, HIGH);
    digitalWrite(reley2, HIGH);
    Serial.begin(serialspeed); // задаем скорость работы ком-порта
}

long val = 0;

void loop(){
static unsigned long prevPrintTime = 0;
 if(millis()- prevPrintTime > printinterval)
 
 {
  prevPrintTime = millis();
  val = pressure.read();
  Serial.println(val);
 }
  
  
   if (val < 5950000 && flag == 0){timeMillis = millis(); flag = 1;}
   else if (val > 6200000 && flag == 0){timeMillis = millis();flag = 3;}
   else if (flag ==0){timeMillis = millis(); flag = 2;}
   
   
   if(flag == 1){
      interval=millis()-timeMillis;
      
      if (interval<=300)
      {digitalWrite(reley1, LOW);}
      if (interval>300  && interval<=1300) 
      {digitalWrite(reley1, HIGH);}
      if (interval > 1300  && interval<=1600) 
      {digitalWrite(reley2, LOW);}  
      if (interval > 1600  && interval<=2600)
      {digitalWrite(reley2, HIGH);}
      if (interval > 2600  && interval<=2900)
      {digitalWrite(reley2, LOW);}
      if (interval > 2900  && interval<=3900)
      {digitalWrite(reley2, HIGH);}
      if (interval > 600000) 
      {flag = 0;}
   }
    
    if(flag == 2){
      interval=millis()-timeMillis;
        
    if (interval<=300)
       { digitalWrite(reley1, HIGH);
        digitalWrite(reley2, HIGH);}
        if (interval > 100) 
        {flag = 0;}
    }
      
        if(flag == 3){
      interval=millis()-timeMillis;
      
      if (interval<=300 && flag == 3)
      {digitalWrite(reley1, LOW);}
      if (interval > 300  && interval<=1300) 
      {digitalWrite(reley1, HIGH);}
      if (interval > 1300  && interval<=1600) 
      {digitalWrite(reley2, LOW);}  
      if (interval > 1600  && interval<=2600)
      {digitalWrite(reley2, HIGH);}
      if (interval > 2600  && interval<=2900)
      {digitalWrite(reley1, LOW);}
      if (interval > 2900  && interval<=3900)
      {digitalWrite(reley1, HIGH);}
      if (interval > 600000) 
      {flag = 0;}
        }
        

    
}

      

 

saltysoff
Offline
Зарегистрирован: 05.02.2018

evgta пишет:

хотя новичку с #24 по мне так еще хуже читается

100% хуже! :)