Не могу запустить реле

slonik47
Offline
Зарегистрирован: 04.07.2022

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

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

Вставь код по правилам форума.

Модераторы - в песочницу это "чудо".

slonik47
Offline
Зарегистрирован: 04.07.2022

А чего умничать то сразу? сложно ссылку на правила оформления написать? 

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

А сложно сначала в раздел Песочница зайти, очень не терпится написать чего-то?

slonik47
Offline
Зарегистрирован: 04.07.2022

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

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

Для нетерпячих поясняю. На любом форуме, так или иначе связанном с программированием, есть железное правило: "программный код в сообщениях вставляется с использованием тега [CODE]". Кроме того на любом техническом форуме для новичков есть строгие рекомендации ознакомиться и использовать правила оформления постов. Игнорирование этих правил рассматривается как неуважение к сообществу. 

Ну и чего ты ждешь здесь, проявляя неуважение, да еще и огрызаясь? Вероятность получения помощи у тебя уже упала к плинтусу. Будешь продолжать? ;)

slonik47
Offline
Зарегистрирован: 04.07.2022
[code]
// подключение библиотек для работы с OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Выводы, подключенные к датчику
#define RELAY_1_PIN 12 // подключаем реле клапана электромагнитного
#define sensorPower 7
#define sensorPin A0
#define OLED_RESET 7

int analogValue = A0; // добавлено 29.06

Adafruit_SSD1306 display(OLED_RESET); // создаём объект "дисплей"

void setup() 
{
  pinMode(sensorPower, OUTPUT);
  
  // назначаем 12 пин в режиме выхода
  pinMode(RELAY_1_PIN, OUTPUT);
  
  // Изначально оставляем датчику выключенным
  digitalWrite(sensorPower, LOW);
  digitalWrite(RELAY_1_PIN, LOW);

  Serial.begin(9600);
  // работа датчика выше
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // инициализация дисплея по интерфейсу I2C, адрес 0x3C
  
   
  
  
}

void loop() 
{

analogValue = analogRead(A0); // добавлено 29.06

  
  // получить показание из функции ниже и напечатать его
  Serial.print("sensorPin: "); //("Analog output: ");
  Serial.println(readSensor());
  Serial.print("RELAY_1_PIN: ");
  Serial.println(readSensor());
  delay(1000);
  
  display.clearDisplay(); // очистка дисплея
  display.setTextSize(1); // установка размера шрифта
  display.setTextColor(WHITE); // установка цвета текста
  display.setCursor(0, 0); // установка курсора в позицию X = 0; Y = 0
  display.print ("A0 H: "); // записываем в буфер показания датчика- строка названия
  display.println(analogValue); // добавлено 29.06
  display.println(readSensor()); //выводит значение датчика
  display.display(); // и её выводим на экран
  
  delay(1000);


 // if (sensorPin > 1200) digitalWrite(RELAY_1_PIN, HIGH); 1 вариант
 // if (sensorPin < 3500) digitalWrite(RELAY_1_PIN, LOW);1 вариант
 
 
 }

// Данная функция возвращает аналоговый результат измерений датчика влажности почвы
int readSensor() 
{
  digitalWrite(sensorPower, HIGH);  // Включить датчик
  delay(10);                        // Дать время питанию установиться
  int val = analogRead(sensorPin);  // Прочитать аналоговое значение от датчика
  digitalWrite(sensorPower, LOW);   // Выключить датчик
  return val;                       // Вернуть аналоговое значение влажности

static uint32_t tmr;
 if (millis() - tmr >= 1000) {
  tmr = millis();
  if (analogValue < 3000.0) digitalWrite(RELAY_1_PIN, HIGH); 
  else digitalWrite(RELAY_1_PIN, LOW);

   delay(1000);
   
 
}

}
[/code]

 

slonik47
Offline
Зарегистрирован: 04.07.2022

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

 

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

Ничего сложного, первый пост первой темы в разделе Песочница

Подумай, при каких условиях сработает код от строки 75 и ниже? Кажется, именно там у тебя управляется реле?

slonik47
Offline
Зарегистрирован: 04.07.2022

Да во втором варианте туда перенёс, Вы имеете в иду, что датчик включается периодически ст 67-73,  а включение реле идёт постоянно и он попадает в промежутки 0 значения датчика? Или именно после 75 строчки проблема? Просто для меня логика его нынешней работы совсем не понятна. Оно не соответствует ни каким значениям влажности

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

Оператор return прерывает выполнение функции, т.е.  все, что ниже него НЕ  выполняется ни при каких условиях

И еще - реле у тебя управляется по значению analogValue, которое считывается при каждом проходе loop() - строка 39, когда датчик не включен. Т.е. разберись со своими переменными, глядишь, и логика появится

И опять же еще - в таком режиме включать/выключать датчик бессмысленно, он в любом случае будет практически всегда включен.

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

analogValue = analogRead(A0); // добавлено 29.06

.

.

if (analogValue < 3000.0)

почитай, какие значения отдает analogRead()

slonik47
Offline
Зарегистрирован: 04.07.2022

analogRead - целочисленные значения от 0 до 1024 соответственно, но у меня на экране (com порте) 3950 максимум показывает. Что для меня тоже загадка. или что то неправильно с выводом значений?

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

Значит, у тебя не Ардуина, а WAVGAT

slonik47
Offline
Зарегистрирован: 04.07.2022

Да, правильно Wavgat

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

slonik47 пишет:

analogRead - целочисленные значения от 0 до 1024 соответственно, но у меня на экране (com порте) 3950 максимум показывает. Что для меня тоже загадка. или что то неправильно с выводом значений?

Плата хоть какая? А то может и нет загадки-то? Ну да, Дед первый угадал.

slonik47
Offline
Зарегистрирован: 04.07.2022

 WAVGAT Uno- R3

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

slonik47 пишет:

 WAVGAT Uno- R3

Это означает, что analogRead() выдает значения 0-4095. И в Arduini IDE нужно выбирать соответствующую плату. Остальная логика работы от этого не зависит

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

Надо бы код причесать. Во-первых, там есть совсем мёртвые куски (ниже 75 строки). Во-вторых, надо бы определиться, как работаем с датчиком - уж либо "прямо так" (как в строке 39), либо с какими-то манипуляциями с его питанием (функция readSensor()). А то сейчас оба способа одновременно задействованы. Если функция выключает датчик, то строка 39 мало что измерить сможет.

Короче, всё лишнее повыкидывать...

slonik47
Offline
Зарегистрирован: 04.07.2022

Приблизительно понял, что много разных функций было, убрал лишнее вроде заработало, но почему на оборот не понятно? (реле при включение подключено разомкнуто) пришлось знак на включение с меньше на больше поменять



[code]
// подключение библиотек для работы с OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Выводы, подключенные к датчику
#define RELAY_1_PIN 12 // подключаем реле клапана электромагнитного
#define sensorPower 7
#define sensorPin A0
#define OLED_RESET 7

int analogValue = A0; // добавлено 29.06

Adafruit_SSD1306 display(OLED_RESET); // создаём объект "дисплей"

void setup() 
{
  pinMode(sensorPower, OUTPUT);
  
  // назначаем 12 пин в режиме выхода
  pinMode(RELAY_1_PIN, OUTPUT);
  
  // Изначально оставляем датчику выключенным
  digitalWrite(sensorPower, LOW);
  digitalWrite(RELAY_1_PIN, LOW);

  Serial.begin(9600);
  // работа датчика выше
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // инициализация дисплея по интерфейсу I2C, адрес 0x3C
       
}

void loop() 
{

   //analogValue = analogRead(A0); // добавлено 29.06, 04.07.22 исключил для проверки
   // if (sensorPin > 1200) digitalWrite(RELAY_1_PIN, HIGH); 1 вариант
     // if (sensorPin < 3500) digitalWrite(RELAY_1_PIN, LOW);1 вариант
 
// Данная функция возвращает аналоговый результат измерений датчика влажности почвы
//int readSensor() //отключил 04.07.22

  digitalWrite(sensorPower, HIGH);  // Включить датчик
  delay(10);                        // Дать время питанию установиться
  int val = analogRead(sensorPin);  // Прочитать аналоговое значение от датчика выключил 04.07.22
 
static uint32_t tmr;
 if (millis() - tmr >= 1000) {
  tmr = millis();
  if (val > 3000.0) digitalWrite(RELAY_1_PIN, HIGH); // Условие включения
  else digitalWrite(RELAY_1_PIN, LOW); // если условие включения не выполнено то выключение

     delay(2000); // ожидаем 2 секунды до проверки значений
}

// получить показание из функции ниже и напечатать его
  Serial.print("val: "); //("Analog output: ");
  //Serial.println(readSensor());
  Serial.print("RELAY_1_PIN: ");
 // Serial.println(readSensor());
  delay(1000);
  
  display.clearDisplay(); // очистка дисплея
  display.setTextSize(1); // установка размера шрифта
  display.setTextColor(WHITE); // установка цвета текста
  display.setCursor(0, 0); // установка курсора в позицию X = 0; Y = 0
  display.print ("A0 H: "); // записываем в буфер показания датчика- строка названия
  display.println(val); // добавлено 29.06
  //display.println(readSensor()); //выводит значение датчика
  display.display(); // и её выводим на экран

digitalWrite(sensorPower, LOW);   // Выключить датчик

  delay(600); // ожидаем 60 секунд до перезапуска цикла (временно уменьшего для отладки)
  
  //return val;                       // Вернуть аналоговое значение влажности

}

[/code]

 

 И в com порт почему то ругался пришлось всё обрубить

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

slonik47 пишет:

Приблизительно понял, что много разных функций было, убрал лишнее вроде заработало, но почему на оборот не понятно? (реле при включение подключено разомкнуто) пришлось знак на включение с меньше на больше поменять

А HIGH на LOW поменять не проще было?

  if (val < 3000.0) digitalWrite(RELAY_1_PIN, LOW); // Условие включения
  else digitalWrite(RELAY_1_PIN,HIGH ); // если условие включения не выполнено то выключение

 

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

Мошт, у тебя реле нулём включается?

slonik47
Offline
Зарегистрирован: 04.07.2022

Разве оно не должно тогда на выключенном замкнуто быть? про это мы говорим? нормально замкнутый контакт при подаче питания разъединяется. Когда включается на реле индикатор загорается 

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

Китайские релейные модули по типу управления бывают двух типов - одни управляются высоким уровнем (реле включается, если подать на входной пин HIGH), другие управляются низким уровнем (реле включается, если подать на входной пин LOW). Зависит это исключительно от того, какой транзистор китайцы в этот модуль воткнули

slonik47
Offline
Зарегистрирован: 04.07.2022

Я ошибочно считал что low это ноль... Тогда наверное правильнее было бы заменить это на включить - выключить напряжение? или такого варианта вообще нет?

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

LOW - низкий уровень, 0 вольт, HIGH - высокий уровень, равен напряжению питания, для ардуино обычно 5 вольт. Правильнее некуда