Разные показания в скетче

Neptunin
Offline
Зарегистрирован: 04.04.2017

Здравствуйте, имеется код, где установлено время срабатывания реле для 2-х каналов на основе DS1302.

В первом канале реле срабатывает по времени, а во втором реле срабатывает на час позже, помогите найти ошибку...

// DS1302_Serial_Easy 
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
// A quick demo of how to use my DS1302-library to 
// quickly send time and date information over a serial link


#include <DS1302.h>
Time t;
// Канал 1
int t1=9; // Час включения света
int m1=0; // Минуты включения
int t2=23; // Час вылючения света
int m2=0; // Минуты вылючения

//Канал 2
int t3=11; // Час включения света
int m3=0; // Минуты включения
int t4=19; // Час вылючения света
int m4=0; // Минуты вылючения

int d; // Переменная в которую записываются текущий показатель часов
int m; // Переменная в которую записываются текущий показатель минут

// Реле модуль подключен к цифровому выводу 5
int Relay = 5;
int Relay2 = 6;

// Подключение the DS1302
// DS1302:  CE pin  (RES)  -> Arduino Digital 2
//          I/O pin (DAT)  -> Arduino Digital 3
//          SCLK pin(CLK) -> Arduino Digital 4
DS1302 rtc(2, 3, 4);

void setup()
{
   pinMode(Relay, OUTPUT); 
   pinMode(Relay2, OUTPUT); 
 
  
  // Setup Serial connection (Установки подключения)
  Serial.begin(9600);

  // The following lines can be commented out to use the values already stored in the DS1302(Строки ниже нужно раскоментировать если вы устанавливаете дату и время в модуль после установки нужно опять закоментировать)
  // Set the clock to run-mode, and disable the write protection
  // rtc.halt(false);
  // rtc.writeProtect(false);
  //rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  //rtc.setTime(20, 44, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate( 9, 13, 2017);   // Set the date to August 6th, 2010
  
}

void loop()
{
  t = rtc.getTime();
  // Send Day-of-Week(Передать день недели)
 //Serial.print(rtc.getDOWStr());
 // Serial.print(" ");
  
  // Передать дату
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");
d=t.hour,DEC;
m=t.min,DEC;
  // Передать время
  Serial.println(rtc.getTimeStr());
  
  
  
  if (d >= t1 && d <= t2) {
                          if (d==t1 && m<m1) {goto label;}
                          if (d==t2 && m>m2) {goto label;}
   digitalWrite(Relay, HIGH);   // реле включено
   Serial.println(" Filter - on ");
                        }
                        else
                            {  
                             label:           
                            digitalWrite(Relay, LOW);  // реле выключено 
                            Serial.println(" Filter - off "); 
                            }
 if (d >= t3 && d <= t4) {
                          if (d==t3 && m<m3) {goto label2;}
                          if (d==t3 && m>m4) {goto label2;}
   digitalWrite(Relay2, HIGH);   // реле включено
   Serial.println(" Svet - on ");
                        }
                        else
                            {  
                             label2:           
                            digitalWrite(Relay2, LOW);  // реле выключено 
                            Serial.println(" Svet - off "); 
                            }                            
  delay(30000);  // задержка 30 сек
}

 

toc
Offline
Зарегистрирован: 09.02.2013

1. в тексте описано желаемое?
2. как проявляется ошибка?
3. у меня ваша программа не компилируется

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

1. Всегда давайте ссылки на используемые библиотеки, т.к. библиотек с одинаковыми названиями - как дерьма за баней. У коллеги, вот другая и у него Ваш код не скомпилировался.

2. После строки 65 выведите в Serial значения переменных m и d - узнаете много интересного. Скажите, что получмлось :)

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

ошибка в строке 85.

Хотя к делу отношения не имеет, но не могу не сказать - Стиль программирования отвратительный.

Neptunin
Offline
Зарегистрирован: 04.04.2017

1. в тексте описано желаемое?

-нет, ошибка, желаемое в коде

2. как проявляется ошибка?

первый канал работает правильно(в 9:00 включается и в 23:00 выключается), а вот второй канал, в 11:00 включается на 30сек., и выключается, а потом только включается в 12:00 и выключается в 20:00, т.е. на час позже от запланированного в коде!

3. у меня ваша программа не компилируется

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

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

b707 пишет:

ошибка в строке 85.

там ещё раньше, в строках 64 и 65 чудеса пошли.

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

Neptunin пишет:

1. в тексте описано желаемое?

-нет, ошибка, желаемое в коде

Коллега имел в виду, что Вы не описали, что этот код должен делать. Никто не обязан за Вас догадываться.

Напечатали переменные, которые я говорил? Понравились?

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

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

там ещё раньше, в строках 64 и 65 чудеса пошли.

подозреваю, что 64 и 65 - это опечатка, в реальном коде ее наверно нет, иначе вообще ничего бы не работало.

А ошибка в строке 85 - это именно то, что определяет глюк работы второго канала.

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

b707 пишет:

подозреваю, что 64 и 65 - это опечатка, в реальном коде ее наверно нет, иначе вообще ничего бы не работало.

Почему? Посмотрите с какими значениями он потом сравнивает. Всё иногда работает по той же причине, по какой стоящие часы иногда правильное время показывают :) 

Neptunin
Offline
Зарегистрирован: 04.04.2017

Граждане, я не программист,  я обычный роботяга, который хочет автоматизировать процесс вкл/откл аквариума для детей, я знаю notepad+ , немного html и css
код писал человек из ютуба, на скорую руку, за что ему очень благодарен, как я понял, он его переделал из чего то... все это с косяками работает 3 месяца, чувствую что и дальше так же будет!

чем помогли:

ошибки в стр.64,65,85

я даун

ничего не должно работать

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Neptunin, никого не волнует, программист Вы или нет. 

Вам попытались помочь. Но помогают здесь ТОЛЬКО тем, кто сам что-то делает и готов учиться.

Если Вас это не устаривает, можете заказать работу за деньги в разделе "Ищу исполнителя".

Думаю, других вариантов нет (по крайней мере, на форуме), как там с "ютубом" - не знаю.

 

PS. Опубликованный код действительно безобразен. У любого вменяемого программиста он вызывает желание не править его, а переписать с нуля. Если будуте заказывать работу, имейте это в виду.

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

Neptunin пишет:

ошибки в стр.64,65,85

я даун

ничего не должно работать

А Вы чего ожидали? Что за Вас всё исправят? Так это не сюда, это в раздел "Ищу исполнителя", там за деньги делают.

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

Neptunin
Offline
Зарегистрирован: 04.04.2017

Спасибо Вам большое, в 85-ой строке исправил ошибку, 2-ой канал заработал правильно!
в 64,65, так и есть и было в коде - работает пока, понимаю что нарушены основные правила написания переменных, подскажите где почитать и что именно?!

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

Neptunin пишет:

Спасибо Вам большое, в 85-ой строке исправил ошибку, 2-ой канал заработал правильно!

ну вот, а говорите не помогли...

Neptunin
Offline
Зарегистрирован: 04.04.2017

Нет, нет, нет, можете проверить, я такого не говорил, наоборот указал чем помогли, и тут же получил гору камней)
Спасибо ещё раз

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

Насчёт строк  64 и 65 меня вчера переклинило - приоритет операций не учёл. Так писать можно, если хочется. Плохо было бы, если правую от "=" часть в скобки взять.

fogary
Offline
Зарегистрирован: 05.03.2016

Без жутких goto

if (d >= t1 && d < t2){
  digitalWrite(Relay, HIGH);
  Serial.println(" Filter - on ");
} else {
  digitalWrite(Relay, LOW);
  Serial.println(" Filter - off ");
}

if (d >= t3 && d < t4){
  digitalWrite(Relay2, HIGH);
  Serial.println(" Svet - on ");
} else {
  digitalWrite(Relay2, LOW);
  Serial.println(" Svet - off ");
}