как избавиться от deley?

skm51
Offline
Зарегистрирован: 23.04.2018

Привеиствую Вас, уважаемые форумчане подскажите пожайлуста как можно организовать задержку на пине "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();
}

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

А где в коде "deley"? Не нашёл. От чего избавляться-то?

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

Ворота пишет:

А где в коде "deley"? Не нашёл. От чего избавляться-то?

Похоже вот

 if (ounces >= myslider2)
  {digitalWrite(OutLed,HIGH);
      delay(1000);   // Этот deley тормозит код! надо 5сек  
     }
     else{digitalWrite(OutLed,LOW);
      }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В комментарии что-ли? Так удалить его оттуда, вот и всё избавление! :)

5N62V
Offline
Зарегистрирован: 25.02.2016

BuonanotteMasha пишет:

      delay(1000); // Этот deley тормозит код! надо 5сек  

То есть , если поставить 5сек, то тормозить не будет?

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

5N62V пишет:

То есть , если поставить 5сек, то тормозить не будет?

5.09 - что бы наверняка. О_О

skm51
Offline
Зарегистрирован: 23.04.2018

Да нужно чтобы 5сек, но не получается! Начинает тормозить блинк. В мониторе пишет нет конекта. Чем можно заменить?

5N62V
Offline
Зарегистрирован: 25.02.2016

Да у Вас в коде кроме делея еще много чего интересного.

Вот строчка 

  for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10; 

Нафига там через запятую 10?  Чего Вы хотели этим добиться? Да и само выражение units =+ scale.get_units() выглядит странно, хотя компилятор схавает.

А следующая строка

 units / 10;

Вас ни на какие размышления не наталкивает?

Я думаю, избавиться от делей Вам помогут, если Вы для начала словами распишите что должно выполняться в loop. То есть то, что Вы ожидаете от программы.

skm51
Offline
Зарегистрирован: 23.04.2018

В этом деле новичек это первый скетч. Строчку взял из образца.

	  for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10;   // усредняем показания считав 10 раз

	  units / 10;   

Если в двух словах то: При наполнении емкости заданным весом должно сработать реле и быть включеным 5сек , что бы освободилась тара. и так цикл повторяется. через Blynk я устанавливаю заданный вес myslider2.

5N62V
Offline
Зарегистрирован: 25.02.2016

Программа не оперирует ни весом, ни реле. Есть переменные и их значения.

А что должно происходить, пока реле включено?

ПС. Это не правильный образец, либо Вы были не внимательны, когда его копировали.

skm51
Offline
Зарегистрирован: 23.04.2018

я понял лучше наверно поставить кнопку и на время нажатия кнопки выходы реле не меняли своего состояния?

5N62V
Offline
Зарегистрирован: 25.02.2016

skm51 пишет:

я понял лучше наверно поставить кнопку и на время нажатия кнопки выходы реле не меняли своего состояния?

Не думаю, что лучший ответ на вопрос "как избавиться от delay()?" есть "поставить кнопку" :))

skm51
Offline
Зарегистрирован: 23.04.2018

посмотрите пожайлуста на косяки! компилирует  нормально! немного переделал.



#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();}
for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10;   // усредняем показания считав 10 раз

	 units / 10;

с этими строчками взвешивает нормально

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вотэтовот што?    

for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10;   // усредняем показания считав 10 раз

	 units / 10;

О_О

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

DetSimen пишет:

О_О

ну, да - а, потом смайлеги с охраняемого склада пропадают. о_О

skm51
Offline
Зарегистрирован: 23.04.2018

Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Вотэтовот што?   

Вам таки шо-то не понравилось?

Или у Вас есть совесть?

Сказано же "взвешивает нормально", чо придираетесь :))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Вотэтовот што?    

for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10;   // усредняем показания считав 10 раз

	 units / 10;

О_О

skm51,

Вам уже пару раз в этой теме писали, что эти строчки - бред. Почему Вы их не поправите?

Вы хоть знаете что в них делается? Или Вам написать?

skm51
Offline
Зарегистрирован: 23.04.2018

я не силен в это и пытаюсь понять, что не так код был взят от сюда 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(); 
}

почему он не првильный?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И чо, правильно усредняет?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skm51 пишет:

код был взят от сюда

Мне как-то без разницы, откуда он взят

skm51 пишет:

почему он не првильный?

А кто говорит, что он неправильный? Он бредовый - это да, но "правильный" или "неправильный" это совсем другие категории. Код, если он синтасически верен, сам по себе не бывает ни правильным, ни неправильным. Всё зависит от задачи.

Вот, например, вот такой код

const int points = 123;

правильный или нет?

Очевидно, что если программист хотел, чтобы константа points была равна 123 - то, правильный, а если хотел, чтобы она была равна 321 - то, неправильный.

Понимаете?

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

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

И чо, правильно усредняет?

Откуда ТС это знать? Он что, печать поставил, чтобы посмотреть?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну он же писал

skm51 пишет:

с этими строчками взвешивает нормально

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так вот я и говорю. "Вроде нормально",  а поставить печать и посмотреть религия не позволила (тем более когда уже тыкали носом в этот код).

5N62V
Offline
Зарегистрирован: 25.02.2016

skm51 пишет:

 этими строчками взвешивает нормально

Просто Вам повезло, что эта ересь работает :) редкий случай! Обычно все наоборот! :))

Только усреднение В этом коде не работает.

Так напишите:

 

  for(int i = 0;i < 10; i ++) units+=scale.get_units();   // усредняем показания считав 10 раз
 
  units/=10;

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

5N62V пишет:

Так напишите:

Ну, вот, блин, всегда так ... придёт поручик Ржевский и всё веселье ... :((((

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Там реально, по ссылке ТС, код какие-то наркоманы писали.  А он его просто тупо скопировал

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

какие-то наркоманы 

Ну, почему сразу ... мож наши, родные, после "по 300 на рыло".

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Даже Пух с перепою такого не напишет

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В соответствии со стандартом языка, у операции"запятая" самый низкий приоритет. Таким образоим, поскольку написано:

ФИНГЯ += ЧЕПУХА, 10;

а не

ФИНГЯ += (ЧЕПУХА,10);

то 10, можно считать не написанным совсем и, поскольку оптимизатор включен, 10 будет отброшена, как не написанная.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:
то 10, можно считать не написанным совсем и, поскольку оптимизатор включен, 10 будет отброшена, как не написанная.

Во-во! А потому, предлагаю оставить её, чисто из эстетических соображений! Чтобы длины строк соотносились друг с другом "по золотому сечению". Ничему ведь не мешает, зато выглядит феншуйно!

skm51
Offline
Зарегистрирован: 23.04.2018

при взвешивании 1кг гири в мониторе показывал 1000гр, поэтому я и решил что он работает правильно. 2кг 3кг тоже вес совподал . а вы мне религия да религия! если так не должно быть то я поменяю на это. для этого я спрашивал вашего совета

for(int i = 0;i < 10; i ++) units+=scale.get_units();   // усредняем показания считав 10 раз
 
  	units/=10;

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

skm51 пишет:

 для этого я спрашивал вашего совета

Милый друг!

Просьба совета это: "Стоит ли мне поменять прическу/жену/работу?"

А вопрос о фактах, типа: "Куда впадает Волга? Сколько будет два умножить на два? Какие синтаксис и семантика операции "запятая" в Си?" - это НЕ СОВЕТЫ!!!!

Это вопросы о фактах, которые разрешаются ни в коем случае не в дискуссиях, а в лишь в справочниках, учебниках и поисковых системах. Вакаримас ка?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skm51 пишет:

при взвешивании 1кг гири в мониторе показывал 1000гр, поэтому я и решил что он работает правильно. 2кг 3кг тоже вес совподал . а вы мне религия да религия! если так не должно быть то я поменяю на это. для этого я спрашивал вашего совета

for(int i = 0;i < 10; i ++) units+=scale.get_units();   // усредняем показания считав 10 раз
 
  	units/=10;

да, вот как раз религия! Вы нихрена не осредняеете, а просто берёте последнее (из 10) измерение. Вот Вам и кажется результат разумным.

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

Трудно поставить печать и посмотреть что происходит?

5N62V
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:

Ну, вот, блин, всегда так ... придёт поручик Ржевский и всё веселье ... :((((

Да ладно Вам , ТС адекватный вежливый чел. :))  Если ему в дальнейшем надо будет - научится .

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Там реально, по ссылке ТС, код 

Не скажите! Там ещё хлеще, чем у нашего ТС - там просто не компилируется. Например, строка 41

if (units < )

как-то совсем нипадеццки вштыривает.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Похожее изображение

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

DetSimen пишет:

Там реально, по ссылке ТС, код 

Не скажите! Там ещё хлеще, чем у нашего ТС - там просто не компилируется. Например, строка 41

if (units < )

как-то совсем нипадеццки вштыривает.

Дак я про это и говорил. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вообще, тексты в так-называемых "уроках от гуру" иногда бывают очень глубокомысленными. Я вот всё думал, откуда ньюбис берут суперконструкцию "retrun loop()", пока не встретил вот это.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

Вообще, тексты в так-называемых "уроках от гуру" иногда бывают очень глубокомысленными. Я вот всё думал, откуда ньюбис берут суперконструкцию "retrun loop()", пока не встретил вот это.

Это штоб дитачки не заигрывались.  Стек закончился - пора спать. 

skm51
Offline
Зарегистрирован: 23.04.2018

 

for(int i = 0;i < 10; i ++) units+=scale.get_units();   // усредняем показания считав 10 раз
 
  	units/=10;

так не работает!

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Оххх, ну, нельзя же так :(((

Что Вы делаете в строке 1? Скажите словами - что делается в этой строке. Какова её цель. Что в результате выполнения этой строки должно получиться?

kalapanga
Offline
Зарегистрирован: 23.10.2016

units занулить бы перед циклом надо...
 

skm51
Offline
Зарегистрирован: 23.04.2018

в результате работы кода в маниторе должен появиться вес коорый находится на весах.

 

skm51
Offline
Зарегистрирован: 23.04.2018
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();}

так работает

kalapanga
Offline
Зарегистрирован: 23.10.2016

Так кто же спорит-то, что оно работает? Вам пытаются объяснить, что строки 03-04 ничего не усредняют, написан бред. Вы используете только 10-е измерение, для чего ещё 9 делаются - неизвестно. Если Вас это устраивает, да на здоровье!

skm51
Offline
Зарегистрирован: 23.04.2018

Уважаемые, я не спорю! Если эти строчки так работают и взвешивают правильно то и фиг с ними. Меня больше тревожит вопрос с deley который останавливает все и в монитор данные приходят с задержкой.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skm51 пишет:

в результате работы кода в маниторе должен появиться вес коорый находится на весах.

Я Вас спросил, что делается конкретно в этой строке. В этой строке есть вывод в монитор? Нет? Так чего Вы несёте? Что должно появиться в мониторе, если в него ничего не выводится?

Скажите толком, что делается в этой конкретной строке.

Как только Вы это поймёте, до Вас, может быть, дойдёт в чём проблема.

skm51
Offline
Зарегистрирован: 23.04.2018

Почитал про for это цикл он мне не нужен, вроде я могу написать units =scale.get_units(); да?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skm51,

судя по отсутствию ответа на мой вопрос, Вы не понимаете, что делается в этом коде.

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

Писать за Вас код без delay врядли кто-то будет. Потому, выходов у Вас три:

1. начать серьёзно изучать язык, смирившись с тем, что проект затянется минимум на полгода - год;
2. заказать работу на "Ищу исполнителя", чтобы её сделал кто-то другой;
3. забить и забыть.

Выбирайте.

И, да: мы здесь все бесссовестные козлы, которым жалко три строчки новичку написать, а скорее всего даже не жалко, а сами не умеем, просто надуваем щёки и над новичком издеваемся. Эту фразу слышать доводилось не раз и спорить с нею никто не будет. Да, мы тут такие.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skm51 пишет:
Почитал про for это цикл он мне не нужен, вроде я могу написать units =scale.get_units(); да?

Если Вам нужно осреднение по 10 замерам, то - нет. Если не нужно, то можете и написать.