подскажите, а лучше на примере моём покажите как избавится от делэев и настроить щочик фор
- Войдите на сайт для отправки комментариев
Чт, 30/01/2020 - 13:38
помогите сирому и убогому со скейчем. идея фикс избавится от делеев и запустить цикл фор так как последний не работает. Хотя отдельно от основного скейча работает. / длиные провода экранируются от новодок борт сети стоит две кренки 12 и 5 вольт. если стоит саб то желательно на делителе поставить кондёр 1000 мф для стобилизацыи при просадке #include <Wire.h> // подключаем библиотеку для работы с шиной I2C #include <OneWire.h> // подключаем библиотеку для работы датчика температуры #include <LiquidCrystal_I2C.h> // подключаем библиотеку для работы с LCD дисплеем #include <iarduino_RTC.h> // подключаем библиотеку для работы с RTC модулем #include <DS3232RTC.h> LiquidCrystal_I2C lcd(0x3F, 16, 2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) LiquidCrystal_I2C lcd2(0x27, 16, 2); iarduino_RTC time(RTC_DS3231); // объявляем переменную для работы с RTC модулем, указывая название модуля DS3232RTC myRTC; OneWire ds(9); // в скобках задаём пин ардуино, к которому подключен датчик температуры volatile unsigned int int_tic = 0; volatile unsigned long tic; const int analogIn = A0; int Analog1Value = A1; int Analog2Value = A2; int Water; byte Oil; byte Ry = 4; byte PD = 7; byte LD = 8; byte but = 10; byte rele = 2; byte buzer = 3; float val = 0; int kon = 0; void setup() { Serial.begin(9600); myRTC.begin(); time.begin(); // инициируем RTC модуль lcd.init(); //инициируем LCD дисплей lcd2.init(); lcd.backlight(); // включаем подсветку LCD дисплея lcd2.backlight(); pinMode(but, OUTPUT ); pinMode(Ry, INPUT); // к + через 10к минус кнопка и диод pinMode(PD, INPUT); // к + через 10к минус кнопка и диод pinMode(LD, INPUT); // к + через 10к минус кнопка и диод pinMode(rele, OUTPUT); // реле pinMode(buzer, OUTPUT); // пищалка TCCR1A = 0; TIMSK1 = 1 << TOIE1; //прерывание по переполнению } ISR (TIMER1_OVF_vect) { int_tic++; } void loop() { val = analogRead(A0); val = val / 1024 * 55.0; // делитель 10k 100k к бортовой сети Analog1Value = analogRead(A1); Analog2Value = analogRead(A2); Water = map (Analog1Value, 0, 1024, 130, -10); // делитель 1к притянут к + минус к дачику температуры Oil = map (Analog2Value, 1024, 360, 6,0); // делитель 1к притянут к + минус к дачику давления byte data[9]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(750); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1] << 8) + data[0]; Temp = Temp >> 4; pinMode (5, INPUT); // вход сигнала T1 (only для atmega328) TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1 delay(500); TCCR1B = 0; tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало int_tic = 0; TCNT1 = 0; int RpM = tic * 60; lcd.setCursor(0, 0); lcd.print("RpM= "); lcd.print(RpM); lcd.print(" "); lcd2.setCursor(0, 0); lcd2.print(val, 1); lcd2.print("Volt"); lcd2.setCursor(9, 0); lcd2.print(Oil, 1); lcd2.print("_Oil"); lcd2.setCursor(0, 1); lcd2.print(Water, 1); lcd2.print((char)223); // Знак градуса lcd2.print("Water"); lcd2.setCursor(9, 1); lcd2.print(Temp, 1); //выводим цифры с температурой lcd2.print((char)223); lcd2.print("Temp"); delay(1000); if (digitalRead(LD) == LOW && RpM > 1000 ) { // открытая дверь лв delay(200); tone(3, 2000, 200); lcd.clear(); lcd.print("LEVAYA DVER"); lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(time.gettime("H:i:s d-mD")); } else { digitalWrite(buzer, LOW); lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(time.gettime("H:i:s d-mD")); } if (digitalRead(PD) == LOW && RpM > 1000 ) { // открытая дверь пр delay(200); tone(3, 2000, 200); lcd.clear(); lcd.print("PRAVAYA DVER"); } else { digitalWrite(buzer, LOW); lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(time.gettime("H:i:s d-mD")); } if (digitalRead(Ry) == LOW && RpM > 1000 ) { //условие поднятия ручника delay(200); tone(3, 2000, 500); lcd.clear(); lcd.print("RYCHNIK"); } else { digitalWrite(buzer, LOW); lcd.setCursor(0, 1); lcd.print(time.gettime("H:i:s d-mD")); } if (val < 12 && RpM > 1000 ) { // условия при заведеном маторе delay(200); tone(3, 2000, 700); lcd.clear(); lcd.print("HET 3APYADKI"); } if (val < 11) { // сдесь условия проверяются при заглушоном моторе 11 чтоб при просадки сети когда игрет муз не пищал delay(200); tone(3, 2000, 900); lcd.clear(); lcd.print("clabjii zarayd"); } else { (val > 12); digitalWrite(buzer, LOW); lcd.setCursor(0, 1); lcd.print(time.gettime("H:i:s d-mD")); } if (Water > 99 && RpM > 1000 ) { //условия перегрева мотора при заведёном моторе delay(200); tone(3, 2000, 800); lcd.clear(); lcd.print("PEREGREV"); } else { (Water < 96); digitalWrite(buzer, LOW); lcd.setCursor(0, 1); lcd.print(time.gettime("H:i:s d-mD")); } if (Oil < 1 && RpM > 1000 ) { // условия давления масла при заведёном моторе delay(200); tone(3, 2000, 900); lcd.clear(); lcd.print("DAVLENIE MASLO"); } else { (Oil > 2); digitalWrite(buzer, LOW); lcd.setCursor(0, 1); lcd.print(time.gettime("H:i:s d-mD")); } if (Temp <= 0) { delay(100); lcd2.setCursor(15 , 0); lcd2.print("*"); } else { (Temp > 0); { lcd2.setCursor(15, 0); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd2.print(" "); } if (digitalRead (rele) == HIGH ){ delay(100); lcd.setCursor(15 , 0); lcd.print("#"); } else { lcd.setCursor(15, 0); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(" "); } kon = digitalRead( but ); // если состояние кнопки - истина, выполняем действие if( kon == HIGH ){ // цикл от 0 до ..., с шагом 1 for(int j=0; j<105; j++ ){ digitalWrite( rele, HIGH ); delay(200); j>105; digitalWrite( rele, LOW ); } } } }
У автора кода спроси.
Ну так я его из разных кусков кода собрал. боюсь не один автор уже и не узнает что это его код был.
тогда разные куски по очереди и настраивай.
вы не поняли по ходу, сути моей проблемы. Все работает кроме цикла. и я хочу от делэев избавится. сколько не читал в ехать не могу. ведать не стоило мне делеями голову забивать. вот и хочу чтоб мне на примере показали. ведь на собственном коде будет легче разабраца. и ткули носом в мою ошибку почему цикл фор не работает. а да и сам по себе цикл работает.
Цикл работает так, как написан. Говорить, что он не работает - нельзя.
Первый виток цикла:
В строке 207 включается реле.
Задержка 200.
Строка 210 - для мебели, ничего не делает.
Строка 211 - выключение реле.
Второй виток цикла:
В строке 207 включается реле.
И т.д.
Можно посчитать, но не интересно, сколько пройдет времени между выключением реле (в конце первого витка цикла) и включением его в начале второго витка цикла. Да всё просто. 0 (ноль). Точнее достаточно малый промежуток времени, за который реле даже не успеет чухнуться (выключиться), потому что реле - штука медленная, чтобы изменить состояние, нужно подождать. Поэтому кажется, что цикл не работает.
Для тупой проверки, поставь после строки 211 задержку. И тогда цикл будет добивать это реле, каждый раз 105 раз включать и выключать реле. Только лучше сразу закупить запас релюшек, потому что такая игра им не понравится.
Удачи!
может даже и ваша строчка в нём есть. кто ведает
я так понимаю что мне теперь надо как-то объявить что J = rele/ или я совсем боран... извините за назойливость. спасибо. и по чему он отдельно от общего кода работает.как положено и включает реле на заданный интервал.
тогда разные куски по очереди и настраивай.
скажи мне, что у тебя делает строка 210?
скажи мне, что у тебя делает строка 210?
скажи мне, что у тебя делает строка 210?
скажи мне, что у тебя делает строка 210?
Посчитай, сколько времени у тебя выполняется один раз loop, например, при открытых дверях и включенном двигателе?
750+500+1000+200+200... уже около 2.5 секунд. А если еще и кнопка kon нажата, то больше 20 секунд - это один проход по loop.
Это для того, чтобы не говорить, что цикл "не работает". Работает ровно так, как написан.
В Arduino IDE есть в примерах Blink без delay - это и есть простой пример, как обходиться без delay (используй для того, чтобы включить/выключить реле вместо светодиода, для начала). На форуме море тем и вопросов как обойтись без delay. Разбираться и делать как надо. Других вариантов нет. Впрочем, можно заказать - сделают, если самому не получится.
Сначала разберись, что делает программа. Что делает каждая строка. Для чего там нужны задержки. Потом выбрось инициализацию датчиков и дисплея за пределы loop, вынеси в setup. Затем, примерно, нужно определить, какое время выполнения одного прохода loop приемлимо. Например, сейчас, от 2 до 25 секунд - это явно перебор. Вот тогда возникнет понимание, насколько быстро нужно выполнить loop и возможно ли это вообще. Разделить задачу не подзадачи. Выделить среди них наиболее приоритетные, какие нужно выполнять каждый раз, а какие - не обязательно, а достаточно, например, раз в 5-10 секунд.
Звук (tone) - это тоже задержка. delay натыканы как попало, такое впечатление, что они методом тыка вставлялись без понимания общей задачи.
Поверь, что никто тебе не даст пример, как избавиться от delay в твоем случае. Для этого нужно переписать весь loop. Т.е. сделать за тебя всё задачу. Ну может и есть тут добрые дядя, хз, только не я, уж извини.
Посчитай, сколько времени у тебя выполняется один раз loop, например, при открытых дверях и включенном двигателе?
750+500+1000+200+200... уже около 2.5 секунд. А если еще и кнопка kon нажата, то больше 20 секунд - это один проход по loop.
Это для того, чтобы не говорить, что цикл "не работает". Работает ровно так, как написан.
В Arduino IDE есть в примерах Blink без delay - это и есть простой пример, как обходиться без delay (используй для того, чтобы включить/выключить реле вместо светодиода, для начала). На форуме море тем и вопросов как обойтись без delay. Разбираться и делать как надо. Других вариантов нет. Впрочем, можно заказать - сделают, если самому не получится.
Сначала разберись, что делает программа. Что делает каждая строка. Для чего там нужны задержки. Потом выбрось инициализацию датчиков и дисплея за пределы loop, вынеси в setup. Затем, примерно, нужно определить, какое время выполнения одного прохода loop приемлимо. Например, сейчас, от 2 до 25 секунд - это явно перебор. Вот тогда возникнет понимание, насколько быстро нужно выполнить loop и возможно ли это вообще. Разделить задачу не подзадачи. Выделить среди них наиболее приоритетные, какие нужно выполнять каждый раз, а какие - не обязательно, а достаточно, например, раз в 5-10 секунд.
Звук (tone) - это тоже задержка. delay натыканы как попало, такое впечатление, что они методом тыка вставлялись без понимания общей задачи.
Поверь, что никто тебе не даст пример, как избавиться от delay в твоем случае. Для этого нужно переписать весь loop. Т.е. сделать за тебя всё задачу. Ну может и есть тут добрые дядя, хз, только не я, уж извини.
На счет помойки - это зря. Какой-то опыт приобрёл. Положительный и отрицательный. Если есть цель, то нужно использовать полученный опыт, читать/искать, как решают другие подобные задачи, разбираться почему и как они реализуют то или иное действие. Это жизнь. Если просто проехаться по магазинам автозапчастей и накупить разных запчастей от разных марок, то после сборки Феррари не получится. Или, во всяком случае, придётся очень потрудиться. Это уже потом, когда возникнет понимание, можно будет придумывать своё (впрочем всё уже давно написано до нас).
Иногда, когда нет понимания, например, у людей получается код, который, типа, работает. Даже если написан полный говнокод. Ура! Только при первой же правке, код ломается и больше не работает. Что за нафиг! Так ничесна! Но такова се ля ви. Вот и меня ждёт моя работа, пойду дальше свой говнокод писать.
Что то не пойму, кто кого пытается н****ть.
Тут же таймеры аппаратные , тут же , "не знаю как убрать delay()".
это всё и в какой последовательности должен писать.
это всё и в какой последовательности должен писать.
if
(digitalRead(LD) == LOW && RpM > 1000 ) {
// открытая дверь лв
106
delay(200);
107
tone(3, 2000, 200);
108
lcd.clear();
109
lcd.print(
"LEVAYA DVER"
);
110
lcd.setCursor(0, 1);
// устанавливаем курсор в позицию: столбец 0, строка 1
111
lcd.print(time.gettime(
"H:i:s d-mD"
));
112
113
}
else
{
114
digitalWrite(buzer, LOW);
115
lcd.setCursor(0, 1);
// устанавливаем курсор в позицию: столбец 0, строка 1
116
lcd.print(time.gettime(
"H:i:s d-mD"
));
117
может хоть кто нибудь написать вот на даном примере вместо делей подставить (millis)
чтоб нагляднее было. спасибо.
А почему кто то должен писать за вас, если у вас даже нет желания понять что происходит в данном коде ?
Даже если у кого то есть свободное время , то почему он должен его тратить на ваше обучение ?
Если вы не поняли чего то из примера, то это означает только то, что это не ваше.
Объясните для начала , хотя бы себе, пошагово, что должна делать ваша программа.
Написание кода , это 5-40%(в зависимости от скилла) работы непосредственно в редакторе.
Все остальное это обдумывание алгоритма и чтение мануалов.
Поясню про millis():
Это системная функция внутри которой 32-битная беззанковая переменная раз в миллисекунду увеличивает свое значение на 1.
Т.е. в любой момент времени мы можем узнать , сколько времени прошло с начала работы программы.
А дальше уже нужно включить логику и использовать это знание .
Как мне включить за вас вашу логику ?
Моя логика мне вот подсказывает, что если нам нужно отмерить отрезок времени, то нам нужно запомнить значение на начало отрезка и сравнивать время начала с временем которое будет концом отрезка. А это простая арифметика.
Просто переодически сравниваем :
millis()-timer_start>=interval;
На первое значение мы повлиять не можем , оно без нас тикает и растет раз в мс. Второе мы запомнили, когда начали отсчёт. Ну а когда их разность станет равна (или превысит, потому , что не факт что цикл у нас будет проходить быстрее 1мс и вариант "=" мы можем просто проскочить, поэтому ">="), то третье значение это и будет наша задержка.
Теперь за вас придумать как это использовать в вашем коде ?
Репетиторство денег стоит.
Если интересно , то для этого есть другой раздел.
Кактус, для "бизнеса" есть другой раздел.
не придирайся, Кактус потратил 20 строк на обьяснение по сути и лишь в паре последних написал "про бизнес". по мне так совершенно нормально.
По сути я с ним полностью согласен - если человек не понимает даже примеров из специальных туториалов для новичков - то остается только нанимать платных репетиторов
ВладимирN - вы прислушайтесь к тому, что написал kisoft, если позабыли перечитайте еще раз.
Прежде чем внедрять в программу millis(). вам нужно разобраться. что у вас вообще каждая часть кода делает. Например. вы вот собрались переписывать цикл for . А зачем? - в той программе. что вы показали. цикл фор вообще не нужен, вместо него можно вставить просто 20-секундуную задержку - все будет работать даже лучше.
так зачем тратить время на переписывание кода, который ничего не делает?
ВладимирN - вы прислушайтесь к тому, что написал kisoft, если позабыли перечитайте еще раз.
Прежде чем внедрять в программу millis(). вам нужно разобраться. что у вас вообще каждая часть кода делает. Например. вы вот собрались переписывать цикл for . А зачем? - в той программе. что вы показали. цикл фор вообще не нужен, вместо него можно вставить просто 20-секундуную задержку - все будет работать даже лучше.
так зачем тратить время на переписывание кода, который ничего не делает?
Владимир, вы совсем ничего сами читать не хотите? - тогда ищите себе другой форум, писать код и разбирать стандартные примеры за вас никто не будет
По предыдущему ответу отлично видно, что вы даже не пытались вникнуть в то, что вам написали.
Удачи
Дак он реально думает, что ему 5 лет института за 3 сообщения разжуют. Наивный.
Дак он реально думает, что ему 5 лет института за 3 сообщения разжуют. Наивный.
Выше у тебя не код, а яйца всмятку. Ты можешь своими словами написать алгоритм своих дествий после того как жена тебе скажет: "Выключи суп через 15 минут".
Напиши. Потом будем переводить твои слова в millis() если я еще трезвый буду
я не прошу не кого за меня код переписывать. просто на примере показать. про милис на куске кода. что я привел выше.
вы никак не хотите понять, что "переписывать код на миллис" ради самого переписывания - бред. Нужно понимать, зачем это делается? - если вы хотите за время этого delay(200) сделать что-то еще в программе - то надо значть что и где. А этого в коде нет.
А если другие куски программы в это время ничего не делают - то и переписывать ничего не нужно, вариант с делей вполне рабочий.
Дак он реально думает, что ему 5 лет института за 3 сообщения разжуют. Наивный.
по-моему он вообще ничего не думает, потому что не умеет. Соотбщение Кактуса про то, как работает миллис - даже читать не стал. Еще и обиделся, дескать не надо мне обьяснять, помогите материально... тьфу дайте готовый код
я не прошу не кого за меня код переписывать. просто на примере показать. про милис на куске кода. что я привел выше.
вы никак не хотите понять, что "переписывать код на миллис" ради самого переписывания - бред. Нужно понимать, зачем это делается? - если вы хотите за время этого delay(200) сделать что-то еще в программе - то надо значть что и где. А этого в коде нет.
А если другие куски программы в это время ничего не делают - то и переписывать ничего не нужно, вариант с делей вполне рабочий.
Все. Вопросов больше не имею. Пойду лучше тяпну с устатку.
Дак он реально думает, что ему 5 лет института за 3 сообщения разжуют. Наивный.
по-моему он вообще ничего не думает, потому что не умеет. Соотбщение Кактуса про то, как работает миллис - даже читать не стал. Еще и обиделся, дескать не надо мне обьяснять, помогите материально... тьфу дайте готовый код
Все. Вопросов больше не имею. Пойду лучше тяпну с устатку.
Писец твоему супу и от жены писец :)
Перейти с делай на millis() это перейти с вождения слона на коня(шахматного). Вроде равноценные фигуры, но просчитывать ходы и их последствия сложнее. Вот и тактика меняется и описывать ходы коня приходится иначе.
[я понимаю что нужно создать переменную в которой будет храница время запуска ардуино но как с ней с этой переменной дальше работать не знаю. сухой пример про милис раз 300 перечитал а вот толк так и не возьму что да как
блин, если вы первый пример не поняли - нафига вам второй?
Протираю сертификат потихоньку. Готовимся вручать.
[я понимаю что нужно создать переменную в которой будет храница время запуска ардуино но как с ней с этой переменной дальше работать не знаю. сухой пример про милис раз 300 перечитал а вот толк так и не возьму что да как
блин, если вы первый пример не поняли - нафига вам второй?
Всех прошу извинить за потраченное на меня время всем СПАСИБО. громадное.
Володимир, вам ведь деда Сёма сделал шикарное предложение (алгоритм написать о времени, жене и супе), чем оно не устраивает, он не прикалывался, кста. Любая программа начинается с идеи, которая должна быть переложена в алгоритм. И вот либо вы можете алгоритм составить, либо нет.
Володимир, вам ведь деда Сёма сделал шикарное предложение (алгоритм написать о времени, жене и супе), чем оно не устраивает, он не прикалывался, кста. Любая программа начинается с идеи, которая должна быть переложена в алгоритм. И вот либо вы можете алгоритм составить, либо нет.
Вам в #30, Дед предложил расписать определенный алгоритм, с тем чтобы потом показать как сделать это на миллисе. Вы знаете, что значит слово алгоритм и как он составляется?
Вам в #30, Дед предложил расписать определенный алгоритм, с тем чтобы потом показать как сделать это на миллисе. Вы знаете, что значит слово алгоритм и как он составляется?
Поздно благодарить, он возможно уже сертификат к выдаче начистил, микстуру принял и злобой наливается, а может и повезет, если он микстуру пофигом заедал.
Птицу-удачу, её на лету ловить надо.
кстати, о замене цикла ФОР миллисами сегодня еще вот тут
http://arduino.ru/forum/programmirovanie/pomogite-novichku-s-plavnym-vkl-i-vykl-lenty#comment-512264
обсуждали и MaksVV ссылку на хороий примерчик кидал
В общем читая высеры и огрызания тс, прихожу к выводу, что весь пост очередной ,ловко завуалированный -"напишите за меня скетч".
ТС тут бесплатно за тебя делать не будут. Объяснить попытаются. Если тебе не нужно объяснять, потому, что "ты и сам знаешь, что ты тупой и ничего не поймёшь", тогда тебе тут и делать наверное нечего.
Это да. Сразу же вспомнилось армейское выражение "образ сурка ведёте жизни". Извиняюсь за офф.)
Это да. Сразу же вспомнилось армейское выражение "образ сурка ведёте жизни". Извиняюсь за офф.)
А вот порядок слов с millis()
Но как очередному новичку "русскому", которому под сраку лет, объяснить что надо включать голову и писать правильно, а не как бог на русскую душу положит , и потом этот бред выложит на "русский" форум, потому что "русские своих не бросают" :))