как избавиться от deley?
- Войдите на сайт для отправки комментариев
Пнд, 23/04/2018 - 16:55
Привеиствую Вас, уважаемые форумчане подскажите пожайлуста как можно организовать задержку на пине "OutLed = D4" без deley? а то происходит торможение если его увеличить до 5сек
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "HX711.h"
char auth[] = "";
char ssid[] = "";
char pass[] = "";
int myslider1 = 0; // переменная для значений регулятора
int myslider2 = 0;
HX711 scale(D6,D7);
float calibration_factor = -10.572; // калибровка!
float units;
float ounces;
int OutLed = D4; // светодиод сигнала достижения веса
BLYNK_WRITE(V5){calibration_factor = myslider1 = param.asInt();
Serial.print("Значение регулятора = ");
Serial.println(myslider1);
}
BLYNK_WRITE(V6){ myslider2 = param.asInt();
Serial.print("Значение регулятора = ");
Serial.println(myslider2);
}
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
Serial.begin(9600);
pinMode(OutLed, OUTPUT);
scale.set_scale();
scale.tare(); //Сбрасываем на 0
scale.set_scale(calibration_factor); //Применяем калибровку
// устанавливаем внешние параметры кнопки
Blynk.setProperty(V5, "onLabel", "Регулятор");
Blynk.setProperty(V5, "color", "#FFFF00");
// устанавливаем внешние параметры кнопки
Blynk.setProperty(V6, "onLabel", "Регулятор");
Blynk.setProperty(V6, "color", "#FFFF00");
}
void loop() {
Serial.print("Reading: ");
for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10; // усредняем показания считав 10 раз
units / 10; // делим на 10
ounces = units * 0.035274; // переводим унции в граммы
if (ounces >= myslider2)
{digitalWrite(OutLed,HIGH);
delay(1000); // Этот deley тормозит код! надо 5сек
}
else{digitalWrite(OutLed,LOW);
}
Serial.print(ounces); // отправляем в монитор порта
Serial.print(" grams");
Serial.println();
Blynk.virtualWrite(V1,ounces );
Blynk.run();
}
А где в коде "deley"? Не нашёл. От чего избавляться-то?
А где в коде "deley"? Не нашёл. От чего избавляться-то?
Похоже вот
if (ounces >= myslider2) {digitalWrite(OutLed,HIGH); delay(1000); // Этот deley тормозит код! надо 5сек } else{digitalWrite(OutLed,LOW); }В комментарии что-ли? Так удалить его оттуда, вот и всё избавление! :)
delay(1000); // Этот deley тормозит код! надо 5сек
То есть , если поставить 5сек, то тормозить не будет?
То есть , если поставить 5сек, то тормозить не будет?
5.09 - что бы наверняка. О_О
Да нужно чтобы 5сек, но не получается! Начинает тормозить блинк. В мониторе пишет нет конекта. Чем можно заменить?
Да у Вас в коде кроме делея еще много чего интересного.
Вот строчка
Нафига там через запятую 10? Чего Вы хотели этим добиться? Да и само выражение units =+ scale.get_units() выглядит странно, хотя компилятор схавает.
А следующая строка
Вас ни на какие размышления не наталкивает?
Я думаю, избавиться от делей Вам помогут, если Вы для начала словами распишите что должно выполняться в loop. То есть то, что Вы ожидаете от программы.
В этом деле новичек это первый скетч. Строчку взял из образца.
Если в двух словах то: При наполнении емкости заданным весом должно сработать реле и быть включеным 5сек , что бы освободилась тара. и так цикл повторяется. через Blynk я устанавливаю заданный вес
myslider2.Программа не оперирует ни весом, ни реле. Есть переменные и их значения.
А что должно происходить, пока реле включено?
ПС. Это не правильный образец, либо Вы были не внимательны, когда его копировали.
я понял лучше наверно поставить кнопку и на время нажатия кнопки выходы реле не меняли своего состояния?
я понял лучше наверно поставить кнопку и на время нажатия кнопки выходы реле не меняли своего состояния?
посмотрите пожайлуста на косяки! компилирует нормально! немного переделал.
#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include "HX711.h" char auth[] = ""; char ssid[] = ""; char pass[] = ""; int myslider1 = 0; // переменная для значений регулятора int myslider2 = 0;//переменная для значений вес1 int myslider3 = 0;//переменная для значений вес2 HX711 scale(D6,D7); float calibration_factor = -10.572; // калибровка! float units; float ounces; int ves1 = D1; // светодиод сигнала достижения веса1 int ves2 = D2; // светодиод сигнала достижения веса2 int pushButton = D3;// кнопка при которой останавливается код на время нажатия int sbros = D4; //сброс веса BLYNK_WRITE(V5){calibration_factor = myslider1 = param.asInt(); Serial.print("Значение регулятора = "); Serial.println(myslider1); } BLYNK_WRITE(V6){ myslider2 = param.asInt(); Serial.print("Значение регулятора = "); Serial.println(myslider2); } BLYNK_WRITE(V7){ myslider3 = param.asInt(); Serial.print("Значение регулятора = "); Serial.println(myslider3); } void setup() { Serial.begin(9600); Blynk.begin(auth, ssid, pass); Serial.begin(9600); pinMode(ves1 , OUTPUT); pinMode(ves2 , OUTPUT); pinMode(pushButton , OUTPUT); pinMode(sbros , OUTPUT); scale.set_scale(); scale.tare(); //Сбрасываем на 0 scale.set_scale(calibration_factor); //Применяем калибровку // устанавливаем внешние параметры кнопки Blynk.setProperty(V5, "onLabel", "Регулятор"); Blynk.setProperty(V5, "color", "#FFFF00"); // устанавливаем внешние параметры кнопки Blynk.setProperty(V6, "onLabel", "Регулятор"); Blynk.setProperty(V6, "color", "#FFFF00"); Blynk.setProperty(V7, "onLabel", "Регулятор"); Blynk.setProperty(V7, "color", "#FFFF00"); } void loop() { Serial.print("Reading: "); // светодиод вес1 и вес2 не горят и кнопка не нажата набираем вес for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10; // усредняем показания считав 10 раз units / 10; // делим на 10 ounces = units * 0.035274; // переводим унции в граммы if (ounces >= myslider2) //вес задан слайдером 2 {digitalWrite(ves1,HIGH);// светодиод сигнала достижения веса1 if (ounces >= myslider3) //вес задан слайдером 3 {digitalWrite(ves2,HIGH);// светодиод сигнала достижения веса2 if(digitalRead(ves2)==HIGH&&digitalRead(pushButton)==HIGH&&digitalRead(ves1)==HIGH)//если кнопка нажата и вес1 и вес2 набран то {digitalWrite(sbros,HIGH); //сброс веса digitalWrite(ves1,HIGH); digitalWrite(ves2,HIGH); } else{digitalWrite(sbros,LOW); //закрываем сброс веса } } else{digitalWrite(ves2,LOW); //гасим светодиод 2 } } else{digitalWrite(ves1,LOW); //гасим светодиод 1 } Serial.print(ounces); // отправляем в монитор порта Serial.print(" grams"); Serial.println(); Blynk.virtualWrite(V1,ounces );// отправляем в blynk Blynk.run();}с этими строчками взвешивает нормально
Вотэтовот што?
О_О
О_О
ну, да - а, потом смайлеги с охраняемого склада пропадают. о_О
Спасибо!
Вотэтовот што?
Вам таки шо-то не понравилось?
Или у Вас есть совесть?
Сказано же "взвешивает нормально", чо придираетесь :))))
Вотэтовот што?
О_О
skm51,
Вам уже пару раз в этой теме писали, что эти строчки - бред. Почему Вы их не поправите?
Вы хоть знаете что в них делается? Или Вам написать?
я не силен в это и пытаюсь понять, что не так код был взят от сюда https://arduinoplus.ru/hx711-arduino/
#include "HX711.h" HX711 scale(A1, A0); float calibration_factor = -3.7; // калибровка! float units; float ounces; void setup() { Serial.begin(9600); scale.set_scale(); scale.tare(); //Сбрасываем на 0 scale.set_scale(calibration_factor); //Применяем калибровку } void loop() { Serial.print("Reading: "); for(int i = ;i < 10; i ++) units =+ scale.get_units(), 10; // усредняем показания считав 10 раз units / 10; // делим на 10 ounces = units * 0.035274; // переводим унции в граммы Serial.print(ounces); // отправляем в монитор порта Serial.print(" grams"); Serial.println(); }почему он не првильный?
И чо, правильно усредняет?
код был взят от сюда
Мне как-то без разницы, откуда он взят
почему он не првильный?
А кто говорит, что он неправильный? Он бредовый - это да, но "правильный" или "неправильный" это совсем другие категории. Код, если он синтасически верен, сам по себе не бывает ни правильным, ни неправильным. Всё зависит от задачи.
Вот, например, вот такой код
правильный или нет?
Очевидно, что если программист хотел, чтобы константа points была равна 123 - то, правильный, а если хотел, чтобы она была равна 321 - то, неправильный.
Понимаете?
Так и Ваш код. Он что-то делает. Так что, может быть и правильный, если именно это задумывалось. Другое дело, что тоже самое можно было написать намного короче. И уж, конечно, он ничего не осредняет, если Вы об этом.
Потому, правильный код или нет - это только Вы можете сказать. Если Вы ждёте от него, чтобы он осреднял, то неправильный, а если другого чего ... Я, кстати, спрашивал Вас в прошлом посте, нужно ли объяснить что он делает. Судя по отсутствию ответа - не нужно. Вы либо сами знаете, либо Вам неинтересно.
И чо, правильно усредняет?
Откуда ТС это знать? Он что, печать поставил, чтобы посмотреть?
Ну он же писал
с этими строчками взвешивает нормально
Так вот я и говорю. "Вроде нормально", а поставить печать и посмотреть религия не позволила (тем более когда уже тыкали носом в этот код).
этими строчками взвешивает нормально
Просто Вам повезло, что эта ересь работает :) редкий случай! Обычно все наоборот! :))
Только усреднение В этом коде не работает.
Так напишите:
for(inti = 0;i < 10; i ++) units+=scale.get_units();// усредняем показания считав 10 разunits/=10;Так напишите:
Ну, вот, блин, всегда так ... придёт поручик Ржевский и всё веселье ... :((((
Там реально, по ссылке ТС, код какие-то наркоманы писали. А он его просто тупо скопировал
какие-то наркоманы
Ну, почему сразу ... мож наши, родные, после "по 300 на рыло".
Даже Пух с перепою такого не напишет
В соответствии со стандартом языка, у операции"запятая" самый низкий приоритет. Таким образоим, поскольку написано:
а не
то 10, можно считать не написанным совсем и, поскольку оптимизатор включен, 10 будет отброшена, как не написанная.
Во-во! А потому, предлагаю оставить её, чисто из эстетических соображений! Чтобы длины строк соотносились друг с другом "по золотому сечению". Ничему ведь не мешает, зато выглядит феншуйно!
при взвешивании 1кг гири в мониторе показывал 1000гр, поэтому я и решил что он работает правильно. 2кг 3кг тоже вес совподал . а вы мне религия да религия! если так не должно быть то я поменяю на это. для этого я спрашивал вашего совета
для этого я спрашивал вашего совета
Милый друг!
Просьба совета это: "Стоит ли мне поменять прическу/жену/работу?"
А вопрос о фактах, типа: "Куда впадает Волга? Сколько будет два умножить на два? Какие синтаксис и семантика операции "запятая" в Си?" - это НЕ СОВЕТЫ!!!!
Это вопросы о фактах, которые разрешаются ни в коем случае не в дискуссиях, а в лишь в справочниках, учебниках и поисковых системах. Вакаримас ка?
при взвешивании 1кг гири в мониторе показывал 1000гр, поэтому я и решил что он работает правильно. 2кг 3кг тоже вес совподал . а вы мне религия да религия! если так не должно быть то я поменяю на это. для этого я спрашивал вашего совета
да, вот как раз религия! Вы нихрена не осредняеете, а просто берёте последнее (из 10) измерение. Вот Вам и кажется результат разумным.
А поставили бы печать каждого измерения, печать суммы и печать после деления, сразу бы увидели, что никакого осреднения и в помине нет.
Трудно поставить печать и посмотреть что происходит?
Ну, вот, блин, всегда так ... придёт поручик Ржевский и всё веселье ... :((((
Там реально, по ссылке ТС, код
Не скажите! Там ещё хлеще, чем у нашего ТС - там просто не компилируется. Например, строка 41
как-то совсем нипадеццки вштыривает.
Там реально, по ссылке ТС, код
Не скажите! Там ещё хлеще, чем у нашего ТС - там просто не компилируется. Например, строка 41
как-то совсем нипадеццки вштыривает.
Дак я про это и говорил. :)
Вообще, тексты в так-называемых "уроках от гуру" иногда бывают очень глубокомысленными. Я вот всё думал, откуда ньюбис берут суперконструкцию "retrun loop()", пока не встретил вот это.
Вообще, тексты в так-называемых "уроках от гуру" иногда бывают очень глубокомысленными. Я вот всё думал, откуда ньюбис берут суперконструкцию "retrun loop()", пока не встретил вот это.
Это штоб дитачки не заигрывались. Стек закончился - пора спать.
так не работает!
Оххх, ну, нельзя же так :(((
Что Вы делаете в строке 1? Скажите словами - что делается в этой строке. Какова её цель. Что в результате выполнения этой строки должно получиться?
units занулить бы перед циклом надо...
в результате работы кода в маниторе должен появиться вес коорый находится на весах.
Serial.print("Reading: "); // светодиод вес1 и вес2 не горят и кнопка не нажата набираем вес for(int i = 0;i < 10; i ++) units =+ scale.get_units(),10; // усредняем показания считав 10 раз units /10; // делим на 10 ounces = units * 0.035274; // переводим унции в граммы if (ounces >= myslider2) //вес задан слайдером 2 {digitalWrite(ves1,HIGH);// светодиод сигнала достижения веса1 } else{digitalWrite(ves1,LOW); //гасим светодиод 1 } if (ounces >= myslider3) //вес задан слайдером 3 {digitalWrite(ves2,HIGH);// светодиод сигнала достижения веса2 } else{digitalWrite(ves2,LOW); //гасим светодиод 2 } // if(digitalRead(ves2)==HIGH&&digitalRead(pushButton)==HIGH&&digitalRead(ves1)==HIGH)//если кнопка нажата и вес1 и вес2 набран то if(digitalRead(ves2)==HIGH&&digitalRead(ves1)==HIGH)//если кнопка нажата и вес1 и вес2 набран то {digitalWrite(sbros,HIGH);//сброс веса delay(3000); //digitalWrite(ves1,HIGH); // digitalWrite(ves2,HIGH); } else{digitalWrite(sbros,LOW); //закрываем сброс веса } Serial.print(ounces); // отправляем в монитор порта Serial.print(" grams"); Serial.println(); Blynk.virtualWrite(V1,ounces );// отправляем в blynk Blynk.run();}так работает
Так кто же спорит-то, что оно работает? Вам пытаются объяснить, что строки 03-04 ничего не усредняют, написан бред. Вы используете только 10-е измерение, для чего ещё 9 делаются - неизвестно. Если Вас это устраивает, да на здоровье!
Уважаемые, я не спорю! Если эти строчки так работают и взвешивают правильно то и фиг с ними. Меня больше тревожит вопрос с deley который останавливает все и в монитор данные приходят с задержкой.
в результате работы кода в маниторе должен появиться вес коорый находится на весах.
Я Вас спросил, что делается конкретно в этой строке. В этой строке есть вывод в монитор? Нет? Так чего Вы несёте? Что должно появиться в мониторе, если в него ничего не выводится?
Скажите толком, что делается в этой конкретной строке.
Как только Вы это поймёте, до Вас, может быть, дойдёт в чём проблема.
Почитал про for это цикл он мне не нужен, вроде я могу написать units =scale.get_units(); да?
skm51,
судя по отсутствию ответа на мой вопрос, Вы не понимаете, что делается в этом коде.
В таком случае, Вы (если не изучите язык) никогда не избавитесь от delay. Осреднение сделать гораздо проще, чем от delay избавиться, но Вам уже и так подсказывают и эдак, уже прямо говорят что сделать, но Вы не понимаетет подсказок, у Вас для этого просто нет необходимых знаний.
Писать за Вас код без delay врядли кто-то будет. Потому, выходов у Вас три:
1. начать серьёзно изучать язык, смирившись с тем, что проект затянется минимум на полгода - год;
2. заказать работу на "Ищу исполнителя", чтобы её сделал кто-то другой;
3. забить и забыть.
Выбирайте.
И, да: мы здесь все бесссовестные козлы, которым жалко три строчки новичку написать, а скорее всего даже не жалко, а сами не умеем, просто надуваем щёки и над новичком издеваемся. Эту фразу слышать доводилось не раз и спорить с нею никто не будет. Да, мы тут такие.
Если Вам нужно осреднение по 10 замерам, то - нет. Если не нужно, то можете и написать.