Применение millis для нескольких процессов

Posol88
Offline
Зарегистрирован: 14.11.2019

добрый день . 

Машина опять меня победила... 

вот кусок кода:

#include <Servo.h>
#include <iarduino_RTC.h>
iarduino_RTC Time (RTC_DS1302, A0, A2, A1); //назначение пинов обмена данными RST, CLK, DAT
Servo servo;                          //имя сервопривода
int pos = 0;                          //переменная хранящая угол поворота сервопривода
unsigned long newCycle,TimeWait,r,TimeWork,TimsWorker =7850;    //1)переменная хранящая время прошедшее с момента нажатия кнопки. 2)переменная хранящаявремя с момента последнего вывода текущего значения времени с RTC модуля в серийный порт. 3)переменная хранящая время включения сервопривода
const char LED = A3;                  //номер пина светодиода(стадия разработки)
boolean control,qr,QR=true;                   //переменная меняющая значение в момент включения и выключения сервопривода 1:(служит для ограничения срабатывания по времени с RTC до одного раза за секунду)2:не смог сформулировать.
byte c = 0;                           //переменная хранящая количество раз нажатия кнопки
int I,i,W=1;                            //1:переменная меняющая свое значение в момент нажатия кнопки(защита от дребезга)2:переменная хранящая статус положения сервопривода(защита от дребезга)
void setup() {
  delay(300);                          //время на подумать
  Time.begin();                        //инициализация работы часов
  servo.attach(A4);                    //назначение пина управления сервоприводом
  Serial.begin(9600);                  //инициализация порта
  //Time.settime(35,41,16,18,02,2020,2);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
  pinMode(LED, OUTPUT);                //назначение пина светодиода выходом (индикация работы)
  r = millis();
  pinMode(7, INPUT_PULLUP);
  pinMode(A5, INPUT_PULLUP);
  newCycle = 0;
}
void loop() {
  control=!digitalRead(7);
  if(I==1&&control==HIGH){
    TimsWorker-=1000;
    I=0;
    Serial.println(TimsWorker);
    if(TimsWorker<1000){
      TimsWorker=7850;
      digitalWrite (LED,HIGH);
      newCycle=millis(); 
      
    } 
  }
  if(millis()-newCycle>=1000){
  digitalWrite(LED,LOW);
  newCycle = 0;
  Serial.println("в новом проблема");
 }
 if(control==LOW){
  I=1;
  delay(20);
 }

не могу понять - почему оператор if из 36й строки срабатывает в каждом цикле... подскажите пожалуйста

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

Из за 38 строчки, видимо.

Posol88
Offline
Зарегистрирован: 14.11.2019

DetSimen пишет:

Из за 38 строчки, видимо.

не, там же наоборот переменной присваивается значение нуля после чего оно меняется только в 32й строчке в новом цикле и то только если условие оператора из 29ой позволит да и тот выполняется только после нажатия кнопки...а когда newCycle меньше 1000 оператор из 36й не должен же выполнять тело...

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

Posol88 пишет:

DetSimen пишет:

Из за 38 строчки, видимо.

не, там же наоборот переменной присваивается значение нуля после чего оно меняется только в 32й строчке в новом цикле и то только если условие оператора из 29ой позволит да и тот выполняется только после нажатия кнопки...а когда newCycle меньше 1000 оператор из 36й не должен же выполнять тело...

Кто то просто настолько далёк от программирования, что за полгода так и не разобрался с millis()

У тебя там должно быть:
NewCycle=millis();
А не
NewCycle=0;

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

Когда Вы научитесь Serial для дебага использовать?
millis = 500, newCycle = 0, millis - newCycle = ?
millis = 1000, newCycle = 0, millis - newCycle = ?
millis = 1001, newCycle = 0, millis - newCycle = ?
millis = 1002, newCycle = 0, millis - newCycle = ?
...
millis = 9000, newCycle = 0, millis - newCycle = ?

Posol88
Offline
Зарегистрирован: 14.11.2019

Kakmyc пишет:
Posol88 пишет:

DetSimen пишет:

Из за 38 строчки, видимо.

не, там же наоборот переменной присваивается значение нуля после чего оно меняется только в 32й строчке в новом цикле и то только если условие оператора из 29ой позволит да и тот выполняется только после нажатия кнопки...а когда newCycle меньше 1000 оператор из 36й не должен же выполнять тело...

Кто то просто настолько далёк от программирования, что за полгода так и не разобрался с millis() У тебя там должно быть: NewCycle=millis(); А не NewCycle=0;

не согласен. если я в 38й строчке напишу"NewCycle=millis();" , то оператор из 36 будет срабатывать каждую секунду, а он должен выполнять тело цикла через секунду после выполнения строки 32.

Posol88
Offline
Зарегистрирован: 14.11.2019

вот об этом я не подумал... выходит косяк в 21й строчке)) мерси

Posol88
Offline
Зарегистрирован: 14.11.2019
  if(millis()-newCycle>=1000,millis()-newCycle<=1200){
  digitalWrite(LED,LOW);
  Serial.println("в новом проблема");
 }

вот, дошло... 

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

Давай зачётку...

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

Posol88 пишет:

Машина опять меня победила... 

И почему никто не удивляется? :-)

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

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

Posol88 пишет:

Машина опять меня победила... 

И почему никто не удивляется? :-)

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

Posol88
Offline
Зарегистрирован: 14.11.2019

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

  пол года изучал, смотрел, читал, вникал... ну сделал я эту кормушку,и кнопки управления сделал, и экран на неё повесил... а куда теперь все эти знания девать? похоронить пол года стараний что ли?! 

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

Зачем хоронить? Теперь сам другим пиши: "прочитай хоть одну книгу по программированию" , "тебе не надоело идиотом себя выставлять" , "изучи хотя бы азы".

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

Posol88 пишет:

а куда теперь все эти знания девать? похоронить пол года стараний что ли?! 

на самом деле - это и правдв проблема. Я вот часто что-то изучу - а применять негде. Ну вот совсем...

Зато как увлекателен процесс :)))

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

Posol88 пишет:

а куда теперь все эти знания девать? похоронить пол года стараний что ли?! 

на самом деле - это и правдв проблема. Я вот часто что-то изучу - а применять негде. Ну вот совсем...

Зато как увлекателен процесс :)))

это да))

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

sadman41 пишет:

Зачем хоронить? Теперь сам другим пиши: "прочитай хоть одну книгу по программированию" , "тебе не надоело идиотом себя выставлять" , "изучи хотя бы азы".


Ну почему же! Может чел-у нравится дурачком себя выставлять. Есть ведь что то такое по Фрейду.)

Posol88
Offline
Зарегистрирован: 14.11.2019

Это просто жесть как все забывается менее чем за год... сижу смотрю на #define ... полез в интернет смотреть что это значит XD.

Всем СдрасЬти)))

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

Posol88 пишет:

Это просто жесть как все забывается менее чем за год... сижу смотрю на #define ... полез в интернет смотреть что это значит XD.

Всем СдрасЬти)))

раза четыре выучите с нуля - запомните

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

раза четыре выучите с нуля - запомните

Осталось 2 раза выходит))

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

Posol88 пишет:

b707 пишет:

раза четыре выучите с нуля - запомните

Осталось 2 раза выходит))


4-0=4
Так что никаких не два

Posol88
Offline
Зарегистрирован: 14.11.2019

Здравствуйте товарищи!я как всегда с уникальным вопросом - 

#include "iarduino_DHT.h" 
const byte ventilation=9 ,heater=8 ;
iarduino_DHT sensor(A1);   // Объявляем объект, указывая номер вывода, к которому подключён модуль
unsigned long updating_data = millis() ;

void setup(){
  delay(1000);            // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
  Serial.begin(9600);     // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
}
void loop(){                 
  
  if (millis() - updating_data >= 2000ul){
    Serial.print  ("Показания датчика: ");
      int humidity,temperature;
      switch(sensor.read()){  // Читаем показания датчика
        case DHT_OK: Serial.println((String) sensor.hum + "% - " + sensor.tem + "°C"); 
            humidity=sensor.hum;
            temperature=sensor.tem;
            if (humidity>=60.00&&ventilation == LOW){
              digitalWrite (ventilation,HIGH);
              Serial.println("9-HIGH");}
            else{ 
              Serial.println("0");
               }
             
            if (humidity<=40.00&&ventilation == HIGH) {
               digitalWrite (ventilation,LOW);
                Serial.println("9-LOW");
            }           
              else{ 
              Serial.println("1");
               }
              if (temperature>=22.00&&heater == HIGH){
               digitalWrite (heater,LOW);
                Serial.println("8,LOW");
                } 
              else{ 
              Serial.println("2");
               }
              if (temperature<=15.00&&heater == LOW) {
               digitalWrite (heater,HIGH);
                Serial.println("8,HIGH");
            }
            else{ 
              Serial.println("3");
               }          
        break;          
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
      } 
    updating_data = millis();
  }
}

 

в строках 23,30,37,44. если убрать вторую часть условия, например "&&ventilation == LOW", то все прекрасно работает. а в оригинальном виде, оператор "if" считает условие ложным. не могу понять - почему?

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

Ты знаешь что значит int 

int humidity,temperature;

и что значит 60.00?

if (humidity>=60.00&&ventilation == LOW)

Posol88
Offline
Зарегистрирован: 14.11.2019

DetSimen пишет:

Ты знаешь что значит int 

int humidity,temperature;

и что значит 60.00?

if (humidity>=60.00&&ventilation == LOW)

я понял тебя) но как ни странно на эту часть условия нареканий пока не было 

Posol88
Offline
Зарегистрирован: 14.11.2019

DetSimen пишет:

Ты знаешь что значит int 

исправил этот косяк

#include "iarduino_DHT.h" 
const byte ventilation=9 ,heater=8 ;
iarduino_DHT sensor(A1);   // Объявляем объект, указывая номер вывода, к которому подключён модуль
unsigned long updating_data = millis() ;

void setup(){
  delay(1000);            // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
  Serial.begin(9600);     // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
}
void loop(){                 
  
  if (millis() - updating_data >= 2000ul){
    Serial.print  ("Показания датчика: ");
      float humidity,temperature;
      switch(sensor.read()){  // Читаем показания датчика
        case DHT_OK: Serial.println((String) sensor.hum + "% - " + sensor.tem + "°C"); 
            humidity=sensor.hum;
            temperature=sensor.tem;
            if (humidity>=60.00&&ventilation == LOW){
              digitalWrite (ventilation,HIGH);
              Serial.println("9-HIGH");}
            else{ 
              Serial.println("0");
               }
             
            if (humidity<=40.00&&ventilation == HIGH) {
               digitalWrite (ventilation,LOW);
                Serial.println("9-LOW");
            }           
              else{ 
              Serial.println("1");
               }
              if (temperature>=22.00&&heater == HIGH){
               digitalWrite (heater,LOW);
                Serial.println("8,LOW");
                } 
              else{ 
              Serial.println("2");
               }
              if (temperature<=15.00&&heater == LOW) {
               digitalWrite (heater,HIGH);
                Serial.println("8,HIGH");
            }
            else{ 
              Serial.println("3");
               }          
        break;          
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
      } 
    updating_data = millis();
  }
}

вопрос актуален

Posol88
Offline
Зарегистрирован: 14.11.2019

DetSimen пишет:

и что значит 60.00?

это значение в том виде, в котором приходят показания с датчика влажности воздуха.

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

Posol88 пишет:
оператор "if" считает условие ложным.

Ну, а каким ему его считать, если ventilation является константой, равной 9  (см. строку 2)?

Т.е. условие

ventilation == LOW

эквивалентно условию

9 == 0

Вас удивляет, что оно всегда ложно? Во "не можете понять почему"?

Posol88
Offline
Зарегистрирован: 14.11.2019

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

Вас удивляет, что оно всегда ложно? Во "не можете понять почему"?

меня удивляет что я за столько времени не научился искать ошибки во всем коде)

СПАСИБО!

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

Posol88 пишет:

DetSimen пишет:

Ты знаешь что значит int 

исправил этот косяк

лучше было исправить "в другую сторону", int сохранить, а вместо этого в условиях везде заменить 60.00, 40.00... на целые

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

лучше было исправить "в другую сторону", int сохранить, а вместо этого в условиях везде заменить 60.00, 40.00... на целые

а как быть со сравнением? с датчика то показания приходят с точкой

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

Posol88 пишет:

а как быть со сравнением? с датчика то показания приходят с точкой

когда вы их присваиваете своим переменным типа int. никакой точки там уже нет.

 

Вот вы чуть выше восклицаете - "Когда же я научусь искать ошибки в своих скетчах?" . А причина-то вовсе не в невнимательности - причина что вы не знаете основ языка, на котором пишете. При таком раскладе искать ошибки вы не научитесь никогда. так и будете годами задавать детские вопросы об одном и том же.

Posol88
Offline
Зарегистрирован: 14.11.2019
 
Показания датчика: 95.00% - 29.00°C
0
1
2
3
Показания датчика: 86.00% - 29.00°C
0
1
2
3
Показания датчика: 43.00% - 29.00°C
0
1
2
3
Показания датчика: 40.00% - 29.00°C
0
1
2
3
Показания датчика: 37.00% - 29.00°C
0
1
2
3
#include "iarduino_DHT.h" 
int ventilation=9 ,heater=8 ;
iarduino_DHT sensor(A1);   // Объявляем объект, указывая номер вывода, к которому подключён модуль
unsigned long updating_data = millis() ;

void setup(){
  delay(1000);            // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
  Serial.begin(9600);     // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
}
void loop(){                 
  
  if (millis() - updating_data >= 2000ul){
    Serial.print  ("Показания датчика: ");
      float humidity,temperature;
      switch(sensor.read()){  // Читаем показания датчика
        case DHT_OK: Serial.println((String) sensor.hum + "% - " + sensor.tem + "°C"); 
            humidity=sensor.hum;
            temperature=sensor.tem;
            if (humidity>=60.00&&ventilation == LOW){
              digitalWrite (ventilation,HIGH);
              Serial.println("9-HIGH");}
            else{ 
              Serial.println("0");
               }
             
            if (humidity<=40.00&&ventilation == HIGH) {
               digitalWrite (ventilation,LOW);
                Serial.println("9-LOW");
            }           
              else{ 
              Serial.println("1");
               }
              if (temperature>=22.00&&heater == HIGH){
               digitalWrite (heater,LOW);
                Serial.println("8,LOW");
                } 
              else{ 
              Serial.println("2");
               }
              if (temperature<=15.00&&heater == LOW) {
               digitalWrite (heater,HIGH);
                Serial.println("8,HIGH");
            }
            else{ 
              Serial.println("3");
               }          
        break;          
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
      } 
    updating_data = millis();
  }
}

монитор порта:

Показания датчика: 95.00% - 29.00°C
0
1
2
3
Показания датчика: 86.00% - 29.00°C
0
1
2
3
Показания датчика: 43.00% - 29.00°C
0
1
2
3
Показания датчика: 40.00% - 29.00°C
0
1
2
3
Показания датчика: 37.00% - 29.00°C
0
1
2
3

при этом оба светодиода(те что вместо нагрузки на 8 и 9 пинах) работают постоянно в не зависимости от показаний датчика(что и видно по показаниям в мониторе).

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

Posol88 пишет:

 
Показания датчика: 95.00% - 29.00°C

и к чему вы это написали? :) Чтобы еще раз подтвердить, что я прав относительно вашего незнания языка? :)

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

Posol88 пишет:

при этом оба светодиода(те что вместо нагрузки на 8 и 9 пинах) работают постоянно в не зависимости

вам Евгений уже написал выше, почему так происходит. У вас ventillation =9 и, сл-но, ventillation == LOW никогда не станет истинно

Posol88
Offline
Зарегистрирован: 14.11.2019

Долго, за то доходит)) (18-19)

#include "iarduino_DHT.h" 
#define ventilation 9  
#define heater 8
iarduino_DHT sensor(A1);   // Объявляем объект, указывая номер вывода, к которому подключён модуль
unsigned long updating_data = millis() ;

void setup(){
  delay(1000);            // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
  Serial.begin(9600);     // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
}
void loop(){                 
  
  if (millis() - updating_data >= 2000ul){
    boolean N=digitalRead(ventilation);
    boolean N1=digitalRead(heater);
    Serial.print  ("Показания датчика: ");
      float humidity,temperature;
      switch(sensor.read()){  // Читаем показания датчика
        case DHT_OK: Serial.println((String) sensor.hum + "% - " + sensor.tem + "°C"); 
            humidity=sensor.hum;
            temperature=sensor.tem;
            if (humidity>=60.00&&N == LOW){
              digitalWrite (ventilation,HIGH);
              Serial.println("9-HIGH");}
            else{ 
              Serial.println("0");
               }
             
            if (humidity<=40.00&&N == HIGH) {
               digitalWrite (ventilation,LOW);
                Serial.println("9-LOW");
            }           
              else{ 
              Serial.println("1");
               }
              if (temperature>=22.00&&N1 == HIGH){
               digitalWrite (heater,LOW);
                Serial.println("8,LOW");
                } 
              else{ 
              Serial.println("2");
               }
              if (temperature<=15.00&&N1== LOW) {
               digitalWrite (heater,HIGH);
                Serial.println("8,HIGH");
            }
            else{ 
              Serial.println("3");
               }          
        break;          
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
      } 
    updating_data = millis();
  }
}

пойду массивы мучать... благодарю, что все еще отвечаете мне))))

Posol88
Offline
Зарегистрирован: 14.11.2019

Здравствуйте, о великие гуру программирования и безвозмездной помощи, отрокам еще не знающим и не умеющим)))

Поменяли мне операционку с 7ки на 10ку. поставил я на нее версию arduino IDE для семерки (что бы библиотеками ее пополнять без проблем) и теперь сама программа, "arduino IDE", не видит подключаемые к компу платы ардуино. При чем винда видит подключенное устройство и определяет его ком порт. 

  Наверняка есть какой то нюанс на этот случай. Подскажите куда идти XD 

P.S. на каком то форуме говорили про драйвера, которые нужно скачать с сайта ардуино, и даже ссылку оставляли, но как я там не пытался найти хоть что то связанное с драйверами - не получилось... 

Posol88
Offline
Зарегистрирован: 14.11.2019

Posol88 пишет:

 не видит подключаемые к компу платы ардуино

при выборе COM порта показывает только первый, а плата тем временем весит на 3м или 5ом

Posol88
Offline
Зарегистрирован: 14.11.2019

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

 для тех у кого та же проблема - https://alexgyver.ru/lessons/first-flash/  тут описано максимальное количество подобных проблем и пути их решения.

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

Posol88 пишет:

 для тех у кого та же проблема - https://alexgyver.ru/lessons/first-flash/  тут описано максимальное количество подобных проблем и пути их решения.

Спасибо!

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

Ну вот как бы мы жили без ЧЮ!)

Posol88
Offline
Зарегистрирован: 14.11.2019
#define CLK 2
#define DT 3
#define SW 12
#define ventilation 6  
#define heater 5
#define FILTER_STEP 10000
#define FILTER_COEF 0.05
#include <LiquidCrystal_I2C_OLED.h>
#include <Servo.h>                                                                         //подключение библиотеки управления сервоприводом
#include <iarduino_RTC.h>                                                                  //подключение библиотеки модуля часов 
#include "GyverEncoder.h"
#include "iarduino_DHT.h"
#include <Wire.h>                                                                          //подключение библиотеки не помню какой(по моему она тут вообще не нужна...)
Encoder enc1(CLK, DT, SW,2);
iarduino_DHT sensor(A1);                                                                   // Объявляем объект, указывая номер вывода, к которому подключён модуль
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo;                                                                               //имя сервопривода
iarduino_RTC Time (RTC_DS1302, A0, A2, A1);                                                //назначение пинов обмена данными RST, CLK, DAT
float val_humidity, val_temperature,humidity,temperature,userTemp=15ul,userHum=70ul;
int pos = 0, menu=1;                                                                               //переменная хранящая угол поворота сервопривода
unsigned long filter_timer,TimeWait,TimeWork,TimsWorker=4710ul,home_timerMenu;  //1)переменная для индикации закольцовки 2)переменная хранящая время прошедшее с момента нажатия кнопки. 2)переменная хранящаявремя с момента последнего вывода текущего значения времени с RTC модуля в серийный порт. 3)переменная хранящая время включения сервопривода
boolean qr=true,QR=true;                                                           //переменная меняющая значение в момент включения и выключения сервопривода 1:(служит для ограничения срабатывания по времени с RTC до одного раза за секунду)2:не смог сформулировать.
byte  c = 1;                                                                //переменная хранящая количество раз нажатия кнопки
int w,W;                                                                               //1:переменная меняющая свое значение в момент нажатия кнопки(защита от дребезга)2:переменная хранящая статус положения сервопривода(защита от дребезга)
boolean statusVent=digitalRead(ventilation);
boolean statusHeat=digitalRead(heater);
byte line_2[8] = 
{
 B00010, 
 B10101,
 B10101,
 B01110,
 B00100,
 B00100,
 B00100,
};
byte line_1[8] = 
{
 B00100, 
 B01010,
 B00100,
 B00000,
 B00000,
 B00000,
 B00000,
};
void setup() {
  delay(300);                                                  //время на подумать
  Time.begin();                                                //инициализация работы часов
  Serial.begin(9600);
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
  attachInterrupt(1, encoder, CHANGE);
  attachInterrupt(0, encoder, CHANGE);
  lcd.init();                                                  //инициализация работы дисплея
  enc1.setTickMode(AUTO);
  servo.attach(6);                                             //назначение пина управления сервоприводом
  filter_timer=millis();
  //Time.settime(00,7,19,22,9,2020,2);                           // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
   lcd.createChar(1,line_1);
   lcd.createChar(2,line_2);
}
void loop() {
  
  enc1.tick();  
  if (enc1.isTurn()){lcd.backlight();home_timerMenu = millis();QR=false;w=true;lcd.clear();                          
 switch (menu){ 
   case 1: if(w==true){//lcd.clear();         
             lcd.setCursor(1,0);lcd.print("t");lcd.write(1);lcd.setCursor(3,0);lcd.print("val_temp");lcd.print("C");lcd.write(1);
             lcd.setCursor(1,1);lcd.write(2);lcd.setCursor(3,1);lcd.print("val_humidity%");w=false;} break;                        
   case 2: if(w==true){//lcd.clear();       
             lcd.setCursor(0,0);lcd.print(">");lcd.setCursor(1,0);lcd.print("t");lcd.write(1);lcd.setCursor(3,0);lcd.print(userTemp);lcd.print("C");lcd.write(1);
             lcd.setCursor(1,1);lcd.write(2);lcd.setCursor(3,1);lcd.print(userHum,"%");w=false;} break;                   
   case 3: if(w==true){//lcd.clear();         
             lcd.setCursor(1,0);lcd.print("t");lcd.write(1);lcd.setCursor(3,0);lcd.print(userTemp);lcd.print("C");lcd.write(1);
             lcd.setCursor(0,1);lcd.print(">");lcd.setCursor(1,1);lcd.write(2);lcd.setCursor(3,1);lcd.print(userHum,"%");w=false;}break;
                   
    case 4: if(w==true){//lcd.clear();         
              lcd.setCursor(0,0);lcd.print(">");lcd.setCursor(1,0);lcd.print(Time.gettime("H:i:s")); //lcd.setCursor(8,0);lcd.print("");
              lcd.setCursor(0,1);lcd.print(" ");lcd.setCursor(6,1);lcd.print("TimsWorker");w=false;}break;                     
    case 5: if(enc1.isClick()){servoOpen(); TimeWork = millis();W=false;}break;  
   }                          
  if(W==false){
      switch (c){
         case 1: //lcd.clear();             
                 lcd.setCursor(0,0);lcd.print(">");lcd.setCursor(1,0);lcd.print("DokopM"); lcd.setCursor(8,0);lcd.print("Experemen");
                 lcd.setCursor(1,1);lcd.print(" ");lcd.setCursor(6,1);lcd.print("TimsWorker");servoToClose();TimeWork=0;W=true;break;                                  
         case 2: //lcd.clear();            
                 lcd.setCursor(0,0);lcd.print(">");lcd.setCursor(1,0);lcd.print("DokopM"); lcd.setCursor(8,0);lcd.print("1/2");
                 lcd.setCursor(1,1);lcd.print(" ");lcd.setCursor(6,1);lcd.print("TimsWorker");          
            if ( TimsWorker/2 <= millis() - TimeWork) {servoToClose();Serial.println("1/2");TimeWork=0;W=true;}break;                               
         case 3: //lcd.clear();            
                 lcd.setCursor(0,0);lcd.print(">");lcd.setCursor(1,0);lcd.print("DokopM"); lcd.setCursor(8,0);lcd.print("Doza");
                 lcd.setCursor(0,1);lcd.print(" ");lcd.setCursor(6,1);lcd.print("TimsWorker");
            if (millis() - TimeWork >= TimsWorker) {servoToClose();Serial.println("doza");TimeWork=0;W=true;}break;                                
         default:TimeWait=0;c=1;TimeWork=0;W=true; break;}       
  }}
  
  if (millis()- home_timerMenu>=30000&&QR==false){
     Serial.println("menu time 1");
     lcd.noBacklight();
     home_timerMenu=0;
     QR=true;
     menu=1;} 
  if (qr == true && Time.Hours == 7 && Time.minutes == 00 && Time.seconds == 10) {                // если переменная qr имеет значение true и время 07:00:10 то
     qr = false;  
     TimeWork = millis();
     home_timerMenu=millis();
     lcd.backlight();    
     servoOpen();}
  if (qr == true && Time.Hours == 18 && Time.minutes == 00 && Time.seconds == 10) {                  //если переменная qr имеет значение true и время 18:00:10 то
      qr = false;                                                                                    //присвоить переменной значение false
      TimeWork = millis();                                                                           //присвоить переменной значение millis
      lcd.backlight();
      home_timerMenu=millis();
      servoOpen();  
      }   
  if (millis() - TimeWork >= TimsWorker && qr == false) {                                            //если переменная qr имеет значение false, а с момента присвоения переменной TimeWork значения millis прошло 5 сек то
      qr = true;                                                                                     //присвоить переменной значение true
      servoToClose();                                                                                //выполнить функцию
     }
  if (millis() - filter_timer > FILTER_STEP) {filter_timer = millis();
      switch(sensor.read()){
        case DHT_OK:
             humidity=sensor.hum;                              
             temperature=sensor.tem;                                                                                        // читаем значение (не обязательно с аналога, это может быть ЛЮБОЙ датчик)                  
             val_humidity = humidity * FILTER_COEF + val_humidity * (1 - FILTER_COEF);                                      // основной алгоритм фильтрации. Внимательно прокрутите его в голове, чтобы понять, как он работает
             val_temperature = temperature * FILTER_COEF + val_temperature * (1 - FILTER_COEF);break;
             /*Serial.print(val_temperature); Serial.println("°");
             Serial.print(val_humidity ); Serial.println("%");
             Serial.print(temperature); Serial.println("°");
             Serial.print(humidity); Serial.println("%");                                         
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
       }
       Serial.print("влажность:"); Serial.print(val_humidity);Serial.print("       ");Serial.println(statusVent);
       Serial.print("температура:");Serial.print(val_temperature);Serial.print("       ");Serial.println(statusHeat);*/
  }     
 if (val_humidity - userHum > 10  && statusVent == LOW){
    digitalWrite (ventilation,HIGH);
    }            
 if (userHum - val_humidity > 10 && statusVent == HIGH){
    digitalWrite (ventilation,LOW);
    }             
 if ( userTemp - val_temperature > 4 && statusHeat== LOW){
    digitalWrite (heater,HIGH);
    }
 if ( val_temperature - userTemp > 4 && statusHeat == HIGH){
    digitalWrite (heater,LOW);
    }
if (TimsWorker>=20000){TimsWorker=20000;}
if (TimsWorker<=785){TimsWorker=785;}
}}
void servoOpen() {                                                                                  //создать функцию  
  for (pos = 90; pos >= 0; pos -= 1) {                                                               //оператор:если переменная pos ровна 90 то: это больше или ровно 0?: если да то отнять от значения переменной pos единицу и выполнить функцию
    servo.write(pos);                                                                                //повернуть вал сервопривода на градус равный значению переменной pos
    delay(5);}                                                                                        //перерыв в работе 0.005сек
    //Serial.println("open");
  }
void servoToClose() {                                                                               //создать функцию
  for (pos = 0; pos <= 90; pos += 1) {servo.write(pos);delay(5);}    
    servoDo();
}
void servoDo() {
  for (pos = 90; pos >= 88; pos -= 1) {servo.write(pos);delay(5);}                            
   //Serial.println("servoDo");
   lcd.setCursor(2,1);
   lcd.print("CLOSE ");
}
void encoder (){
  if (enc1.isRight()){menu++;if(menu>5){menu=5;}/*Serial.println(menu);*/}
  if (enc1.isLeft()){menu--;if(menu<1){menu=1;}/*Serial.println(menu);*/}
  switch (menu){ 
   case 1:
           break;    
   case 2:  
          if (enc1.isRightH()){userTemp++;/*Serial.print("menu2 ");Serial.println(userTemp);*/}  // если было удержание + поворот
          if (enc1.isLeftH()) {userTemp--;/*Serial.print("menu2 ");Serial.println(userTemp);*/} // если было удержание + поворот
                     break;
   case 3:  
          if (enc1.isRightH()){userHum++;/*Serial.print("menu3 ");Serial.println(userHum);*/}  // если было удержание + поворот
          if (enc1.isLeftH()) {userHum--;/*Serial.print("menu3 ");Serial.println(userHum);*/} // если было удержание + поворот
                     break;
    case 4:  
          if (enc1.isRightH()){TimsWorker+=785ul;/*Serial.print("menu4 ");Serial.println(TimsWorker);*/}  // если было удержание + поворот
          if (enc1.isLeftH()) {TimsWorker-=785ul;/*Serial.print("menu4 ");Serial.println(TimsWorker);*/} // если было удержание + поворот
                     break; 
     case 5:   
          if(enc1.isRightH()){c++; TimeWait = millis();if(c>3)c=3;/*Serial.print("menu5 ");Serial.println(c)*/;  }
          if(enc1.isLeftH()){c--; TimeWait = millis();if(c<1)c=1;/*Serial.print("menu5 ");Serial.println(c); */ }  
          if(enc1.isClick()){servoOpen(); TimeWork = millis();W=false;}
                     break; }}

Воооот...

вопрос с экраном. при переключении в первое меню - все выводится как нужно... там только текст.

но при переключении во второе меню, из-за того , что требуется вывести  userTemp в нулевой строчке и userHum в первой,

обе строчки экрана покрываются нулями с ног до головы(все 16 столбцов).  если кто нибудь сможет намекнуть из за чего - буду очень благодарен.

P.S. там еще отдельные проблемы с пятым меню, но я сам...

P.P.S. Здравствуйте!

Posol88
Offline
Зарегистрирован: 14.11.2019

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

Posol88
Offline
Зарегистрирован: 14.11.2019

Все, спасибо) поменял тип переменной на unsigned long и все заработало.

P.S. вот так-"lcd.print(userHum,"%");" это не работает нужно -"lcd.print(userHum);lcd.print("%");"

Posol88
Offline
Зарегистрирован: 14.11.2019

Уважаемые форумчане, доброго вечера. 

подскажите пожалуйста - как узнать какой тип данных возвращает метод "Tims." в библиотеке "iarduino_RTC.h"? или вообще как находить подобную информацию.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Posol88 пишет:

Уважаемые форумчане, доброго вечера. 

подскажите пожалуйста - как узнать какой тип данных возвращает метод "Tims." в библиотеке "iarduino_RTC.h"? или вообще как находить подобную информацию.

Обычно, проще всего посмотреть в библиотеке. Там перед именем метода палюбас что-то написано (если это не конструктор). Оно и есть

Posol88
Offline
Зарегистрирован: 14.11.2019

Rumata пишет:

проще всего посмотреть в библиотеке. 

вот с этим у меня и проблема. какой программой и какой фаил в библиотеке смортеть? я вордом открываю - там крокозябры одни

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Скайпом надо открывать. Заголовочный файл .h Хотя, можно и .cpp. Только там букоф больше и надо уже экселем открывать, скайп не потянет

блокнот тоже сойдет

Искомые файлы обычно лежат в подпапке src или в корне

Posol88
Offline
Зарегистрирован: 14.11.2019

Rumata пишет:

 или в корне

что имеется ввиду?

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

Posol88 пишет:
я вордом открываю
Троллинг?

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ЕвгенийП

Posol88 пишет:

 

что имеется ввиду?

Похоже. И жирный

Posol88
Offline
Зарегистрирован: 14.11.2019

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

Троллинг?

нет. если бы. с тем как библиотечный фаил открыть я разобрался - тему на форуме нашел, просто перенести в arduino IDE можно . правда там тоже не все понятно. 

но вот что такое "корень"? я догадываюсь что это главный фаил библиотеки. А как его распознать?