Датчик влажности почвы, как внедрить в скетч

anaaanyev
Offline
Зарегистрирован: 20.02.2020

Ребят всем привет, несколько дней изучаю ардуино , с трудом понял как написать по простому меню многоуровнее,  а вот как  код внедрить в скетч голову сломал =) чувствую себя салагой в этом деле , если кому не сложно подскажите плиз

#include <LiquidCrystal_1602_RUS.h>
LiquidCrystal_1602_RUS lcd (2,3,4,5,6,7);

int  MainMenu = 0; // переменная для экранов меню
int  Set_1 = 0; // переменная для примера 1
int  Set_2 = 0; // переменная для примера 2

#define  Next 11 // кнопка вперед
#define  Prev 10 // кнопка назад
#define  Down 12 // кнопка вниз (-)
#define  Up 13 // кнопка вверх (+)
#define moisture_sensor A0 // аналоговый контакт датчика влажности почвы
#define moisture_sensor_power 8 // сигнальный контакт датчика влажности почвы

boolean buttonnextWasUp = true;
boolean buttonprevWasUp = true;
boolean buttonupWasUp = true;
boolean buttondownWasUp = true;

long previousMillis = 0; //счетчик прошедшего времени для AutoMainScreen
long interval = 10000; //задержка автовозврата к MainScreen 10сек

void setup()
{
  pinMode (Next,INPUT);
  pinMode(Prev,INPUT);
  pinMode(Down,INPUT);
  pinMode(Up,INPUT);

  lcd.begin(16,2);
  
  lcd.setCursor(4, 0);
  lcd.print("Hello");
  lcd.setCursor(6, 1);
  lcd.print("MrGro");
  delay(5000);

}


void loop()
{

    unsigned long currentMillis = millis();

    boolean buttonnextIsUp = digitalRead(Next);
    boolean buttonprevIsUp = digitalRead(Prev);
    boolean buttonupIsUp = digitalRead(Up);
    boolean buttondownIsUp = digitalRead(Down);

    //Обработка нажатия кнопки вперед
    if (buttonnextWasUp && !buttonnextIsUp)
    {
    delay(10);
    buttonnextIsUp = digitalRead(Next); 
    if (!buttonnextIsUp)
    {
    MainMenu++;
    previousMillis = currentMillis;
    if (MainMenu>2) 
    {
    MainMenu=0; 
    }
    delay(100);
    lcd.clear();
    }
    }
    
    //Обработка нажатия кнопки назад
    if (buttonprevWasUp && !buttonprevIsUp)
    {
    delay(10);
    buttonprevIsUp = digitalRead(Prev); 
    if (!buttonprevIsUp)
    {
    MainMenu--;
    previousMillis = currentMillis;
    if (MainMenu<0) 
    {
    MainMenu=2; 
    }
    delay(100);
    lcd.clear();
    }
    }

    // экран настроек для 1 +
    if (buttonupWasUp && buttonupIsUp)
    {
    delay(10);
    buttonupIsUp = digitalRead(Up); 
    if (buttonupIsUp && MainMenu==1)
    {
    Set_1=Set_1+5;
    previousMillis = currentMillis;
    if (Set_1>95) 
    {
    Set_1=0; 
    }
    delay (100);
    lcd.setCursor(2, 1);
    lcd.print("  ");
    }
    }

    // экран настроек для 1 -
    if (buttondownWasUp && buttondownIsUp)
    {
    delay(10);
    buttondownIsUp = digitalRead(Down); 
    if (buttondownIsUp && MainMenu==1)
    {
    Set_1=Set_1-5;
    previousMillis = currentMillis;
    if (Set_1<0)
    {
    Set_1=95;
    }
    delay (100);
    lcd.setCursor(2, 1);
    lcd.print("  ");
    }
    }

    // экран настроек для 2 +
    if (buttonupWasUp && buttonupIsUp)
    {
    delay(10);
    buttonupIsUp = digitalRead(Up); 
    if (buttonupIsUp && MainMenu==2)
    {
    Set_2=Set_2+5;
    previousMillis = currentMillis;
    if (Set_2>995) 
    {
    Set_2=0; 
    }
    delay (100);
    lcd.setCursor(2, 1);
    lcd.print("   ");
    }
    }

    // экран настроек для 2 -
    if (buttondownWasUp && buttondownIsUp)
    {
    delay(10);
    buttondownIsUp = digitalRead(Down); 
    if (buttondownIsUp && MainMenu==2)
    {
    Set_2=Set_2-5;
    previousMillis = currentMillis;
    if (Set_2<0)
    {
    Set_2=995;
    }
    delay (100);
    lcd.setCursor(2, 1);
    lcd.print("   ");
    }
    }

    

    if (MainMenu==0) 
    {
      lcd.setCursor(0, 0); lcd.print("Bлaж.пoчвы");   lcd.setCursor(11, 0); lcd.print("...");    lcd.setCursor(15, 0); lcd.print("%");
      lcd.setCursor(0, 1); lcd.print("BП < ");    lcd.setCursor(5, 1); lcd.print(Set_1);    lcd.setCursor(7, 1); lcd.print("% РП ");    lcd.setCursor(12, 1); lcd.print(Set_2);   lcd.setCursor(15, 1); lcd.print("c");   

    }
      
      else if (MainMenu==1) {
      lcd.setCursor(0, 0); lcd.print(" Пopoг ypoвня BП");
      lcd.setCursor(2, 1); lcd.print(Set_1);    lcd.setCursor(4, 1); lcd.print("%");
      }
      else if (MainMenu==2) {
        lcd.setCursor(0, 0); lcd.print(" Рaбoтa пoмпы");
        lcd.setCursor(2, 1); lcd.print(Set_2);    lcd.setCursor(6, 1); lcd.print("cek");
        }

      buttonupWasUp = buttonupIsUp;
      buttondownWasUp = buttondownIsUp;
      buttonnextWasUp = buttonnextIsUp;
      buttonprevWasUp = buttonprevIsUp;
      
    //Проверка автовозврата
  if(currentMillis - previousMillis > interval)  //Если счетчик
  {
    previousMillis = currentMillis;              //достиг интервала
    MainMenu=0;                                  //то отобразить главный экран
    }

}

вот отдельный скетч рабочий на датчик влажности почвы , как же их объединить !)

#include <LiquidCrystal_1602_RUS.h>
LiquidCrystal_1602_RUS lcd (2,3,4,5,6,7);

#define moisture_sensor A0
#define moisture_sensor_power 8

const int LED = 9;
int very_moist_value = 200;

void setup() {
  pinMode (moisture_sensor_power, OUTPUT);
  pinMode (LED, OUTPUT);
  
  Serial.begin (9600);
  lcd.begin (16,2);
  lcd.print("Bлaж почвы  .. %");
  
}

void loop() {
  digitalWrite (moisture_sensor_power, HIGH);
  delay (10);
  int moisture_value = analogRead (moisture_sensor);
  digitalWrite (moisture_sensor_power, LOW);
  int moisture_value_percent = map (moisture_value, 200, 1023, 100, 0);
  
  lcd.setCursor(12,0);
  lcd.print(moisture_value_percent);

  Serial.print (String(moisture_value) + " = ");
  Serial.println (String(moisture_value_percent) + "%");

  delay (10000);

}

за ранее респектую друзья гении !

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

А сами то пробовали?

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

Спрашивать всегда нужно сначала у автора кода

anaaanyev
Offline
Зарегистрирован: 20.02.2020

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

показания с датчика нужно брать 1 раз в 4 часа , без delay не получается внедрить , а если использовать delay то меню виснит ... скачивал разные скетчи пытался разбирать их применять частично в этом коде но безуспешно ... методом прощупывания пока все делаю , логика во многих процессах не ясна ... 

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

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

 

 

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

anaaanyev пишет:

3 дня пытался разобраться как это сделать ... 

Вопрос был не сколько дней Вы пытались, а пробовали или нет. Если пробовали, выкладывайте код и задавайте по нему вопросы. Если не пробовали, так и ответьте.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Берете из второго кода (кстати код ужасно читается, сделайте куски кода функциями чтобы было проще читать):

Берете из второго кода:

#define moisture_sensor A0
#define moisture_sensor_power 8
#define LED 9
#define moist_pause 10 // пауза в секундах между измерениями
unsigned long moist_time; // для запоминания времени
bool moist_flag = 1; // если 1 можно измерять
//const int LED = 9; // одни пины так, другие по другому объявляем)) странно. пусть будет одинаково
int very_moist_value = 200;
int moisture_value; // сделаем эти переменные глобальными
int moisture_value_percent

///это вставить в Setup
pinMode (moisture_sensor_power, OUTPUT);
pinMode (LED, OUTPUT);
moist_time = millis();

//это в loop этот кусок лучше тоже в виде функциии
if (moist_flag == 1) { // если разрешено измерение
  digitalWrite (moisture_sensor_power, HIGH);
  delay (10);
  moisture_value = analogRead (moisture_sensor);
  digitalWrite (moisture_sensor_power, LOW);
  moisture_value_percent = map (moisture_value, 200, 1023, 100, 0);

  lcd.print(moisture_value_percent); // эту строку редактируешь под свой дисплей

  Serial.print (String(moisture_value) + " = ");
  Serial.println (String(moisture_value_percent) + "%");
  moist_flag=0; // измерили, измерять пока запрещаем и запоминаем время
  moist_time = millis();
}
// если измерение запрещено и со времени последнего измерения прошло времени больше паузы измерения разрешаем снова измерение
if(moist_flag==0 && (millis()-moist_time)>moist_pause*1000){
  moist_flag=1;
}


 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

А вообще не рассматривали на есп8266 автополив с контролем на телефоне? Еще не закончил.Я например контролирую и влажность почвы и количество воды в емкости.

anaaanyev
Offline
Зарегистрирован: 20.02.2020

благодарю Вас ! сейчас буду разбираться с кодом ...

Jeka очень интересно про упрощение кода а так же и Ваш проект на есп8266 автополив с контролем ! ... я так понимаю вы уже на уровне ! Могу я к Вам периодически за помощью обращаться ? на постоянной основе (несколько раз в месяц) за какое то вознаграждение, чтобы здесь лишний раз людей не беспокоить , что скажите ? интересно или вы очень занятой человек ? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

anaaanyev пишет:

благодарю Вас ! сейчас буду разбираться с кодом ...

Jeka очень интересно про упрощение кода а так же и Ваш проект на есп8266 автополив с контролем ! ... я так понимаю вы уже на уровне ! Могу я к Вам периодически за помощью обращаться ? на постоянной основе (несколько раз в месяц) за какое то вознаграждение, чтобы здесь лишний раз людей не беспокоить , что скажите ? интересно или вы очень занятой человек ? 

Пишите, но обещать не буду. Будет время помогу. Насчет уровня вы ошибаетесь, здесь много людей которые намного выше меня. jeka_set@mail.ru

anaaanyev
Offline
Зарегистрирован: 20.02.2020

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

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

помогите решить задачу , думаю в цепочке компонентов что то дополнить нужно 

anaaanyev
Offline
Зарегистрирован: 20.02.2020

просто с диодом все хорошо работает, сегодня добрался до помпы ... запитал через реле по простому принципу +/- и напрямую цифровой выход на плату ардуино ... чего то явно не хватает) энергия гуляет , надо слегка чем то ее перехватить чтобы на дисплее не было хаоса) помогите пожалуйста 

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

Проблема в монтаже кашей.

anaaanyev
Offline
Зарегистрирован: 20.02.2020

rkit пишет:

Проблема в монтаже кашей.

Благодарю ! Переподключил аккуратно в линию , теперь нет этих сбоев ! Класс ! Огромное Вам спасибо !