Помогите пожалуйста я новичок!

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

Доброго времени суток! Очень сильно нуждаюсь в помощи! Решили с другом сделать автоматическую подачу звонков в школу т.к. вахтерши их или забывают подать или подают с большим опазданием... Все шло по плану пока не начались ложные срабатывания после 2-3 часов работы. Задумка такова:

В арудуино uno заложено расписание звонков (рабочие дни/субботний день/вс-нет звонков).  По наступлению заданного времени из расписания - происходит кратковременное включение реле (секунд 8). Дальше реле включает уже контактор, а он замыкает силовую цепь звонков. Сверять время арудино будет с часов реального времени DS 3231.

Помогите пожалуйста с этой проблемой! Буду очень благодарен если скажете в каких моментах кода ошибки и как такой код должен выглядеть в идеальном состоянии.

Заранее спасибо!

КОД:

#include <Wire.h>
#include <DS3231.h>

int Rele = 7;
int Green = 5; //пин зеленый светодиод
int Blue = 9; //пин синий светодиод
int Red = 11; //пин красный светодиод

DS3231 Clock;
bool h12 = false;
bool PM;
bool Century;

void setup() {

Wire.begin();
pinMode(Rele, OUTPUT);
digitalWrite(Rele, HIGH);
pinMode(Green, OUTPUT);
pinMode(Blue, OUTPUT);
pinMode(Red, OUTPUT);
}

void loop() {

int second, minute, hour, day;
day = Clock.getDoW();
hour = Clock.getHour(h12, PM);
minute = Clock.getMinute();
second = Clock.getSecond();
digitalWrite(Green, HIGH);

if (day == 1,2,3,4,5 && hour == 8 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}

if (day == 1,2,3,4,5 && hour == 9 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}

 if (day == 1,2,3,4,5 && hour == 9 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 10 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 10 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 11 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 11 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 12 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 12 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 13 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 13 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 14 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 14 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 15 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 15 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 16 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 16 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 17 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 17 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 18 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 18 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1,2,3,4,5 && hour == 19 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 6 && hour == 8 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 9 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 9 && minute == 50 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 10 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 10 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 11 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }


  if (day == 6 && hour == 11 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 00 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 55 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 13 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 13 && minute == 50 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 00 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 45 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 55 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 15 && minute == 40 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 }
 

 

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

1. Что по-вашему означает конструкция

if (n == 1, 2, 3, 4, 5

? Уточняю вопрос, при каких  n выражение n == 1, 2, 3, 4, 5 будет истинным? 

Не торопитесь с ответом. Запустите вот такой скетч и попробуйте объяснить почему его результат именно такой, а не другой

void setup(void) {
  Serial.begin(115200);
  for (int n = 0; n < 10; n++) {
    if (n == 1, 2, 3, 4, 5) {
      Serial.print(n);
      Serial.println(" Sovpalo ");
    }
  }
}

void loop(void) {}

//	Результат
//	
//	0 Sovpalo 
//	1 Sovpalo 
//	2 Sovpalo 
//	3 Sovpalo 
//	4 Sovpalo 
//	5 Sovpalo 
//	6 Sovpalo 
//	7 Sovpalo 
//	8 Sovpalo 
//	9 Sovpalo 
DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

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

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

Вот новый КОД:

#include <Wire.h>
#include <DS3231.h>

int Rele = 7;
int Green = 5; //пин зеленый светодиод
int Blue = 9; //пин синий светодиод
int Red = 11; //пин красный светодиод

DS3231 Clock;
bool h12 = false;
bool PM;
bool Century;

void setup() {

Wire.begin();
pinMode(Rele, OUTPUT);
digitalWrite(Rele, HIGH);
pinMode(Green, OUTPUT);
pinMode(Blue, OUTPUT);
pinMode(Red, OUTPUT);
}

void loop() {

int second, minute, hour, day;
day = Clock.getDoW();
hour = Clock.getHour(h12, PM);
minute = Clock.getMinute();
second = Clock.getSecond();
digitalWrite(Green, HIGH);

if (day == 1 || 2 || 3 || 4 || 5 && hour == 8 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}

if (day == 1 || 2 || 3 || 4 || 5 && hour == 9 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}

 if (day ==  1 || 2 || 3 || 4 || 5 && hour == 9 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 10 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 10 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 11 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 11 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 12 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 12 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 13 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 13 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 14 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 14 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 15 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 15 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 16 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 16 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 17 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 17 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 18 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 18 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 1 || 2 || 3 || 4 || 5 && hour == 19 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 6 && hour == 8 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 9 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 9 && minute == 50 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 10 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 10 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 11 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }


  if (day == 6 && hour == 11 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 00 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 55 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 13 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 13 && minute == 50 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 00 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 45 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 55 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 15 && minute == 40 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 }
 

 

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

Хорошо, давайте сначала

1. Что по-вашему означает конструкция

if (day == 1 || 2 || 3 || 4 || 5

? Уточняю вопрос, при каких  n выражение n == 1 || 2 || 3 || 4 || 5 будет истинным? 

Не торопитесь с ответом. Запустите вот такой скетч и попробуйте объяснить почему его результат именно такой, а не другой

void setup(void) {
  Serial.begin(115200);
  for (int n = 0; n < 10; n++) {
    if (n == 1 || 2 || 3 || 4 || 5) {
      Serial.print(n);
      Serial.println(" Sovpalo ");
    }
  }
}

void loop(void) {}

//	Результат
//	
//	0 Sovpalo 
//	1 Sovpalo 
//	2 Sovpalo 
//	3 Sovpalo 
//	4 Sovpalo 
//	5 Sovpalo 
//	6 Sovpalo 
//	7 Sovpalo 
//	8 Sovpalo 
//	9 Sovpalo 
И, наконец, огромный совет: прежде, чем вставлять новую конструкцию в код, проверьте её на таком же маленьком скетче. Обязательно!
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

minute == 05 && second == 00

Вам просто повезло, что всё работает так, как Вам надо. Попробуйте вместо 05 поставить 09, получите массу удовольствия.

А ещё лучше попробуйте так

int n = 015;
Serial.println(n);

Узнаете много интересного.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Не проще хранить времена подачи звонков в виде двумерного целочисленного массива и в цикле перебирать на совпадение с показаниями часов?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ulis пишет:

Не проще хранить времена подачи звонков в виде двумерного целочисленного массива и в цикле перебирать на совпадение с показаниями часов?


А еще лучше хранить в структуре.Хотя привычнее мне в классе.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

А что мы будем хранить в структуре?

Glebiys
Offline
Зарегистрирован: 26.03.2017

А с чем могут быть связаны ложные срабатывания? Память забивается или с что-то другое? Я товарищ Данила, вместе работаем над созданием автозвонков. Само устройство сейчас в школе лежит, завтра протестирует ваш код и ответит) Спасибо большое, что есть такие отзывчивые люди, как Вы!)

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

Glebiys пишет:

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

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ulis пишет:

А что мы будем хранить в структуре?

А вот это и будем хранить день, час, минута,секунда. Точнее структура задает формат. А данные будут хранится в массивом записей по структуре. В цикле все перебрали. Если хоть одна совпала, то выход из массива с флагом что надо звонить. А если нет совпадений то просто выход без звонка. Простыня поменьше, да и вносить(убирать)записи проще.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

qwone пишет:

ulis пишет:

А что мы будем хранить в структуре?

Точнее структура задает формат. А данные будут хранится в массивом записей по структуре

Не хочу показаться назойливым, но что такое "массив записей по структуре"?

Glebiys
Offline
Зарегистрирован: 26.03.2017

Доброго времени суток! Спустя пару дней пришли к такому:

#include <Wire.h>
#include <DS3231.h>
 
int Rele = 7;
int Green = 5; //пин зеленый светодиод
int Blue = 9; //пин синий светодиод
int Red = 11; //пин красный светодиод
 
DS3231 Clock;
bool h12 = false;
bool PM;
bool Century;
 
void setup() {
 
Wire.begin();
pinMode(Rele, OUTPUT);
digitalWrite(Rele, HIGH);
pinMode(Green, OUTPUT);
pinMode(Blue, OUTPUT);
pinMode(Red, OUTPUT);
}
 
void loop() {
 
int second, minute, hour, day;
day = Clock.getDoW();
hour = Clock.getHour(h12, PM);
minute = Clock.getMinute();
second = Clock.getSecond();
digitalWrite(Green, HIGH);
 
if (day >= 1 && day <= 5 && hour == 8 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}
 
if (day >= 1 && day <= 5 && hour == 9 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}
 
 if (day >= 1 && day <= 5 && hour == 9 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 10 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 10 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 11 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 11 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 12 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 12 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 13 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 13 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 14 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 14 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 15 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 15 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 16 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 16 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 17 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 17 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 18 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 18 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day >= 1 && day <= 5 && hour == 19 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }
 
 if (day == 6 && hour == 8 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

Как быть теперь?

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

Glebiys пишет:

Доброго времени суток! Спустя пару дней пришли к такому:

Как быть теперь?

Не знаю. А как оно себя ведёт? Чё делает, чего не делает? Вы ж ничего не написали.

Glebiys
Offline
Зарегистрирован: 26.03.2017

У нас звонок не дома находится, а в школе появляться каждый день, к сожалению, возможности нет.

Как я понимаю:

day >= 1 && day <= 5

Сделает срабатывание именно в этом промежутке дней (1-5). Остальной код не меняли

 

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

Glebiys пишет:

У нас звонок не дома находится, а в школе появляться каждый день, к сожалению, возможности нет.

Как я понимаю:

day >= 1 && day <= 5

Сделает срабатывание именно в этом промежутке дней (1-5). Остальной код не меняли

По идее, да - это должно дать истину при day от 1 до 5 включительно.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

С точки зрения правильности написания оператора if - ошибок не вижу .... но интересно другое, вы собираетесь расписание звонков хранить как часть программного кода? А как быть, если расписание звонков в предпраздничные дни другое, или просто в честь 8-го марта уроки будут сокращены? Будете заново код переписывать? 

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

ulis пишет:

Будете заново код переписывать? 

Why not? Особенно, если это не бесплатно!

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

Парни - молодцы! Они не особо чего умеют, но не плачутся "подайте мне готовый код" (как многие здесь), а пытаются делать сами, исходя из тех знаний и умений, что у них есть. Я очень уважаю такую позицию. Давайте дадим ребятам возможность доделать, порадоваться успеху, почувствовать себы мужиками, которые могут решать проблемы. Потом, когда они доделают САМИ, мы вполне сможем подсказать им как сделать лучше. Но сейчас они близки к Победе (самостоятельной!) и я предлагаю не лишать их этой победы. Пусть доделают!

Если Вы заметили я ведь им ни строчки кода не дал, просто показывал как проверить некорректность условий. Именно для того, чтобы они дожали САМИ. Это для них сейчас важнее, чем сократить код или сделать удобным интерфейс смены расписания.

Glebiys
Offline
Зарегистрирован: 26.03.2017

Да, там будет храниться. По поводу праздиков/сокращенных дней - на ящике есть кнопка выключения ардуино и большая кнопка ручной подачи. В праздники просто выключаем микроконтроллер и подаем звонки в ручном режиме. Теперь осталось решить проблему ложных срабатываний. Через некоторое время работы, к примеру, происходит срабатывание по расписанию в 12:30 и буквально, минуты через 3-5 происходит повторное срабатывание, которое не забито в расписание. Дальше история продолжается. Если перезагрузить ардуинку (жмем кнопку на плате) - все работает нормально. Наблюдали два дня подряд - начинает ложно срабатывать где-то через 3 часа работы. Один день работало стабильно, потом такое появилось, по разному вылетает. У меня подозрение, что его память забивается, но я могу ошибаться.

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

Glebiys пишет:

У меня подозрение, что его память забивается, но я могу ошибаться.

Ничего там не забивается.

Как я понял с последними изменениями в условиях Вы ещё не испытывали? Испытайте и если проблема останется, то будем думать.

Glebiys
Offline
Зарегистрирован: 26.03.2017

Хорошо, мы завтра утром поставим и будем наблюдать. Спасибо большое, что здесь есть такие Люди! 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Glebiys пишет:

(жмем кнопку на плате) - все работает нормально. Наблюдали два дня подряд - начинает ложно срабатывать где-то через 3 часа работы. Один день работало стабильно, потом такое появилось, по разному вылетает. У меня подозрение, что его память забивается, но я могу ошибаться.

Подозрение, что просто помехи по питанию ...

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

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

Парни - молодцы! Они не особо чего умеют, но не плачутся "подайте мне готовый код"

:)

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

ulis пишет:

Подозрение, что просто помехи по питанию ...

Да, очень похоже.

ТС. Выложите пожалуйста схему, посмотрим что у Вас и как там. 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

а по субботам школа не учится?  или звонки подавать не обязательно после 8-30?

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

Доброго времени суток! Схему чуть позже выложит Леша. Сегодня залили скетч с новой логикой. Дни заработали! 

Огромное спасибо за подсказку! Настроение сразу в космос! Осталась одна проблема: ложные срабатывания так и не прекратились(((

Есть мысль сделать следующую вещь: Припаять к выходу ардуины ("reset") светодиод красного цвета(он уже установлен в ящике). И с помощю if спрашивать его сработало-ли реле? Если оно сработало чаще чем через 10 минут зажигать светодиод который замкнет цепь "reset" . Ардуино перезагрузится и продолжит работу.

Еще есть сомнения к блоку питания на выходе у которого: 5V и 550mA

P.S. Это только идея и сначало хотелось бы спросить ваше мнение (я про светодиод).

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

Не надо никаких костылей. Нужно просто выявить источник помехи и устранить.

Давайте схему, а пока её нет, можете попробовать полностью очистить loop - убрать из реё ВСЁ и запустить. Почти уверен, что ложные срабатывания будут. А это значит, что они вообще никак не связаны с программой, а только с внешней схемой.

Но схему подключния давайте обязательно.

И кстати, я не понял что значит "зажигать светодиод который замкнет цепь "reset"", ресет гораздо проще вызвать программно. Но Вам надо не это, а просто устранить источник помех.

Glebiys
Offline
Зарегистрирован: 26.03.2017

Чертим схемы. Вот фото устройства (маленькая коробка - микроконтроллер/RTC. Большая - Автоматы/Реле/Контактор/Блок питания Ардуино)

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Судя по снимкам, помехи могут быть даже из-за наводок от силовых кабелей. Я бы отнес ардуинку с первичным ключом (реле) подальше от силовой части

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

Фольга спасет от этих помех(если ей обклеить коробочку с ардуиной и часами)? И выдержит ли порт ардуино(GND) все что будет прилетать с фольги (в голову пришла идея обклеить внутри коробочку от ардуины фольгой после чего ее(фольгу) заземлить)

 

Насчет схемы приносим извинения сегодня не получиться меня уже спать гонят.  И кстати еще дополнение по поводу ложных срабатываний: Мы заметили что когда они появляются, то вся электроника работает в обычном режиме(при срабатывании реле, загорается синий светодиод, после чего проходят 8000мс(указано в скетче) выключается светодиод и реле. Раньше было подозрение на память и помехи в питании, но Евгений сказал, что это точно не память. Остается 2 варианта: 1)Помехи, 2)Что-то в коде...

Скетч:

#include <Wire.h>
#include <DS3231.h>

int Rele = 7;
int Green = 5; //пин зеленый светодиод
int Blue = 9; //пин синий светодиод
int Red = 11; //пин красный светодиод

DS3231 Clock;
bool h12 = false;
bool PM;
bool Century;

void setup() {

Wire.begin();
pinMode(Rele, OUTPUT);
digitalWrite(Rele, HIGH);
pinMode(Green, OUTPUT);
pinMode(Blue, OUTPUT);
pinMode(Red, OUTPUT);
}

void loop() {

int second, minute, hour, day;
day = Clock.getDoW();
hour = Clock.getHour(h12, PM);
minute = Clock.getMinute();
second = Clock.getSecond();
digitalWrite(Green, HIGH);

if (day >= 1 && day <= 5 && hour == 8 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}

if (day >= 1 && day <= 5 && hour == 9 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}

 if (day >= 1 && day <= 5 && hour == 9 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 10 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 10 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 11 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 11 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 12 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 12 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 13 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 13 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 14 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 14 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 15 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 15 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 16 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 16 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 17 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 17 && minute == 25 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 18 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 18 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day >= 1 && day <= 5 && hour == 19 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 if (day == 6 && hour == 8 && minute == 30 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 9 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 9 && minute == 50 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 10 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 10 && minute == 20 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 11 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }


  if (day == 6 && hour == 11 && minute == 15 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 00 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 10 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 12 && minute == 55 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 13 && minute == 05 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 13 && minute == 50 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 00 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 45 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 14 && minute == 55 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

  if (day == 6 && hour == 15 && minute == 40 && second == 00){
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
 }

 }
 

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Обклейка фольгой может помочь, но соединять ее нужно не с GND ардуины, а с защитной землей силовой части (не с рабочим нулем). Обычно это отдельная шина в шитке, к которому подсоеденены желто-зеленые провода

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

У нас нет 0 в силовой части, поэтому и возник вопрос: можно-ли землю на порт ардуино кинуть?

P.S. Вариантов заземления рядом с ящиком тоже нет.

 

Glebiys
Offline
Зарегистрирован: 26.03.2017

Еще. Блок питания выдает 5 вольт и 0.5 ампера. Насколько я знаю, при таком слабом питании возможна нестабильная работа. Если дело будет не в помехах, значит будем менять блок питания на более мощный

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

В каком именно параметре возможно потребуется большая мощность? И почему тогда она(ардуино)в самом начале нормально замыкает реле, но как только проходит 2-3 часа начинаются ложные срабатывания?

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Отвлеченный разговор, нужно посмотреть вашу схему. Например, как вы управляете реле?

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

Мужики, это пустая болтовня пока нет схемы.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

DanilRyzhov, оптопары всяко лучше чем фольга. Хотя, может они есть на плате реле, не видно. Яш надеюсь, в этом случае релейная плата имеет отдельное питание.

Куда идёт плюс БП, в обход стабилизатора (+5V) или же на вход стабилизатора (VIN, +9V, USB разъём)? Если второй случай то меняйте, даже лучший экземпляр сверхэкономного стаба, полвольта а схавает.

Конденсаторы по питанию. мкФ много не бывает, но 6800 достаточно. Дроссель по питанию. Чем индуктивнее, тем хуже проходят помехи, соответственно тоже лишним не бывает, но 470 мкГн достаточно.

Каковы характерные признаки ложных срабатываний? Если они хаотичные и никак от времени не зависят - да, можно это списать на флуктуации питания и то что ключ (транзисторы в выходах, соответственно включающие оптопары [если таковые имеются], соответственно открывающие транзисторы релейной платы, включающие реле) выхватывает наносекундные помехи, ему заворачивает крышу и как следствие реле срабатывает. Однозначно тут не скажешь, что оно пик и заткнётся, пилик и снова заткнётся. Транзисторы в этих условиях (нечёткий уровень) могут защёлкиваться, отщёлкиваться. Простой пример: соберите инвертор/буфер на старой КМОП-микросхеме (561й серии например), к нему транзистор, к транзитору светодиод, а ко входу - длинный (см 10) кусок оголонного провода - и увидите что буфер/инвертор срабатывает (транзистор открывается) не только когда лапать провод пальцем. Более того он ещё и некоторое время держится включенным, это потому что у провода есть некая ёмкость, а наводка сообщает этому "конденсатору" заряд, которому нужно время чтобы стечь. В общем, чётких критериев, позволяющих оценить природу помехи, без осциллографа, нет.

Простейший осциллограф - достаточно яркий (например белый) светодиод. На глаз можно заметить импульс длиной по крайней мере 30 нс.

Если же. Хоть какая-то. Хоть самая беспалевная периодичность, а тем более с интервалами из условий - это всё, это точно порча окружения программы. Цепляете экран, сериал, какой-то логгер на SD и тупо мониторите всё. У вас могут повредиться цифры 8 и 30 в условии про 8:30 утра, у вас могут сдвинуться цифры, которые выдают часы.

Вами не указано, как устройство ведёт себя в дальнейшем после возникновения т. н. "ложных срабатываний", тут в теме слишком мало информации о работе в этом режиме. Продолжаются ли звонки по графику? Продолжаются ли бессистемные рандомные звонки. Есть ли у них характерное распределение во времени. Просто подождите как заглючит и понаблюдайте. А то непонятно. В общем и целом суть вопроса: сохраняется ли подобие штатного режима работы (время, интервалы), или же он портится полностью. Соответственно и методы лечения.

Не найдёте - выясняете максимально возможное время бесперебойной работы (например 2 с половиной часа), запускаете WDT (сторожевой таймер), плюс добавляете условие, перезагуржающее установку через каждое время, которое меньше вдвое и на порядок, то есть 150 минут минус ноль, пополам, равно каждые 7 минут это презагружать. При этом надо вести журнал поданных звонков, например в EEPROM. Чтобы подать звонок если прошляпили пока перезагружалось. Иных способов - ну блин я не знаю котаны, реально магия какая-то. Монтаж у вас не Петровича который бутылку у сожительницы отжал, в программе - ну негде виснуть. Не должно оно тупить, прям совсем никак. А ТЕМ более ТАК.

Upd. Я так не могу, поэтому это полотно у меня переписано. Красиво, но ЕвгенийП просил сходу ответы не выкладывать, так что дам подумать. А пока начну с занудства типа кривых отступов и слова Rele. Никто не будет против если поменять его на Relay.

 

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

Вот часть связанная с ардуино. Чуть позже Леша добавит силовую часть ящика(схему).

SLKH
Offline
Зарегистрирован: 17.08.2015

Voodoo Doll пишет:

Куда идёт плюс БП, в обход стабилизатора (+5V) или же на вход стабилизатора (VIN, +9V, USB разъём)?

вроде бы на USB - не лучший вариант.

И что там реально БП выдает, мы не знаем.

 

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

До этого блока стоял блок на 6V и 300mA(Который питал через разъем для питания)

Ложные срабатывания были...

Может все дело в питании? Хотя какое-то время же он стабильно все замыкает и только потом начинаются ложные.

 

 

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

DanilRyzhov пишет:

До этого блока стоял блок на 6V и 300mA(Который питал через разъем для питания)

Ложные срабатывания были...

Может все дело в питании? Хотя какое-то время же он стабильно все замыкает и только потом начинаются ложные.

6 вольт мало, надо минимум 7.5

SLKH
Offline
Зарегистрирован: 17.08.2015

И всё же: что именно не так?

1. Система не включает звонок, когда он нужен

2. Система включает звонок, когда он не нужен, на 8 секунд

3. Система вовремя включает звонон, но не на 8 секунд

4. Система включает звонок, когда он не нужен, на время, не равное 8 секундам. Короткое/длинное?

5. После неправильного звонка следующие отрабатываются верно7

6. Что-то ещё

??

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Вопрос по первому рисунку: что это за реле такое? Это какой-то ардуиновский модуль? Можете показать его параметры или ссылку на него? Реле вы запитываете от самой ардуины а это есть не очень хорошо. Светодиоды включены не правильно. Для каждого из них нужен отдельный ограничивающий резистор. А сопротивление вашего резистора всего 1 Ом??? Оп-ля ... так у вас это лампы накаливания, а не светодиоды???? Схема включения светодиодов должна быть примерно такая:

О реле и питании самого ардуино поговорим позже ...

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Пссс ... номиналы R1-R3 указаны не верно, должно быть в пределах 240 - 620 Ом

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

Да, реле- это модуль ардуино.

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

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

DanilRyzhov пишет:
Да, реле- это модуль ардуино.

Так все-таки дайте ссылку на модуль реле

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

Модуль реле покупал Леша я не знаю его названия. Я ему написал, чтобы как только так сразу скинул ссылку.

А пока-что еще вопрос возник: можно ли ардуино уно дать 12V и 1250mA(Через круглый разъем для питания)?

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

DanilRyzhov пишет:

А пока-что еще вопрос возник: можно ли ардуино уно дать 12V и 1250mA(Через круглый разъем для питания)?

Ну, судя по описанию, можно - http://www.farnell.com/datasheets/1682209.pdf - я рекомендовал бы 9В. , чтобы не перегружать ардуиновкий стабилизатор

Модуль реле нужно включать по этой схеме:

bwn
Offline
Зарегистрирован: 25.08.2014

DanilRyzhov пишет:

А пока-что еще вопрос возник: можно ли ардуино уно дать 12V и 1250mA(Через круглый разъем для питания)?

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

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

//Попробуйте сменить алгоритм проверки например на такой. Скетч не проверял из за отсутствия DS

#include <Wire.h>
#include <DS3231.h>

int Rele = 7;
int Green = 5; //пин зеленый светодиод
int Blue = 9; //пин синий светодиод
int Red = 11; //пин красный светодиод
int second, minute, hour, day;

DS3231 Clock;
bool h12 = false;
bool PM;
bool Century;

void setup() {

  Wire.begin();
  pinMode(Rele, OUTPUT);
  digitalWrite(Rele, HIGH);
  pinMode(Green, OUTPUT);
  pinMode(Blue, OUTPUT);
  pinMode(Red, OUTPUT);
  digitalWrite(Green, HIGH);
}

void zvonok() {
  digitalWrite(Rele, LOW);
  digitalWrite(Blue, HIGH);
  delay(8000);
  digitalWrite(Blue, LOW);
  digitalWrite(Rele, HIGH);
}

void loop() {
  day = Clock.getDoW();
  hour = Clock.getHour(h12, PM);
  minute = Clock.getMinute();
  second = Clock.getSecond();
//Будем проверять в такой последовательности если секунды == 00.  Дальше минуты, и последними часы
// При такой логике Вы будете делать минимум проверок и ложных не должно быть. 
// можно и так как Вы только изменить немножко 
//if (second == 00 && day >= 1 && day <= 5 && minute == 30 &&hour == 8)


  if (second == 00) {
    if (day >= 1 && day <= 5) {

      if (minute == 05)
      {
        if (hour == 15)
        {
          zvonok();// отправляем в функцию звонка
        }
        else if (hour == 19)
        {
          zvonok();
        }
      }
      if (minute == 10)
      {
        if (hour == 10)
        {
          zvonok();
        }
        else if (hour == 11)
        {
          zvonok();
        }
        else if (hour == 14)
        {
          zvonok();
        }
        else if (hour == 16)
        {
          zvonok();
        }
        else if (hour == 18)
        {
          zvonok();
        }
      }
      if (minute == 15)
      {
        if (hour == 9)
        {
          zvonok();
        }
        else if (hour == 12)
        {
          zvonok();
        }
        else if (hour == 13)
        {
          zvonok();
        }
        else if (hour == 17)
        {
          zvonok();
        }
      }
      if (minute == 20)
      {
        if (hour == 14)
        {
          zvonok();
        }
        else if (hour == 18)
        {
          zvonok();
        }
       } 
        if (minute == 25)
      {
        if (hour == 9)
          {
            zvonok();
          }
          else if (hour == 10)
          {
            zvonok();
          }
          else if (hour == 11)
          {
            zvonok();
          }
          else if (hour == 13)
          {
            zvonok();
          }
          else if (hour == 15)
          {
            zvonok();
          }
          else if (hour == 17)
          {
            zvonok();
          }
        }

        if (minute == 30)
      {
        if (hour == 8)
          {
            zvonok();
          }
          else if (hour == 11)
          {
            zvonok();
          }
          else if (hour == 12)
          {
            zvonok();
          }
          else if (hour == 16)
          {
            zvonok();
          }
        }
      
    }
    if (day == 6) {
      if (minute == 00)
      {
        if (hour == 12)
        {
          zvonok();
        }
        else if (hour == 14)
        {
          zvonok();
        }
      }

      if (minute == 05)
      {
        if (hour == 11)
        {
          zvonok();
        }
        else if (hour == 13)
        {
          zvonok();
        }
      }

      if (minute == 10)
      {
        if (hour == 10)
        {
          zvonok();
        }
        else if (hour == 12)
        {
          zvonok();
        }
      }

      if (minute == 15)
      {
        if (hour == 9)
        {
          zvonok();
        }
        else if (hour == 11)
        {
          zvonok();
        }
      }
      if (minute == 20)
      {
        if (hour == 10)
        {
          zvonok();
        }
      }

      if (minute == 30)
      {
        if (hour == 8)
        {
          zvonok();
        }
      }

      if (minute == 40)
      {
        if (hour == 15)
        {
          zvonok();
        }
      }

      if (minute == 45)
      {
        if (hour == 15)
        {
          zvonok();
        }
        else if (hour == 19)
        {
          zvonok();
        }
      }

      if (minute == 50)
      {
        if (hour == 9)
        {
          zvonok();
        }
        else if (hour == 13)
        {
          zvonok();
        }
      }

      if (minute == 55)
      {
        if (hour == 12)
        {
          zvonok();
        }
        else if (hour == 14)
        {
          zvonok();
        }
      }

    }
  }
}

 

DanilRyzhov
Offline
Зарегистрирован: 26.03.2017

Прочитали на сайтах про питание ардуино, что при низком напряжении она может работать не стабильно, а у нас сейчас стоит блок питания выдающй 5V, хотя идеал: 9V. Мы решили провести эксперимент с ардуиной и дать ей не 5v, а 9(хотел попробовать через крону т.к. нет под рукой блока питания с таким напряжением, но крона очень быстро теряет свое напряжение, как только ее подключаешь к ардуине(просто ардуине, без светодиодов, реле, часов и т.д.) в итоге нашелся только блок питания на 12V и 1250mA. Пробовал подключать к своей ардуине, цепи питания не нагреваются(что в ящике, что у меня абсолютно одинаковые платы) в связи с этим хочу попробовать подсоединить этот блок питания( 12V который)  к ящику на один день и посмотреть будут ложные срабатывания.

Стоит ли тратить на это время и могут ли начаться ложные срабатывания из-за недостатка питания?

P.S. Если в этом есть смысл и проблема решиться, тогда пойдем в магазин, и купим 9V блок питания с силой тока в 1A.