Датчик влажности почвы, как внедрить в скетч
- Войдите на сайт для отправки комментариев
Пнд, 24/02/2020 - 21:38
Ребят всем привет, несколько дней изучаю ардуино , с трудом понял как написать по простому меню многоуровнее, а вот как код внедрить в скетч голову сломал =) чувствую себя салагой в этом деле , если кому не сложно подскажите плиз
#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);
}
за ранее респектую друзья гении !
А сами то пробовали?
Спрашивать всегда нужно сначала у автора кода
3 дня пытался разобраться как это сделать ... куда бы мысль меня не приводила оказывался в тупике ...
показания с датчика нужно брать 1 раз в 4 часа , без delay не получается внедрить , а если использовать delay то меню виснит ... скачивал разные скетчи пытался разбирать их применять частично в этом коде но безуспешно ... методом прощупывания пока все делаю , логика во многих процессах не ясна ...
много примеров в интернете но вот пояснений детальных нет и у всех разное видение и решение...
пару книг прочитал для начинающих , в общем продолжу учиться и буду признателен за подсказки
3 дня пытался разобраться как это сделать ...
Вопрос был не сколько дней Вы пытались, а пробовали или нет. Если пробовали, выкладывайте код и задавайте по нему вопросы. Если не пробовали, так и ответьте.
Берете из второго кода (кстати код ужасно читается, сделайте куски кода функциями чтобы было проще читать):
Берете из второго кода: #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; }А вообще не рассматривали на есп8266 автополив с контролем на телефоне? Еще не закончил.Я например контролирую и влажность почвы и количество воды в емкости.
благодарю Вас ! сейчас буду разбираться с кодом ...
Jeka очень интересно про упрощение кода а так же и Ваш проект на есп8266 автополив с контролем ! ... я так понимаю вы уже на уровне ! Могу я к Вам периодически за помощью обращаться ? на постоянной основе (несколько раз в месяц) за какое то вознаграждение, чтобы здесь лишний раз людей не беспокоить , что скажите ? интересно или вы очень занятой человек ?
благодарю Вас ! сейчас буду разбираться с кодом ...
Jeka очень интересно про упрощение кода а так же и Ваш проект на есп8266 автополив с контролем ! ... я так понимаю вы уже на уровне ! Могу я к Вам периодически за помощью обращаться ? на постоянной основе (несколько раз в месяц) за какое то вознаграждение, чтобы здесь лишний раз людей не беспокоить , что скажите ? интересно или вы очень занятой человек ?
Пишите, но обещать не буду. Будет время помогу. Насчет уровня вы ошибаетесь, здесь много людей которые намного выше меня. jeka_set@mail.ru
Вернулся... вроде код дописать с Вашей помощью удалось, но вот столкнулся с одной проблемой ...
при срабатывании помпы все ок , как только помпа поработает заданное время и сразу при выключении - на дисплее разброс символов происходит ...
помогите решить задачу , думаю в цепочке компонентов что то дополнить нужно
просто с диодом все хорошо работает, сегодня добрался до помпы ... запитал через реле по простому принципу +/- и напрямую цифровой выход на плату ардуино ... чего то явно не хватает) энергия гуляет , надо слегка чем то ее перехватить чтобы на дисплее не было хаоса) помогите пожалуйста
Проблема в монтаже кашей.
Проблема в монтаже кашей.
Благодарю ! Переподключил аккуратно в линию , теперь нет этих сбоев ! Класс ! Огромное Вам спасибо !