Сравнение значений

Visible
Offline
Зарегистрирован: 09.05.2021

Добрый день!

Пишу (тестирую) свою первую программу, но работает как то все странно, не могу понять причины. В теле if, задержка 3500 мс, но перед включением, хотя работает наоборот, если условие соблюдается. Может еще как то не очень все правильно написано, код работает но очень странно. LOW и HIGH должны быть наоборот. Но работает именно так:

/*macro definition of sensor*/
#define SENSOR A1//the YELLOW pin of the Sensor is connected with A0 of Arduino/Catduino
  
void setup()
{  
    Serial.begin(9600);
    pinMode(A2, OUTPUT);   
    digitalWrite(A2, HIGH); 
    pinMode(A3, OUTPUT);    
    digitalWrite(A3, HIGH); 
    pinMode(A4, OUTPUT);
    pinMode(A5, OUTPUT); 
    digitalWrite(A5, HIGH); 
}
void loop()
{

  int raw = analogRead(SENSOR);
  float voltage = (float) (raw * 5.0)/1024;     // voltage at the pin of the Arduino
  float voltage1 = voltage * 12 / 4.995;     // voltage at the pin of the Arduino
  Serial.println("Pressure is");
  float pressure_kPa = (voltage1);          // voltage to pressure
  Serial.print(pressure_kPa);
  Serial.println(" kPa");

  if (voltage1 < 1.22)
  {
    Serial.println(" da");
    digitalWrite(A4, LOW);
    delay(3500);
    digitalWrite(A4, HIGH);
  }
  else
  {
     Serial.println(" net");
     digitalWrite(A4, HIGH);
  }
 delay(10500);
}
nik182
Offline
Зарегистрирован: 04.05.2015

Да уж. Очень сумбурно объяснил. Изначально А4 LOW. Потом становиться HIGH и если else то больше никогда LOW не будет. Так задумывалось?

Гриша
Offline
Зарегистрирован: 27.04.2014

Visible пишет:

 В теле if, задержка 3500 мс, но перед включением...

кого?! чего!? и куда!?

раз 10 перечитал и ничего не понял... если перед включением МК, то нужно включать второй МК, который будет запускать первый через 3,5 сек. А чтобы на выключенном МК было нужное состояние перед включением, нужно использовать резисторы (и не только)... нужна схема, а то ничего не понятно... ну или поток сознания превратите в ТЗ - может и вопрос тогда разрешится, когда поймете чего хотите. 

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

негоже float срвнивать

nik182
Offline
Зарегистрирован: 04.05.2015

ua6em пишет:

негоже float срвнивать


Почему? Это если == то могут быть варианты, а <> работает без проблем.

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

Visible пишет:
В теле if, задержка 3500 мс, но перед включением, хотя работает наоборот, если условие соблюдается.

А теперь тоже самое, но так, чтобы кто-то ещё, кроме Вас, мог понять. Советую разбить на 3 пункта

1. что хотелось сделать
2. как оно работает сейчас
3. Чем (2) отличается от (1)

Тогда есть шанс, что Вам помогут.

Visible
Offline
Зарегистрирован: 09.05.2021

nik182 пишет:
Да уж. Очень сумбурно объяснил. Изначально А4 LOW. Потом становиться HIGH и если else то больше никогда LOW не будет. Так задумывалось?

Прошу прощения за невнятность объяснения. Что задумывал и что подключено:

На ноге А1 - напряжение снимаемое с датчика давления. Хотел написать: при падении давления до менее 1.22, подавалось напряжение на ногу А4. Напряжение сохраняется 3500 мс, далее выключается. и цикл повторяется. 1. Замер напряжения;

2. Расчет по формуле

3. Если менее 1,22 то подаем напряжение на ногу А4 3500 мс времени.

4. выключаем напряжение на ногу А4

5. переход к пункту 1.

Неясность в том что сначала в коде идет LOW а потом HIGH, но должно быть вроде наоборот, HIGH подаем а LOW отключаем. Думаю где то причина есть, и в дальнейшем неясности с подключением lcd монитора. Но чтобы продолжить осознание lcd хочется закрыть пробелы в этом коде. Спасибо.

Visible
Offline
Зарегистрирован: 09.05.2021

Гриша пишет:

Visible пишет:

 В теле if, задержка 3500 мс, но перед включением...

кого?! чего!? и куда!?

раз 10 перечитал и ничего не понял... если перед включением МК, то нужно включать второй МК, который будет запускать первый через 3,5 сек. А чтобы на выключенном МК было нужное состояние перед включением, нужно использовать резисторы (и не только)... нужна схема, а то ничего не понятно... ну или поток сознания превратите в ТЗ - может и вопрос тогда разрешится, когда поймете чего хотите. 

пока я второй МК не подключал к первому. Но в планах на некоторое будущее есть такие желания попробовать. В настоящий момент у меня все по скромному.

Visible
Offline
Зарегистрирован: 09.05.2021

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

Visible пишет:
В теле if, задержка 3500 мс, но перед включением, хотя работает наоборот, если условие соблюдается.

А теперь тоже самое, но так, чтобы кто-то ещё, кроме Вас, мог понять. Советую разбить на 3 пункта

1. что хотелось сделать
2. как оно работает сейчас
3. Чем (2) отличается от (1)

Тогда есть шанс, что Вам помогут.

1. Хочется включать ногу А4 (подать напряжение) при расчетном значении <1.22.

2. Работает не ясно как. Код работает, но я не понимаю почему именно так. По документации HIGH подача напряжения. Работает если идет сначала LOW а потом HIGH. Время подачи напряжения 3500 мс.

3. Если сделать сначала HIGH а потом LOW, Подача напряжения будет 10500 мс. (в конце кода строчка). 

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

nik182
Offline
Зарегистрирован: 04.05.2015

У Вас в сетап не определено значение ноги А4. По умолчанию после сброса значение ноги LOW. В строке 28 опять LOW через 3.5 сек HIGH через 10.5 сек опять LOW. Это то что напрограммировано.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

29 и 31 поменять местами, а else .33-37... можно вообще наверное убрать.

Visible
Offline
Зарегистрирован: 09.05.2021

Fenicksnet пишет:

29 и 31 поменять местами, а else .33-37... можно вообще наверное убрать.

Пробовал. Питание будет 10500 сек, в конце кода пауза. По ней срабатывает, но это неправильно

Visible
Offline
Зарегистрирован: 09.05.2021

nik182 пишет:
У Вас в сетап не определено значение ноги А4. По умолчанию после сброса значение ноги LOW. В строке 28 опять LOW через 3.5 сек HIGH через 10.5 сек опять LOW. Это то что напрограммировано.

Пробовал в сетап 

digitalWrite(A4, LOW);

не помогло.

Еще заметил странность, если при очередном loop кода будет постоянно соблюдаться условие, питание так и без перебоев и пауз будет подаваться на ногу А4. Хотя должна быть какая то пауза, пробовал delay в начале кода, все без изменений. Питание подается без перебоев.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Visible пишет:

Fenicksnet пишет:

29 и 31 поменять местами, а else .33-37... можно вообще наверное убрать.

Пробовал. Питание будет 10500 сек, в конце кода пауза. По ней срабатывает, но это неправильно

да не может быть.

 .............
 Serial.println(" kPa");
  if (voltage1 < 1.22)  {
    Serial.println(" da");
    digitalWrite(A4, HIGH);
    delay(3500);
    digitalWrite(A4, LOW);
  }
  delay(10500);
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Скорее всего дело в том , что выводы управляют модулями реле.
А там бывают три исполнения:
1. Включение высоким уровнем
2. Включение низким уровнем
3. Можно выбрать уровень включения

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Kakmyc пишет:
Скорее всего дело в том , что выводы управляют модулями реле. А там бывают три исполнения: 1. Включение высоким уровнем 2. Включение низким уровнем 3. Можно выбрать уровень включения

но об этом история умалчивает.


  if (voltage1 < 1.22)  {
    Serial.println(" da");
    digitalWrite(A4, HIGH);
    delay(200);
    digitalWrite(A4, LOW);
    delay(3300);
    Serial.println(" net");
    digitalWrite(A4, HIGH);
    delay(200);
    digitalWrite(A4, LOW);
  }
  delay(10500);
}