Как Blink встроить в таймер

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Подскажите, пожалуйста, знатоки как встроить цикл Blink в таймер. Нужно чтобы Blink начинал работать утром и заканчивал вечером. Что нужно добавить к этому коду. Можно пристроить любые часы реального времени или как-то по-другому? Возможно такой или похожий код подскажете... 

void setup() {
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, HIGH);  
  delay(1000);              
  digitalWrite(13, LOW);    
  delay(500);              
  digitalWrite(13, HIGH);   
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(1500);             
  digitalWrite(13, HIGH);  
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(30000);          
}

 

negavoid
Offline
Зарегистрирован: 09.07.2016
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  clocks.getTime();                                        // вот эти две строки - как бы псевдокод, у всех часов они свои, разные
  if ( ( clocks.hour >= 10 ) && ( clocks.hour <= 18 ) )    // разберитесь с библиотекой часов и впишите нужные, это только демонстрация принципа
  {

  digitalWrite(13, HIGH);  
  delay(1000);              
  digitalWrite(13, LOW);    
  delay(500);              
  digitalWrite(13, HIGH);   
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(1500);             
  digitalWrite(13, HIGH);  
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(30000);          

  }
  else
  {
     // pochtalion.say( 'мужчина, вы что, не видите, у нас обед!' );
  }

}

 

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Спасибо. Буду пробовать додумать.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Думаю примерно так...

#include "RTClib.h"

RTC_DS1307 RTC;

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
DateTime now = RTC.now();
if  ( (now.hour() >= 5 ) && ( (now.hour() <= 21 ))


  {

  digitalWrite(13, HIGH);  
  delay(1000);              
  digitalWrite(13, LOW);    
  delay(500);              
  digitalWrite(13, HIGH);   
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(1500);             
  digitalWrite(13, HIGH);  
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(30000);          

  }
  else
  {
     // pochtalion.say( 'Это будущая система ПВО' );
  }

}

 

negavoid
Offline
Зарегистрирован: 09.07.2016

Да, навскидку верно. И ещё надо будет один раз задать отдельным скетчем время в RTC, а потом уже смело можно его читать вашим скетчем.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Да, понял сейчас допишу и буду собирать, пробовать...

Не прошло

Ошибка

expected ')' before '{' token

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

Начт, надо ) перед { постаить в if. И поплывет.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Куда только не тыкал эту скобку...! Спасибо. Но весь скетч не работает. Наверное часы прога не видит. Конструкцию if - else убираю, тогда работает блинк. Наверное часы надо сюда прикрутить. Часы отдельно работают, в своем скетче.

// Рабочие часы с выводом на монитор порта
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// строка ниже используется для настройки даты и времени часов
// RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
 
void loop () {

DateTime now = RTC.now();
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(3000);
}

 

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Код работает и выдает время на монитор. Только вторая часть (Blink) не работает, стоит High. 

// Рабочие часы с выводом на монитор порта
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// строка ниже используется для настройки даты и времени часов
// RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
 
void loop () {

//************* Часы  *************
DateTime now = RTC.now();
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();

//************* BlinK ***********************
if  ( (now.hour() >= 5 ) && ( (now.hour() <= 21 )))  

digitalWrite(13, HIGH);  
  delay(1000);              
  digitalWrite(13, LOW);    
  delay(500);              
  digitalWrite(13, HIGH);   
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(1500);             
  digitalWrite(13, HIGH);  
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(30000);          

{
  return;
}}

 

JasKo
Offline
Зарегистрирован: 21.11.2015

Попробуйте так

// Рабочие часы с выводом на монитор порта
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // строка ниже используется для настройки даты и времени часов
    // RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {

  //************* Часы  *************
  DateTime now = RTC.now();
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  //************* BlinK ***********************
  if  ( (now.hour() >= 5 ) && ( (now.hour() <= 21 ))) {
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
    delay(500);
    digitalWrite(13, HIGH);
    delay(2000);
    digitalWrite(13, LOW);
    delay(1500);
    digitalWrite(13, HIGH);
    delay(2000);
    digitalWrite(13, LOW);
    delay(30000);
  }
}

 

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Так еще хуже. Часы тоже не рабо

Все перезагрузил снова залил предложеный вариант. Заработало также как мой вариант: часы работают, а blink - нет

nik182
Offline
Зарегистрирован: 04.05.2015

А как же blink without delay? http://arduino.ru/tutorials/BlinkWithoutDelay 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

nik182 пишет:

А как же blink without delay? http://arduino.ru/tutorials/BlinkWithoutDelay 

я запретил.

отныне - так:

digitalWrite(13, (millis() / 1024) & 1);

 

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

blink without delay конечно хорошо, но эти delay разные... Эта страница не существует?  http://arduino.ru/tutorials/BlinkWithoutDelay 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

braslav пишет:

Эта страница не существует? 

Существует. Пробел в конце адреса уберите.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

millis - это когда одинаковые промежутки, наверное, а мне надо все время разные. Видимо еще и массивы понадобятся. Я в программировании полный ноль, все это будет не по зубам.

Да еще напишу для чего проектируется моя ПВО. Это отпугиватель скворцов от черешни и вишни. Шуршащий звук выдается в две очереди. Первый короткий для привлечения внимания птицы, а второй подлиннее отпугнет. Промежутки между очередями тоже разные, чтобы не выглядело примитивным циклом. Сейчас у меня работает один отпугиватель, но он громоздкий и на двух приборах: недельный таймер выдает время работы, чтобы ночью не крутить, а очередь выдается другим прибором... Хочется заменить все это маленьким устройством на "ардуино про мини", часах 1307 или подобных и блоке реле, исполнительное устройсво уже сделано и работает хорошо на моторчике от детской игрушки.

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

#include "RTClib.h"
//-------------Cl_tik_tak-----------------
const int Map[] = {1000, 500, 2000, 1500, 2000, 3000};
const byte num = 6;
class Cl_tik_tak {
    byte takt;
    byte pin;
    bool led;
    uint32_t past;
  public:
    Cl_tik_tak(byte _pin): pin(_pin) {}
    void setup() {
      pinMode(pin, OUTPUT);
      takt = 0;
      past = millis();
      digitalWrite(pin, led = 0);
    }
    void loop() {
      if (millis() - past > Map[takt]) {
        past = millis();
        digitalWrite(pin, led = !led);
        ++takt;
        if (takt >= num) takt = 0;
      }
    }
};
//-------------компоновка-----------------
RTC_DS1307 RTC;
Cl_tik_tak Tak(/*нога*/13);
//--------------main---------------------
void setup() {
  Tak.setup();
}

void loop() {
  DateTime now = RTC.now();
  if  ( (now.hour() >= 5 ) && ( (now.hour() <= 21 ))  Tak.loop();
}

ПС: Бедные скворцы , всю черешню теперь будет есть ...Ардуина.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Спасибо, qwone, код крутой. Но пока скворцам ничего не грозит. Скетч попросил еще одну скобку [if  ( (now.hour() >= 5 ) && ( (now.hour() <= 21 )))  Tak.loop();], после добавления залился, но не подает признаков жизни, а поскольку код для меня сложноватый... Может я не к тем входам-выходам цепляюсь?

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

Ну вот создал тему. Может так станет проще понимать. http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Попробовал мигание из новой темы - работает. Выход на 13 ногу. А в моем случае не работает на 13 ноге. Часы на монитор тоже не работают. 

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

переставьте на другую ногу. 13 пин вроде используется при обмене данных Ардуино с часами.

ПС: просто поменяйте цифру на свободную ногу

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Поменял на 12 - не работает.

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

Посмотрите так

// Рабочие часы с выводом на монитор порта
#include <Wire.h>
#include "RTClib.h"
const int Map[] = {1000, 500, 2000, 1500, 2000, 3000};
int t_map = 0;
uint32_t time;
int temp_time = Map[t_map];
bool signal = 1;
//RTC_DS1307 RTC;
void setup () {
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // строка ниже используется для настройки даты и времени часов
    // RTC.adjust(DateTime(__DATE__, __TIME__));
  }


  void loop () {

    //************* Часы  *************
    DateTime now = RTC.now();
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    //************* BlinK ***********************
    if  ( (now.hour() >= 5 ) && ( (now.hour() <= 21 ))) {
      if (millis() - time >= temp_time) {
        time = millis();
        digitalWrite(13, signal = !signal);
        t_map ++;
        if (t_map > 5)t_map = 0;
        temp_time = Map[t_map];
      }
    }
  }

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

1. Нарисуйте или, если не умеете рисавать, подробно пишите схему подключений. В виде: контакт такой-то на этакой плате соединен проводом с котактом №666 на плате вот-этой-вот.

2. какая версия ИДЕ на кокой платформе (Винда 7, Линух, что-то-еще) используется для програмирования.

3. какая Ардуина и какой модуль часов?

4. Сфотографируйте все это хозяйство, чтобы были видны подключения. Отмазки - не принимаются ;), фото есть в любом телефоне.

5. Запустите примеры блинк и тест модуля часов из примеров библиотек. Если на этом месте непонятно, то в следующем этапе сделаем.

====================

Коллеги! Прошу не вмешиваться с советами. Если не затруднит - не путайте новичка. Ни классами, ни умничаньем. Мы спокойно решим его задачу так, что он сам потом сможет решать подобные.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017
Интересный вариант. Спасибо за заботу.
 
Данные:
Материнка Arduino UNO
ИДЕ 1.6.7 на Винда 7
Часы "RTC 1307" подключены стандартно: питание +5 и Gnd. SDA на А4, SCL на А5. Из примеров работает.
Влинк - Пин 13 на плате Arduino UNO. С него будем брать HIGH и LOW на блок реле. Из примера работает.
Ничего лишнего. Нужен только сигнал на пине 13 или на другом
 
Если запускаю блинк то все работает: реле срабатывает, моторчик крутится, шумит. Только не нужно крутить и шуметь ночью, для этого нужен таймер.
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ок. сейчас мне отъехать нужно. скажите, какая библиотека для RTC? чтобы я мог давать вам наводки и примеры точно по вашему софту и железу.

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

digitalWrite(13, HIGH);  
  delay(1000);              
  digitalWrite(13, LOW);    
  delay(500);              
  digitalWrite(13, HIGH);   
  delay(2000);             
  digitalWrite(13, LOW);   
  delay(1500);             
  digitalWrite(13, HIGH);  
  delay(2000);             
  digitalWrite(13, LOW);   

таким образом у системы есть 6 состояний:

1. ожидание включения.

2. включение1

3. пауза1

4. включение2

5. пауза2

6. включение3.

--------------------

так?

У всех состояний фиксирована длительность, кроме ожидания - оно длится бесконечно, до включения так? или что-то нужно добавить?

В эту схему состоний впишем таймер, который может командовать системой: "включить", "выключить", так или еще что-то?

---------------------

Когда ответите - продолжим, пока нам сам контроллер не нужен. Сперва програмируем голову, а потом уже "бездушное железо". ;) ;) ;)

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

1. ожидание включения от вечера (21 час) до утра (4 часа) это работа таймера.

Далее работа БЛИНКа, который будет давать сигнал HIGH на реле включающего моторчик весь день.

2. включение1 - длительность 0.5 sec

3. пауза1 1 sec

4. включение2 - длительность 2 sec

5. пауза2 10 sec

6. включение3 - длительность  1 sec

7. пауза 1sec

8. включение4 - длительность 0.5 sec

9. пауза1 1 sec

10. включение5 - длительность 2 sec

... и БЛИНК с начала, цикл повторяется от пункта 2 до пункта 10 до конца дня (до 21 часа)

В 21 час таймер выключает БЛИНК и ожидает утро....

Завтра сниму и опубликую кино-ролик о работе устройства которое сейчас трудится, и не первый год.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ОК!

Вечер - у меня время самогончика... так что завтра продолжим, с Б..жей помощью.

Для уточнения: Блинком вы называете всю эту конструкцию включений отпугивателя?

======================

Да! И вы не уточнили библиотеку часов, их легион на просторах сети, какая у вас?

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Да, БЛИНК это конструкция включений отпугивателя. 

Библиотека DS1307 такая:

/*
  DS1307.h - Arduino library support for the DS1307 I2C Real-Time Clock
  Copyright (C)2010 Henning Karlsen. All right reserved
  
  You can find the latest version of the library at 
  http://www.henningkarlsen.com/electronics

  This library has been made to easily interface and use the DS1307 RTC with
  the Arduino without needing the Wire library.

  If you make any modifications or improvements to the code, I would appreciate
  that you share the code with me so that I might include it in the next release.
  I can be contacted through http://www.henningkarlsen.com/electronics/contact.php

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
#ifndef DS1307_h
#define DS1307_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "Arduino.h"
#else
	#include "WProgram.h"
#endif

#define DS1307_ADDR_R	209
#define DS1307_ADDR_W	208

#define FORMAT_SHORT	1
#define FORMAT_LONG		2

#define FORMAT_LITTLEENDIAN	1
#define FORMAT_BIGENDIAN	2
#define FORMAT_MIDDLEENDIAN	3

#define MONDAY		1
#define TUESDAY		2
#define WEDNESDAY	3
#define THURSDAY	4
#define FRIDAY		5
#define SATURDAY	6
#define SUNDAY		7

#define SQW_RATE_1		0
#define SQW_RATE_4K		1
#define SQW_RATE_8K		2
#define SQW_RATE_32K	3

class Time
{
public:
	uint8_t		hour;
	uint8_t		min;
	uint8_t		sec;
	uint8_t		date;
	uint8_t		mon;
	uint16_t	year;
	uint8_t		dow;

		Time();
};

class DS1307_RAM
{
public:
	byte	cell[56];

		DS1307_RAM();
};

class DS1307
{
public:
		DS1307(uint8_t data_pin, uint8_t sclk_pin);
	Time	getTime();
	void	setTime(uint8_t hour, uint8_t min, uint8_t sec);
	void	setDate(uint8_t date, uint8_t mon, uint16_t year);
	void	setDOW(uint8_t dow);

	char	*getTimeStr(uint8_t format=FORMAT_LONG);
	char	*getDateStr(uint8_t slformat=FORMAT_LONG, uint8_t eformat=FORMAT_LITTLEENDIAN, char divider='.');
	char	*getDOWStr(uint8_t format=FORMAT_LONG);
	char	*getMonthStr(uint8_t format=FORMAT_LONG);

	void	halt(bool value);
	void	setOutput(bool enable);
	void	enableSQW(bool enable);
	void	setSQWRate(int rate);

	void		writeBuffer(DS1307_RAM r);
	DS1307_RAM	readBuffer();
	void		poke(uint8_t addr, uint8_t value);
	uint8_t		peek(uint8_t addr);

private:
	uint8_t _scl_pin;
	uint8_t _sda_pin;
	uint8_t _burstArray[8];

	void	_sendStart(byte addr);
	void	_sendStop();
	void	_sendAck();
	void	_sendNack();
	void	_waitForAck();
	uint8_t	_readByte();
	void	_writeByte(uint8_t value);
	void	_burstRead();
	uint8_t	_readRegister(uint8_t reg);
	void 	_writeRegister(uint8_t reg, uint8_t value);
	uint8_t	_decode(uint8_t value);
	uint8_t	_decodeH(uint8_t value);
	uint8_t	_decodeY(uint8_t value);
	uint8_t	_encode(uint8_t vaule);
};
#endif

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Доброе утро! В первопрестольной дождь... даже с псами гулять не пошел...

С экраном - очень хорошо. Погоняйте примеры. Потом втроим экран. Через час, примерно, продолжим.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Сейчас времени нет. Тестя надо с рынка привести.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

Итак:

1. ожидание.

2. включение1 - длительность 0.5 sec

3. пауза1 1 sec

4. включение2 - длительность 2 sec

5. пауза2 10 sec

6. включение3 - длительность  1 sec

7. пауза3 1sec

8. включение4 - длительность 0.5 sec

9. пауза4 1 sec

10. включение5 - длительность 2 sec

11. пауза5 - длительность 30 сек.; переход к 1.

============================================

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

Сигналом в состоянии ожидания, для перехода в состояние 1, является сингал часов(время > 04-00): назовем его СТАРТ.

В состоянии 11 мы проверяем наличие сигнала СТОП (время >  21-00);

в остальных состояниях сигналом перехода на ледующее является истечение длительности, как кухонный ТАЙМЕР.

============================================

Теперь важный момент(Sic!!!!) Понимаете ли вы, как работает loop()? Ясно ли, что вызов лууп зациклен? Что после завершения команд лууп, он вызывается снова и снова?

Дальше читаем только если понятно написанное.

==========================================

Теперь нужно понять, что, если лууп проходится быстро, нигде не задерживаясь на delay(), то есть возможность реагировать на любые события.

Увидел событие (СИГНАЛ), переключил состояние, взвел нужный ТАЙМЕР, сформировал уровни на выходных пинах, в соответствие с состоянием и снова готов ожидать новых событий.

==========================================

Таким образом мы уже готовы описать нашу программу на русском языке.

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

Буду писать курсивом, по строкам.

1. Прочитать текущее время от часов.

2. Прочитать текущее значение внутреннего счетчика миллисекунд.

3. Отобразить время на экране (этот момент мы потом уточним).

4. сравнить время часов с "утро" и "вечер", если нужно включить сигнал СТАРТ или СТОП.

5. сравнить текущее значение миллисекунд с взведенным таймером (если взведен), если время пребывания в соответствующем СОСТОЯНИИ прошло - включить сигнал ТАЙМЕР.

6. ПЕРЕКЛЮЧАТЕЛЬ ДЕЙСТВИЙ, в зависимости от текущего СОСТОЯНИЯ:

   состояние 1: если СИГНАЛ - СТАРТ - перейти в 2+взводим таймер(*)+включаем пин реле, иначе - сохраняем состояние 1.

   состояние 2: если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 2.

    состояние 3:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+включаем пин реле, иначе - сохраняем состояние 3.

     состояние 4: если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 4.

     состояние 5:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+включаем пин реле, иначе - сохраняем состояние 5.

     состояние 6:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 6.

     состояние 7: если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+включаем пин реле, иначе - сохраняем состояние 7.

     состояние 8:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 8.

     состояние 9:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+включаем пин реле, иначе - сохраняем состояние 9.

     состояние 10:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 10

     состояние 11:  если СИГНАЛ ТАЙМЕР - перейти в 2+взводим таймер+включаем пин реле, иначе -

                                  если СИГНАЛ СТОП - переходим в состояние 1, иначе - сохраняем состояние 11.

=========================================

(*)Для коллег - пока ничего не оптимизируем, для лучшего понимания.

Теперь мяч на вашей стороне. как разберетесь или не разберетесь - пишите.

 
braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Сегодня день пропащий. Подключил часы , подключил OLED дисплей, пристроил скетч и часы заработали на дисплей. Все шло хорошо. А потом дисплей OLED128x64 перестал работать. И все...

Достал из коробки другой LCD 1602 и до конца дня пытался его запустить, не запустил....

А так хорошо все начиналось...

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

Ролик на мою ПВО которая теперь работает (защита 100%) https://youtu.be/6PdQHkz1K9U

Ролик с упралением (суточный таймер, прибор отработки цакла 3сек через 25сек пауза) https://youtu.be/9D9g1PWywqM

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Поскольку мои средства вывода (OLED, LCD) ничего не показывают, наверное порты А4, А5 на плате ушли!

Вопрос чайника знатокам:

1. Как проверить порты?

2. Можно ли задать другие порты, для работы кода, и как?

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1. проверить тестером или светодиодом, используя, как цифровые, с именами A4 и A5.

2. есть програмный I2C, но вам сдишком сложно будет его использовать. сперва проверьте порты.

Хорошо, если есть осцилограф или логанализатор. Тестером только ножки проверим, а не работу I2C.

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

braslav пишет:

Спасибо, qwone, код крутой. Но пока скворцам ничего не грозит. Скетч попросил еще одну скобку [if  ( (now.hour() >= 5 ) && ( (now.hour() <= 21 )))  Tak.loop();], после добавления залился, но не подает признаков жизни, а поскольку код для меня сложноватый... Может я не к тем входам-выходам цепляюсь?

now.hour()

Зачем здесь круглые скобки??? Вроде так должно быть:

if  ( (now.hour >= 5 ) && (now.hour <= 21) ) {
  . . .
}

 

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

И все-таки скобки нужны 

IDE выдает ошибку: invalid use of member function (did you forget the '()' ?)

negavoid
Offline
Зарегистрирован: 09.07.2016

Скобки у now.hour() обязательны, потому что в данном случае hour это не публичное свойство класса часовой библиотеки, а функция-геттер, мы вызываем функцию, а не просто считываем свойство.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Порты работают, а вот дисплеи не работают. Один поработал немного и ... Сдох, другой вообще не заработал. Часы реального времени есть RTC1307, 1302, 3132 - все трое работают.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Если часы работают, то значит все с I2C нормально. С чем вас и поздравляю!

Давайте разбираться с дисплеями. Начнем с 1602, он проще.

1. сфотографируйте его нижнюю сторону, откуда провода идут, крупным планом.

2. Кто паял модуль I2С, вы, самостоятельно, или так купили?

С этого начнем.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

 С проводами у 1602 все в порядке. Она у меня с адаптером, проводов всего 4. Хотя распаять наверное надо, определить кто виноват адаптер и сама 1602.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

про пайку: я имел ввиду - кто припаивал I2C модуль (черный) к дисплею? Я уже понял, что не вы.

1.напишите по цветам - как вы подключаете дисплей.

2. надеюсь, что правильно, тогда покрутите отверткой потенциометр (синий). должна меняться яркость. Правильно - если первая строка заполнена квадратиками.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Я сам припаивал. Можете поверить пайка идеальная. Я всю жизнь паяю.

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

Подключился напрямую к дисплею. Квадратики светятся, потенциометром меняется контраст, пример залит "Hello, World" , но ничего не выводится.

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

1- LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 или 0x3F

lcd.begin(); или lcd.init();

3 библиотеки  LiquidCrystal_I2C  одинаковые по названию и разные по содержанию.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

И как определить какой вариант нужен? Завтра и это проверю.

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

braslav пишет:

И как определить какой вариант нужен? Завтра и это проверю.

Посмотрите в примере из библиотеки.
Если решили подключить дисплей напрямую, без I2C модуля, используемая сейчас библиотека работать не будет (она только для I2C). 
Корректность подключения по I2C проверьте "I2C сканером". В случае с часами 1307 и LCD1602 должно быть что то вроде: 0x68 (это часы), 0х?? (на модуле часов часто память распаяна, адрес не помню) и 0х27/0х3F (это PCF8574 в модуле I2C для LCD). Последние значения наиболее часто встречающиеся, но могут быть иные (PCF позволяет менять адреса).

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Подключение через I2C 

Проверил сканером LCD: 0х38 

Проверил сканером часы: 0х68 

И где это должно соотвествовать?

 

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

 LiquidCrystal_I2C lcd(0x38, 16, 2); // 0x27 или 0x3F
Если подключали LCD отдельно от RTC, то так.

UPD: если подключали модули с фотографии на DS1307 или DS3231, кроме 0х68 должен был определитиься еще один адрес, от EEPROM на борту, Вы его почему то не указываете. Третьего модуля у меня не было, там не знаю.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Спасибо. С вами пошло как-то веселей. Уже есть результат: по одной букве в каждой строке

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

Посмотрите по форуму, обсуждалась такая проблема, сам не сталкивался, не помню как лечится.