Алгоритм определения максимального значения?

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

Здравствуйте Все!

Прошу помощи! Хочу сделать реле выбора фаз на ESP8266. На 3 входа подается напряжение, нужно определить максимальное значение и включить соответствующее реле, но так-же нужно исключить одновременное включение 2-х или 3-х реле при появлении одинакового напряжения на 2-х или 3-х входах (хотя практически это не реально, но нужно предусмотреть). Пробовал разные варианты!

   

if ((LED_state[6] == 1) and ((analog_val1 > analog_val2) and (analog_val1 > analog_val3))) {digitalWrite(D5, HIGH);}
else  {digitalWrite(D5, LOW);}
if ((LED_state[6] == 1) and ((analog_val2 > analog_val3) and (analog_val2 > analog_val1))) {digitalWrite(D6, HIGH);}
else {digitalWrite(D6, LOW);}
if ((LED_state[6] == 1) and ((analog_val3 > analog_val1) and (analog_val3 > analog_val2))) {digitalWrite(D7, HIGH);}
else {digitalWrite(D7, LOW);}
//if ((LED_state[6] == 1) and (analog_val1 > max(analog_val2, analog_val3))) {digitalWrite(D5, HIGH);}
//else  {digitalWrite(D5, LOW);}
//if ((LED_state[7] == 1) and (analog_val2 > max(analog_val1, analog_val3))) {digitalWrite(D6, HIGH);}
//else  {digitalWrite(D6, LOW);}
//if ((LED_state[8] == 1) and (analog_val3 > max(analog_val2, analog_val1))) {digitalWrite(D7, HIGH);}
//else  {digitalWrite(D7, LOW);}
if ((analog_val1 == analog_val2) or (analog_val2 == analog_val3) or (analog_val1 == analog_val3)) {digitalWrite(D5, HIGH); digitalWrite(D6, LOW); digitalWrite(D7, LOW);}
     

 

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

Принято к сведению.  Как появятся вопросы, задавай, не стесняйса. 

rkit
Offline
Зарегистрирован: 23.11.2016

Centrkhosta пишет:

Хочу сделать реле выбора фаз на ESP8266.

может, не надо?

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

rkit пишет:
может, не надо?

Скорее всего да, не надо. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Зачем такое? Отсортируй по возрастанию (убыванию) и используй с самым последним "наибольшим" значением.

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

DetSimen пишет:

Принято к сведению.  Как появятся вопросы, задавай, не стесняйса. 

Это и был вопрос!

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

BOOM пишет:

Зачем такое? Отсортируй по возрастанию (убыванию) и используй с самым последним "наибольшим" значением.

И как это сделать(практически)?

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

Centrkhosta пишет:

BOOM пишет:

Зачем такое? Отсортируй по возрастанию (убыванию) и используй с самым последним "наибольшим" значением.

И как это сделать(практически)?

совсем инвалид?

простым перебором сделай

#define VAL_CNT 3
int val[VAL_CNT];
int max_value = val[0];        // для начала приравниваем МАКС первому значению массива
for (byte i =1; i<VAL_CNT; i++) {
  if (val[i] > max_value)        // если очередное значение больше МАКС
         max_value = val[i];     // присваиваем новый МАКС     
 }
 

после этого максимальное значение в переменной max_value

Если нужен еще и номер элемента - одновременно с присвоением масксимума запоминай индекс...

чего ж так тупить-то

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

Centrkhosta пишет:

DetSimen пишет:

Принято к сведению.  Как появятся вопросы, задавай, не стесняйса. 

Это и был вопрос!

ни одного знака вопроса в твоём сапщении не было, не ври

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

b707 пишет:

Centrkhosta пишет:

BOOM пишет:

Зачем такое? Отсортируй по возрастанию (убыванию) и используй с самым последним "наибольшим" значением.

И как это сделать(практически)?

совсем инвалид?

простым перебором сделай

#define VAL_CNT 3
int val[VAL_CNT];
int max_value = val[0];        // для начала приравниваем МАКС первому значению массива
for (byte i =1; i<VAL_CNT; i++) {
  if (val[i] > max_value)        // если очередное значение больше МАКС
         max_value = val[i];     // присваиваем новый МАКС     
 }
 

после этого максимальное значение в переменной max_value

Если нужен еще и номер элемента - одновременно с присвоением масксимума запоминай индекс...

чего ж так тупить-то

Прошу прощения! Видимо написал не в тот раздел! Думал, это раздел для новичков. Все равно Спасибо!

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Centrkhosta пишет:

Думал, это раздел для новичков. 

 

алгоритму поиска минимум/максимум в школах учат, а не на форумах

rkit
Offline
Зарегистрирован: 23.11.2016

Centrkhosta пишет:

Думал, это раздел для новичков.

А я думал, ты делаешь прибор, работающий с силовой сетью.

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

rkit пишет:

Centrkhosta пишет:

Думал, это раздел для новичков.

А я думал, ты делаешь прибор, работающий с силовой сетью.

Так и есть! и он работает! Думал можно немного упростить.

sadman41
Offline
Зарегистрирован: 19.10.2016

Для трёх чисел достаточно двух сравнений, нет?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

мне другое интересно, откуда у ESP8266 3 аналовых входа?

Троль детектед???

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

ua6em пишет:

мне другое интересно, откуда у ESP8266 3 аналовых входа?

Троль детектед???

А что? Разве я говорил про аналоговые входы? или вы думаете не существует цифровых датчиков напряжения?

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Centrkhosta пишет:

Здравствуйте Все!

Прошу помощи! Хочу сделать реле выбора фаз на ESP8266. На 3 входа подается напряжение, нужно определить максимальное значение и включить соответствующее реле, но так-же нужно исключить одновременное включение 2-х или 3-х реле при появлении одинакового напряжения на 2-х или 3-х входах (хотя практически это не реально, но нужно предусмотреть). Пробовал разные варианты!

   

if ((LED_state[6] == 1) and ((analog_val1 > analog_val2) and (analog_val1 > analog_val3))) {digitalWrite(D5, HIGH);}
else  {digitalWrite(D5, LOW);}
if ((LED_state[6] == 1) and ((analog_val2 > analog_val3) and (analog_val2 > analog_val1))) {digitalWrite(D6, HIGH);}
else {digitalWrite(D6, LOW);}
if ((LED_state[6] == 1) and ((analog_val3 > analog_val1) and (analog_val3 > analog_val2))) {digitalWrite(D7, HIGH);}
else {digitalWrite(D7, LOW);}
//if ((LED_state[6] == 1) and (analog_val1 > max(analog_val2, analog_val3))) {digitalWrite(D5, HIGH);}
//else  {digitalWrite(D5, LOW);}
//if ((LED_state[7] == 1) and (analog_val2 > max(analog_val1, analog_val3))) {digitalWrite(D6, HIGH);}
//else  {digitalWrite(D6, LOW);}
//if ((LED_state[8] == 1) and (analog_val3 > max(analog_val2, analog_val1))) {digitalWrite(D7, HIGH);}
//else  {digitalWrite(D7, LOW);}
if ((analog_val1 == analog_val2) or (analog_val2 == analog_val3) or (analog_val1 == analog_val3)) {digitalWrite(D5, HIGH); digitalWrite(D6, LOW); digitalWrite(D7, LOW);}
    

А нужно это делать?

Я с МК с 1990, начал изучать, познавать Си с 1987.

Купил в конце 90-ых такой https://spb.vseinstrumenti.ru/electrika-i-svet/avt-i-uz/rele/pereklyuchateli-faz/novatek-elektro/pef-301-3425601301/, работает, проблем нет, забот не знаю.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Centrkhosta пишет:

А что? Разве я говорил про аналоговые входы? или вы думаете не существует цифровых датчиков напряжения?

 

Так озвучь для форума, что за датчики такие

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

ua6em пишет:

Centrkhosta пишет:

А что? Разве я говорил про аналоговые входы? или вы думаете не существует цифровых датчиков напряжения?

 

Так озвучь для форума, что за датчики такие

ZMPT101B + CJMCU-219

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Centrkhosta пишет:

ua6em пишет:

Centrkhosta пишет:

А что? Разве я говорил про аналоговые входы? или вы думаете не существует цифровых датчиков напряжения?

 

Так озвучь для форума, что за датчики такие

ZMPT101B + CJMCU-219

понятно, тролишь, первый аналоговый второй для постоянки

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

ua6em пишет:

Centrkhosta пишет:

ua6em пишет:

Centrkhosta пишет:

А что? Разве я говорил про аналоговые входы? или вы думаете не существует цифровых датчиков напряжения?

 

Так озвучь для форума, что за датчики такие

ZMPT101B + 

понятно, тролишь, первый аналоговый второй для постоянки

Для особо умных! 

ZMPT101B + мост + делитель + CJMCU-219! +ESP8266

Помогли бы лучше с алгоритмом, и желательно без массива!

sadman41
Offline
Зарегистрирован: 19.10.2016

Результат = А. Если Б > результат, результат = Б. Если В > результат, результат = В.
Все. Две строки. При желании - одна.

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

sadman41 пишет:
Результат = А. Если Б > результат, результат = Б. Если В > результат, результат = В. Все. Две строки. При желании - одна.

Спасибо! А можно в коде?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Centrkhosta]</p> <p>[quote=sadman41 пишет:
Результат = А. Если Б > результат, результат = Б. Если В > результат, результат = В. Все. Две строки. При желании - одна.

Спасибо! А можно в коде?

 

С тебя пиво!
 

//#include <INA219.h>

volatile uint16_t u_L1, u_L2, u_L3, u_Max;
int Pin_L1 = 5;
int Pin_L2 = 6;
int Pin_L3 = 7;
int PinRele;
int PinReleON;

void read_UL (){
  // читаем в переменные u_L1, u_L2, u_L3
}

void setup() {
// инициализируем INA219
PinReleON = Pin_L1;
pinMode(Pin_L1, OUTPUT);
pinMode(Pin_L2, OUTPUT);
pinMode(Pin_L3, OUTPUT);

digitalWrite(PinReleON, HIGH);
}



void loop() {
read_UL();
u_Max = u_L1; PinRele = Pin_L1;
if(u_L2 > u_Max) { u_Max = u_L2; PinRele = Pin_L2;}
if(u_L3 > u_Max){ u_Max = u_L3; PinRele = Pin_L3;}
delay(1000);
// выключить используемое если другая фаза
if (PinReleON != PinRele) digitalWrite(PinReleON, LOW);
PinReleON = PinRele;
digitalWrite(PinReleON, HIGH);
}

 

SLKH
Offline
Зарегистрирован: 17.08.2015

Centrkhosta пишет:

sadman41 пишет:
Результат = А. Если Б > результат, результат = Б. Если В > результат, результат = В. Все. Две строки. При желании - одна.

Спасибо! А можно в коде?

можно.

unsigned int rezultat, a, b, v;

rezultat = a; if (b > rezultat) rezultat = b; if (v > rezultat) rezultat = v;

 

rkit
Offline
Зарегистрирован: 23.11.2016

Centrkhosta пишет:

ZMPT101B + мост + делитель + CJMCU-219! +ESP8266

Так это не напряжение, это иглы в сети.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rkit пишет:

Centrkhosta пишет:

ZMPT101B + мост + делитель + CJMCU-219! +ESP8266

Так это не напряжение, это иглы в сети.

только ли, а если реле прикипело?

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

ua6em]</p> <p>[quote=Centrkhosta пишет:

sadman41 пишет:
Результат = А. Если Б > результат, результат = Б. Если В > результат, результат = В. Все. Две строки. При желании - одна.

Спасибо! А можно в коде?

 

С тебя пиво!
 

//#include <INA219.h>

volatile uint16_t u_L1, u_L2, u_L3, u_Max;
int Pin_L1 = 5;
int Pin_L2 = 6;
int Pin_L3 = 7;
int PinRele;
int PinReleON;

void read_UL (){
  // читаем в переменные u_L1, u_L2, u_L3
}

void setup() {
// инициализируем INA219
PinReleON = Pin_L1;
pinMode(Pin_L1, OUTPUT);
pinMode(Pin_L2, OUTPUT);
pinMode(Pin_L3, OUTPUT);

digitalWrite(PinReleON, HIGH);
}



void loop() {
read_UL();
u_Max = u_L1; PinRele = Pin_L1;
if(u_L2 > u_Max) { u_Max = u_L2; PinRele = Pin_L2;}
if(u_L3 > u_Max){ u_Max = u_L3; PinRele = Pin_L3;}
delay(1000);
// выключить используемое если другая фаза
if (PinReleON != PinRele) digitalWrite(PinReleON, LOW);
PinReleON = PinRele;
digitalWrite(PinReleON, HIGH);
}

 

Огромное спасибо! Но не пойму как это использовать в моем случае!

Скорее всего я не правильно задал вопрос! давайте спрошу по-другому: 

float analog_val1, analog_val2, analog_val3; - переменная

analog_val1 = ds1.getTempC();
analog_val2 = ds1.getTempC();
analog_val3 = ds1.getTempC(); - читаем показания с 3-х термодатчиков!
 
void loop() - обработка
{
   server.handleClient(); 
   delay(50);
        
   if (analog_val1 >= max(analog_val2, analog_val3) or (analog_val2 == analog_val3)) {digitalWrite(D5, HIGH);}
   else  {digitalWrite(D5, LOW);}
   if (and (analog_val2 >= max(analog_val3, analog_val1) or (analog_val3 == analog_val1)) {digitalWrite(D6, HIGH);}
   else  {digitalWrite(D6, LOW);}
   if (and (analog_val3 >= max(analog_val1, analog_val2) or (analog_val2 == analog_val1)) {digitalWrite(D7, HIGH);}
   else  {digitalWrite(D7, LOW);}
  
 }
 
Вопрос? Что добавить в обработку, что-бы при любых значениях переменных (analog_val1, analog_val12, analog_val3) вычислялось максимальное значение и включался соответствующий выход (D5, D6, D7), но при одинаковых значениях (analog_val1 == analog_val2 или analog_val2 == analog_val3 или analog_val1 == analog_val3 или analog_val1 == analog_val2 == analog_val3) выход (D5, D6, D7) включался только один, который ближе к максимальному?
 
Возможно, я не знаю как правильно спросить или сформулировать, но в начале июня я только слышал про ARDUINO и C++!!!
 
Могу выложить весь скетч, если это поможет!
 
Спасибо!

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Блин, еще в сообщении 7 был дан пример кода. Но то ж читать нужно )))))

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

v258 пишет:

Блин, еще в сообщении 7 был дан пример кода. Но то ж читать нужно )))))

Просто я до массива еще не дошел, и не знаю как применить в своем случае данный код!

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Centrkhosta пишет:

v258 пишет:

Блин, еще в сообщении 7 был дан пример кода. Но то ж читать нужно )))))

Просто я до массива еще не дошел, и не знаю как применить в своем случае данный код!

Думаю, платный раздел решил бы все ваши проблемы

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
analog_val1 = ds1.getTempC();
analog_val2 = ds1.getTempC();
analog_val3 = ds1.getTempC(); - читаем показания с 3-х термодатчиков!
В процедуре чтения будет для моего кода

void read_UL (){
  // читаем в переменные u_L1, u_L2, u_L3
u_L1 = ds1.getTempC();
u_L2 = ds1.getTempC();
u_L3 = ds1.getTempC();  //- читаем показания с 3-х термодатчиков!

}

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

При чём тут температура, если определяешь напряжение?

sadman41
Offline
Зарегистрирован: 19.10.2016

Потому что нужно измерить расстояние, что тут неясно?

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

парни, нафига вы ему помогаете? - видно же что это не новичок, а халявщик

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

Green
Offline
Зарегистрирован: 01.10.2015

"Я не холявщик - я партнёр." Вспомнилось.)

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

Да, уж.

Centrkhosta пишет:
Думал, это раздел для новичков.

Правильно думал.

Только не учёл, что "новичок" != "альтернативно одарённый халявщик"

Centrkhosta пишет:
Видимо написал не в тот раздел!

Судя по реплике

Centrkhosta пишет:

А можно в коде?

действительно, написал не в тот раздел. Нужно было вот в этот.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

действительно, написал не в тот раздел. Нужно было вот в этот.

вы думаете там найдётся, кто может измерять напряжение через температуру?
Ток другое дело

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

b707 пишет:

парни, нафига вы ему помогаете? - видно же что это не новичок, а халявщик

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

Да успокойтесь уже!

Все придумал, и работает как надо!

   if ((LED_state[6] == 1) and (analog_val1 > analog_val2) and (analog_val1 >= analog_val3)) {digitalWrite(D5, HIGH), digitalWrite(D6, LOW), digitalWrite(D7, LOW);}
   else  {digitalWrite(D5, LOW);}
   if ((LED_state[7] == 1) and (analog_val2 > analog_val3) and (analog_val2 >= analog_val1)) {digitalWrite(D6, HIGH), digitalWrite(D5, LOW), digitalWrite(D7, LOW);}
   else  {digitalWrite(D6, LOW);}
   if ((LED_state[8] == 1) and (analog_val3 > analog_val1) and (analog_val3 >= analog_val2)) {digitalWrite(D7, HIGH), digitalWrite(D6, LOW), digitalWrite(D5, LOW);}
   else  {digitalWrite(D7, LOW);}

Может и Ваши варианты хороши!

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

вы думаете там найдётся, кто может измерять напряжение через температуру?
Ток другое дело

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

ua6em пишет:

вы думаете там найдётся, кто может измерять напряжение через температуру?
Ток другое дело

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

так это жеж классика

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Centrkhosta пишет:

Да успокойтесь уже!

Все придумал, и работает как надо!

   if ((LED_state[6] == 1) and (analog_val1 > analog_val2) and (analog_val1 >= analog_val3)) {digitalWrite(D5, HIGH), digitalWrite(D6, LOW), digitalWrite(D7, LOW);}
   else  {digitalWrite(D5, LOW);}
   if ((LED_state[7] == 1) and (analog_val2 > analog_val3) and (analog_val2 >= analog_val1)) {digitalWrite(D6, HIGH), digitalWrite(D5, LOW), digitalWrite(D7, LOW);}
   else  {digitalWrite(D6, LOW);}
   if ((LED_state[8] == 1) and (analog_val3 > analog_val1) and (analog_val3 >= analog_val2)) {digitalWrite(D7, HIGH), digitalWrite(D6, LOW), digitalWrite(D5, LOW);}
   else  {digitalWrite(D7, LOW);}

ЭТОГО НЕ МОЖЕТ БЫТЬ ПОТОМУ ЧТО НЕ МОЖЕТ БЫТЬ НИКОГДА !!!
PS вижу здесь феерверк ;-)))

Centrkhosta
Offline
Зарегистрирован: 25.07.2022

ua6em пишет:

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

действительно, написал не в тот раздел. Нужно было вот в этот.

вы думаете там найдётся, кто может измерять напряжение через температуру?
Ток другое дело

Никто не собирался измерять напряжение через температуру!

На экране 4 разных модуля на esp8266, все в разных местах, которые выполняют разные функции, работают через webserver 

сначала загружается левый термостат и подгружает остальные через iframe!

может где-то и "феерверк", но работает как надо!

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

Centrkhosta пишет:

Все придумал, и работает как надо!

   if ((LED_state[6] == 1) and (analog_val1 > analog_val2) and (analog_val1 >= analog_val3)) {digitalWrite(D5, HIGH), digitalWrite(D6, LOW), digitalWrite(D7, LOW);}
   else  {digitalWrite(D5, LOW);}
   if ((LED_state[7] == 1) and (analog_val2 > analog_val3) and (analog_val2 >= analog_val1)) {digitalWrite(D6, HIGH), digitalWrite(D5, LOW), digitalWrite(D7, LOW);}
   else  {digitalWrite(D6, LOW);}
   if ((LED_state[8] == 1) and (analog_val3 > analog_val1) and (analog_val3 >= analog_val2)) {digitalWrite(D7, HIGH), digitalWrite(D6, LOW), digitalWrite(D5, LOW);}
   else  {digitalWrite(D7, LOW);}

Может и Ваши варианты хороши!

 

вот жеж пень.... так и не понял ни черта.

Дорогой, нахрена ты тогда спрашивал, если так и не использовал ни один ответ и все равно сделал через свой мега-кривой код?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

вот жеж пень.... так и не понял ни черта.

Дорогой, нахрена ты тогда спрашивал, если так и не использовал ни один ответ и все равно сделал через свой мега-кривой код?

ждём первого переключения ;-)))

ЗЫ был у меня в учениках на практике КИПовец, он все измерительные приборы манометрами называл )))

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

ua6em пишет:

вы думаете там найдётся, кто может измерять напряжение через температуру?

Какие у Вас основания сомневаться в Бармалее?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

Какие у Вас основания сомневаться в Бармалее?


ТС жеж упёртый ))) колется но продолжает есть кактус...
PS давненько не встречал такого апломба, так что Бармалею не одолеть

kakaxi
Offline
Зарегистрирован: 20.07.2021

Можно ли сравнить функции?