Помогите уйти от delay
- Войдите на сайт для отправки комментариев
Пнд, 19/02/2018 - 14:32
Помогите разобраться, есть код для управления релюхами взависимости от давления, но он с 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); //пауза
}
}
строки с 32 по 39 можно выкинуть - они не нужны.
Что касается перехода на миллис - ваш скетч состояит из одних делеев, его нет смысла править, надо писать новый с нуля. Вряд ли кто-то будет делать это за вас.
Ненадо с нуля, объясните как переключать в определенной последовательности реле в зависимости от того что имеем на входе
Итак, In My Humble Opinion...
delay(n) == следующему:
unsigned long timing; timing = millis(); while((millis() - timing) < n) { }...где n - время в миллисекундах
Если есть желание - меняй делэи на что то подобное.
Я делаю так.
Поправьте, если кто-то считает иначе...
Итак, In My Humble Opinion...
delay(n) == следующему:
unsigned long timing; timing = millis(); while((millis() - timing) < n) { }...где n - время в миллисекундах
Если есть желание - меняй делэи на что то подобное.
Я делаю так.
Поправьте, если кто-то считает иначе...
этот код полностью эквивалентен функции delay() - и ровно точно также подвешивает программу, как сам делей. Менять делей на это - нет ни малейшего смысла.
Смысл все равно есть. В цикле можно выводить данные на дисплей. Правда это возможно и с delay... ТС, исходя из кода, Вы даже не попытались вклинить дисплей.
Можно. Еще и кнопки туда можно :) Но это... блин... ппц :) А если 5 реле - пять раз код вклинивать ?
Подход в принципе разный. Ваш код в том месте, где delay, выпоняется команда за командой последовательно. В случае правильной замены ваш код будет выполняться непрерывно в цикле и в определенные моменты включать/выключать нужные реле. Вам для чего это нужно ? Просто так взять и пару строк поменять тут не получится, код будет сложнее для понимания.
Изучаем до просветления, проще вроде уже никак не объяснить. Параллельные темы тоже не грех просмотреть. А вот во вхули цикл бабушку миллис заворачивать не нужно. Пожалейте старушку. ИМХО.
Я уже весь измигался светодиодами вдоль и поперёк, везде предлагают цикличное включение чего нибудь, а надо последовательное, и последовательность должна быть определённая и разная в зависимости от того что подано на вход.
надо последовательное, и последовательность должна быть определённая и разная в зависимости от того что подано на вход.
это называется "конечный автомат". ЕвгенийП где-то писал про него трактат - поищите поиском
здравствуйте. у меня что-то похожее, но я использую маленькие задержки SYSCOUNT.
код примерно такой:
main() { uint16_t syscount=0; while(1){ if (syscount%200==0 ) { // если 200 тиков по 50мс прошло, то входим в событие ............ } if (syscount%10==0) { если 10 тиков по 50мс прошло входим в событие .... } delay(50); syscount++; } }успехов
Так уже millis есть - можно использовать вместо syscount, а принцип такой, да.
Я уже весь измигался светодиодами вдоль и поперёк, везде предлагают цикличное включение чего нибудь, а надо последовательное, и последовательность должна быть определённая и разная в зависимости от того что подано на вход.
Последовательность будет какая угодно, но сам алгоритм должен бегать в цикле постоянно и оперативно реагировать на воздействия / дергать ногами. Просто когда вам нужно включить реле на 3 секунды - вызываете функцию типа включить_реле(n, 3000), она отмечает (запоминает) время включения этого реле и время выключения (ну или запоминает на сколько включили), а после в любом месте основного цикла вызываете что то типа выключение_всех_реле() и эта функция смотрит, где текущий счетчик millis превысил время отключения каждого реле - отключает такие, никаких delay. Чтобы получить четкую последовательность можно во второй функции при отключении одного реле сразу запускать другое или контролировать необходимость отключения отдельно от самого выключения в основном цикле ( чем то типа функции не_пришло_ли_время_отключить_реле(n) ).
У меня даже включить их поочереди не удаётся
#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); // реализуем новое состояние } }Вы пытаетесь их использовать как делей, создавая последовательный код, что в корне неверно, вам нужен псевдопараллельный. Напишите сценарий исполнения (про конечные автоматы уже писали), выведите из лупа в отдельные функции (намного легче отлаживать) и в них отрабатывайте ваш сценарий. Интервалы можете передавать или назначать в функции различные, в зависимости от номера прохода. Как пример - функция с двумя разными действиями и разными интервалами. По образу и подобию можете расширить на требуемое количество шагов.
Давайте не будем говорить о тех - о ком нам нельзя говорить. Я не специалист в ардуино, а вы мне про номера прохода. Если для вас проблема объяснить на доступном для начинающего языке, то так и напишите, или не пишите ничего - зачем тратить ваше и моё время на пустое. Сразу бы отправили меня в гугл и вопрос исчерпан.
saltysoff если можно , опишите алгоритм работы вашего устройства. А то я из первого скетча недопонял. например ,
если
реле повключались -повыключались.
А потом все остановилось на 10 сек.
По прошествии 10 сек опять все по кругу? Так и задумано? Или по другому как-то?
А там вместе подумаем как реализовать вашу задумку через миллис. А остальные нам помогут.
Давайте не будем говорить о тех - о ком нам нельзя говорить. Я не специалист в ардуино, а вы мне про номера прохода. Если для вас проблема объяснить на доступном для начинающего языке, то так и напишите, или не пишите ничего - зачем тратить ваше и моё время на пустое. Сразу бы отправили меня в гугл и вопрос исчерпан.
Так вот . Без определенного минимума знаний просто невозможно объснить некоторые приемы. Можно только (цензура). Подтяните ваш минимум и все станет ясно , или плюньте на решение этой проблемы.
Давайте не будем говорить о тех - о ком нам нельзя говорить. Я не специалист в ардуино, а вы мне про номера прохода. Если для вас проблема объяснить на доступном для начинающего языке, то так и напишите, или не пишите ничего - зачем тратить ваше и моё время на пустое. Сразу бы отправили меня в гугл и вопрос исчерпан.
А при чем здесь специалист-неспециалист? Это ваша программа и только вы знаете как она должна работать. Только вы можете написать ее сценарий, к примеру: у вас три варианта давления, у меня возникает вопрос, если мы начали выполнять первый блок if (из первого поста), а давление опустилось до второго уровня, должны мы прекратить выполнение первого сценария и перейти ко второму или нет и т.д. Может ли такое снижение произойти физически? Если может, но первый сценарий должен быть выполнен до конца, надо предусматривать проверку окончания первого сценария и только потом переходить к следующему. Пока вы не ответите на эти вопросы и не создадите таблицы разрешенных и запрещенных состояний, вы не сможете двигаться дальше. Псевдопараллельный код обладает всеми свойствами параллельного (в нашем восприятии времени), он не ждет окончательного исполнения предыдущего блока, а переходит к следующему и т.д. И здесь уже все на совести и усмотрение разработчика.
Тот код не совсем правильный.
Правильный:
#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 и задержка в шесть минут. релюхи управляют регулятором-стабилизатором напряжения.
в момент 6 минут давление проверяется?
Тот код не совсем правильный.
Правильный:
Как и в первом коде - здесь второй блок лишний, его можно выкинуть без ущерба для скетча (строки 32 -37)
saltysoff - думал вам пример набросать, как работает машина состояний - но смотрю, вы тут бычить начали, указываете. кому и что следует вам писать. Похоже, вы типичная ленивая Ж., которая ничему учиться не желает, а ждет чтоб ей все разжевали и в рот положили. С вашим уровнем знаний написать подобную систему будет трудно, нужно слушать советы, рыться в гугле, изучать статьи, примеры и пробовать писать код. Вы же за целый день ничего из этого и не начали. При таком подходе варианта только два - либо вам кто-то "добрый" даст готовый код, либо вы пойдете с форума решать свои проблемы в одиночку.
Есть высокоточный регулятор мощности РМ-2, и я ничего умнее не придумал, как подключить контакты реле параллельно кнопкам этого регулятора. Сейчас я визуально контролирую давление по механическому манометру, а хотелось бы прейти на дисплей. шесть минут для того, чтобы дать время привести давление в норму. если шести минут будет не достаточно - цикл повторяется - и снова шесть минут и т.д
Я к тому, что все вокруг только разжевывают, как мигать светодиодом, а как что по серьёзнее - ленивая Ж. Я никого не принуждаю, попросил помощи - помогли - хорошо, не помогли - ну чтож... я у мамы "инженер", найду другой выход решения своей проблемы. прежде чем я сюда написал, я три месяца "курил" форумы, но кроме как умных миганий светодиодом... и ссылок на форумы где учат мигать я ничего не почерпнул.
saltysoff, чтобы научиться писать стихи, сначала нужно научиться писать буквы. Потому научиться из букв складывать слова. Затем из слов - предложения. С учетом орфографии и пунктуации. Затем нужно понять, что такое рифма, размер и пр.
Вы же хотите, не умея мигать светодиодом, сразу достаточно сложную программу.
Так не получится.
Либо начинайте со светодтода либо бросайте это дело - значит, оно не Ваше.
Как вы не поймете, мигать диодом - это выполнение действия. Что подключите вместо диода, то и будет это действие выполнять. У цифровой логики только два состояния - включено и выключено, все остальное их совокупность.
Я сегодня добрый, на миллисе и простенько на ифах для первого блока:
Глобальные переменные Все флаги тру если ни один сценарий не задействован 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 забыл в ифах шагов.((((
Спасибо! буду думать, расшифровывать)
Что то пошло не так
//Глобальные переменные //Все флаги 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(); } }как-то так, наверное. не провнрял
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;} }Что то пошло не так
Что не так то? У меня все так. Вам же уже сказали, синтаксис подучите и логику подтяните:
//Глобальные переменные //Все флаги 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(); } }Здесь принты вместо светодиода, они поинформативней, подключите светики вместо реле, они еще и мигать будут. Теперь скажите, в чем отличие вашей хотелки с реле от мигания светодиодами из так нелюбимых вами несерьезных примеров?
Что не так то? У меня все так. Вам же уже сказали, синтаксис подучите и логику подтяните:
Лет так эдак 25 назад, я бы с легкостью подучил и подтянул, но сейчас мне это очень тяжело даётся, и поэтому я здесь, по крупицам пытаюсь разобраться. Светодиоды у меня есть на релюхах. но они не мигают без конца и цели, а работают только по необходимости, когда давление находится вне пределов гистерезиса.
Лет эдак 20 назад я забыл что такое программировать и паять, а года три назад вернулся, тогда же про ардуину узнал, точнее наоборот. Для того чтобы написать вашу программу не требуется иметь компрессор с его реле, датчиками, ресиверами...., не нужны ваши библиотеки, все можно сэмулировать с помощью переменной val. Обладая этим минимумом можно написать и отладить полностью работоспособную программу. Вот нахрена мне на столе этот здоровый пускатель, со всем его питанием и обвязкой, если загорается светодиод, то при правильном согласовании пускатель тоже обязан включиться. Если при работе на живом железе начнуться сбои, то к программе это отношения не имеет, это аппаратные проблемы и решать их надо на уровне железа. ИМХО.
Лет так эдак 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++; }предлагаю unoScen чуть переписать
Специально не стал свитч с массивами использовать, это уже следующий шаг и его лучше делать самостоятельно. ИМХО.
Специально не стал свитч с массивами использовать, это уже следующий шаг и его лучше делать самостоятельно. ИМХО.
извините, что влез.
Специально не стал свитч с массивами использовать, это уже следующий шаг и его лучше делать самостоятельно. ИМХО.
извините, что влез.
Отнюдь, отнюдь, очень даже приветствую, чисто объяснил мотивацию.))))
Вот этот код работает, только как-то несоответствует время вкл;выкл заданным параметрам
#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;} }Ню, ню, ребусы тоже дело хорошее.))))
Лучше сразу нормально делать. Ничего хитрого нет - один раз в голове уложить и забыть о delay(), один черт в более сложных девайсах придется нормально писать.
Вот этот код работает, только как-то несоответствует время вкл;выкл заданным параметрам
что значит несоответсвует?
здесь отсчет не один за другим идет, а от того момента когда засекается точка отсчета, т.е 300+1000+300+500
будет 300, 1300, 1600, 2100
Это значит что вместо 300+1000+300+1000+300 идёт к примеру 300+1000+218+1000+300. Не знаю какая взаимосвязь, но при отключении HX711 всё начинает работать правильно, при подключении обратно цикл "сбивается".
Опрос 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;} }или так
#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;} } }Спасибо! Вы мне очень помогли! Заменил 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;} }вот так получше выглядит
а если между значениями 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;} } }код #41 извиняет лишь то, что он приведен в учебных целях... код #42 чуть лучше. Очень некрасивый код, в котором легко запутаться и который трудно отлаживать. Куча лишних вызовов миллис, огромные неуклюжие условия IF.
Код bwn из сообщения #24 на порядок лучше, советую ТС ориентироваться на него. Всегда нужно стремится писать так, чтобы код не просто работал, а еще был понятным и логичным. И красивым.
Все что выше - ИМХО.
Я не собирался останавливаться и планирую его изучить (код #24). так сказать следующий шаг в ардуино.
сорри за резкое суждение #45
На уровне ассоциаций - код #41 это как бурелом из миллис и условий IF. в то время как #24 - ровная просека с отворотами под каждую стадию :)
Чисто ИМХО
Это было бы ещё меньшим буреломом, если всё это на шим перевести, но с моим уровнем познаний пока не реально.
так получше читается ? хотя новичку с #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;} } }хотя новичку с #24 по мне так еще хуже читается
100% хуже! :)