Проект ИН-12

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Всем привет!!! Наконец то доделал свои часы на газоразрядных индикаторах
Что он умеют
1) Часы
2) Календарь
3) Будильник
4) 2 датчика температуры
5) Отключаемый звук нажатия клавиши
6) 4 варианта показа даты
-стандартный
-стандартный + пробег по всем цифрам
-обратный ход
- обратный ход + пробег по всем цифрам
+ вместо стандартных кнопок решил смастерить сенсорные


 

 

chugun
Offline
Зарегистрирован: 01.07.2011

Молодчик !!! Чётко выглядит !!!
А что за пробег по цифрам, на словах поясните, пжл ???

Zapek@n
Offline
Зарегистрирован: 16.02.2012

 Отлично выглядят! Схему и управляющий код в целях повышения образованности начинающих не опубликуете?

polk
Offline
Зарегистрирован: 13.03.2011

 Смотрится классно. Фотки качественные. 
Я вообще думал, что такие индикаторы уже не производятся.

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Индикаторы можно купить в магазинах. Только надо знать в каких. Схемы нет так как я сразу печатку делал из нескольких схем. ВСЁ ОТСЮДА.
Пробег по цифрам есть видео (не моё) на ссылке.

А вкратце. Когда число увеличивается на +1 то запускается алгоритм который за 1/10 (к примеру) секунды пробегает все цифры а потом загорает нужную.

Демонстрация эффекта
 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 Чтобы лишние фото не плодить. Опишу словами.
В часах используются 3 сенсорные кнопки. Центральная (с верху), левая и правая (обе сзади). Скажу сразу у меня разделительные точки не моргают.

При старте часов выводится время (12:25:46). Нолик из часов убрал (_2:25:46) (сделал нижний пробел чтобы было видно что разряд не горит)

Нажимаем на центральную кнопку. Выводится дата (27.03.12)

Нажимаем на центральную кнопку. Выводится будильник (_0•00•00). Когда в будильнике часы и минуты установлено как 0 то это значит что будильник выключен. Любое другое значение в часах и минутах говорит о том что будильник включён. Если в секундах стоит 0 то это значит что включён сигнал нажатия кнопок. Если установить любое другое значения в секунды то сигнала не будет.

Установка. Переходим в ту позицию (время, дата или будильник) в которой хотим исправить или установить значения. Пример на времени. Зажимаем левую кнопку и нажимаем на центральную. Часы переходят в режим настройки(12:__:__) (левую кнопку отпускаем). Кнопками лево(-) и право(+) устанавливаем часы. Нажимаем на центральную (__:36:__). Проводим аналогичные действия. Также и с секундами. После того как установили секунды снова нажимаем на центральную кнопку и часы переходят в обычный режим.

Смена стиля отображения времени осуществляется путём зажимания левой кнопки и нажатием на правую. Выбор стиля осуществляется методом их перебора. Когда стили заканчиваются то часы возвращаются в стандартный режим. Выбор стиля сохраняется. Если часы выключить и включить то выбранный стиль будет работать.

Температура. Она выводится нажатием правой кнопки. (_1:25•__). 1-это номер датчика, двоеточие, показания температуры, и в зависимости если + то верхняя точка, если минус то нижняя (0 является +). Ещё раз нажимаем на правую кнопку то выводится показания второго датчика (_2:25•__). Ещё раз нажимаем на правую кнопку то переходим к первому датчику. (правая кнопка зациклена между двумя датчиками). Чтобы опять вернуться на часы то нажимаем на центральную кнопку. В принципе можно на секунды поставить сотые доли градуса (код это позволяет). Но я не стал этим заморачиваться так как всё равно интересует только само количество градусов.

Уф вроде всё))))))

часы

термометр

Tin-Tinych
Offline
Зарегистрирован: 16.09.2011

Не часы... Мечта! :-)

Xoon
Offline
Зарегистрирован: 02.04.2012

 Здорово! Часики почти как в фаллауте )

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 В фаллаут не играл. Так что не знаю))

4ishops
Offline
Зарегистрирован: 06.10.2012

 здесь http://www.arduinix.com/ есть готовый shield, проект открытый

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Мда. "Ностальджи" однако :) Первая  моя схема с цифрами была на таких. Если мне склероз не изменяет, управлялось К155ИД1.

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

И управляется по-прежнему!!! Аналога пока нет. 

msng
Offline
Зарегистрирован: 07.06.2012

Уважаемый LEVV2006, где то читал, что при динамической индикации ресурс ИН-12, два года, в этом проекте вроде как динамическая индикация, правда или миф (про 2 года) ?

лежат тоже индикаторы и дешифраторы вот не знаю стоит ли делать? а сделаешь на два года...

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

Тоже слышал про 2 года)))). Но также читал что у одного чела часы уже как 5 лет работают и всё нормально. Там получается так что у цифр которые не загораются происходит отравление катода и цифра перестаёт гореть. Чтобы этого избежать нужно написать подпрограмму которая бы каждый день пробегала по всем цифрам в часах. Тогда можно «замедлить» процесс отравления. Хотя в «специально» для часов этого я бы не делал. Так как в старшем разряде часа используется только 1 и 2.

Кроме того дам вам совет. ОБЯЗАТЕЛЬНО используйте панельку для лампы!!! С панелькам у вас больше не будут возникать вопросов по 2 года. Испортилась выкинул и купил новую.

Что касательно меня. я свои часы не включаю))))) просто так получилось. ))))стоят на полке и радуют глаз)))

msng
Offline
Зарегистрирован: 07.06.2012

думаю может сделать "статическую" индикацию с 4-мя дешифраторами...

вот кумекаю как же вывод сделать с одного контроллера на столько ног....

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

Так постав регистры друг за другом!

msng
Offline
Зарегистрирован: 07.06.2012

да вроде щас посчитал, должно сойтись, десятки часов 2 вывода,  единицы часов 4 вывода, десятки минут 3 вывода, единицы минут - 4 вывода, 13 цифровых задействованы, 1 для подключения ИК датчика для управления. на i2c повесить часы. будильник не нужен.

вроде все получается. вот только сомневаюсь на счет использования выводов RX TX можно ли их использовать? выводы D0 и D1.

PS да думаю можно, у меня как то была проблема. наверное связанно с тем что с порта чтото читал/отправлял и на RX ТХ (D0 D1) чтото вешал...

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

На  порты RX TX ничего вешать нельзя!!!! Лучше используйте не задействованные аналоговые порты как цифровые.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

На tx и dx вешать можно, если они будут использованы как выходы и на них не будут висеть нагрузки, больше чем TTL-входы. Но я бы их все равно в последнюю очередь, иначе диагностические сообщения посылать - никак. Если Леонардо - то без проблем.

msng
Offline
Зарегистрирован: 07.06.2012

LEVV2006 пишет:

Лучше используйте не задействованные аналоговые порты как цифровые.

ух ты не знал что так можно сделать... погуглю...

 

AlexFisher пишет:

Но я бы их все равно в последнюю очередь, иначе диагностические сообщения посылать - никак. Если Леонардо - то без проблем.

выводы с этими придется использовать все 14 цифровых, сообщения посылать не надо. отлаживать буду на UNO, потом перенесу на печатку контроллер с обвязкой.

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

А отлаживать в UNO без COM-порта как?

Аналоговые в качестве цифровых использовать просто: pinMode(A0, OUTPUT);

Нужно использовать именно такое имя порта, в "цифру" компилятор переведет сам - и будет работать на любом контроллере.

msng
Offline
Зарегистрирован: 07.06.2012

ну да, отлаживать без ком порта, запуситить RTC, а там логика 0 да 1 все понятно... ну если аналоговые можно использовать как цифровые выходы, тогда все воросы отпадают, буду делать...

sting_18
Offline
Зарегистрирован: 09.07.2015
Привет всем радиолюбителям.
Вот решился собрать тоже часы на газоразрядных индикаторах ИН-12Б.
Прошивку решил свою написать на Arduino Uno. Часы реального времени использую DS1307.
Столкнулся с проблемой, что нигде ни описано, подстройка часов. Всё только программирование с ПК, а как сделать с кнопок через часы?
За ранее спасибо.
bwn
Offline
Зарегистрирован: 25.08.2014

sting_18 пишет:

Привет всем радиолюбителям.
Вот решился собрать тоже часы на газоразрядных индикаторах ИН-12Б.
Прошивку решил свою написать на Arduino Uno. Часы реального времени использую DS1307.
Столкнулся с проблемой, что нигде ни описано, подстройка часов. Всё только программирование с ПК, а как сделать с кнопок через часы?
За ранее спасибо.

Некрофил вы, однако. Делаете менюшечку, кнопочки прикручиваете и подводите как трэба. И выкиньте 1307 пока не поздно. 3231 возьмите, подводить реже придется.))))

msng
Offline
Зарегистрирован: 07.06.2012

никрофилия еще та, откопаю проект примерно тех же лет

вот код, смотрите

#include <IRremote.h>
#include <IRremoteInt.h>

int RECV_PIN = 8; // Порт для связи с ИК-приёмником
//int led=13;// порт лампочки, которой будем мигать при нажатии кнопки
// в Arduino Mega уже есть диод, которым можно помигать передавая сигнал на 13 вход
int last_received;
IRrecv irrecv(RECV_PIN);
decode_results results;
byte irkey=0;
byte irkey1=0;
long irpremil=0;


/* // массив с большими кнопками 
byte key1=1;
byte key2=52;
byte key3=69;
byte key4=78;
byte key5=83;*/

/*массив с маленькими кнопками
byte key1=1;
byte key2=12;
byte key3=21;
byte key4=28;
byte key5=34;
*/


//массив для платы 
byte key1=1;
byte key2=77;
byte key3=52;
byte key4=69;
byte key5=34;
//



byte AlarmOnHour=8;
byte AlarmOnMin=0;
byte AlarmOffHour=22;
byte AlarmOffMin=0;


int houra=18 ;
int mina=0 ;
int seca=0 ;
int daya=15;
int mona=6;
int yera=12;
int led=13;
long premil=0;
int interval=200;
int var=0; // переменная для меню
long ii=0;
byte brightPin = 9;    // подключена подсветка lcd к выходы 9
int bright = 255;       // переменная для хранения значения яркости 

#include "Arduino.h"
#include <LiquidCrystal.h>
#include <Wire.h>
#include <DS1307.h>
//LiquidCrystal lcd(5, 6, 7, 4, 3, 2);  // было так 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //переменить местами D7 и D5 (13 и 11 ноги атмеги)



long prms=0;
int prsec=0;

void setup() 
{
  
  Serial.begin(115200);
  irrecv.enableIRIn();
 // pinMode(led,OUTPUT);
  
  
  
  
  
  
 // use();
 // read_RTC();
  lcd.begin(16, 2);
  pinMode (led, OUTPUT);
  lcd.clear();
 // int prsec=seca;


prsec=RTC.get(DS1307_SEC,true); 
seca=RTC.get(DS1307_SEC,true);


   for (int i=0; i <= 32000; i++)
  {  
 if (prsec!=RTC.get(DS1307_SEC,true)) i=32000; 
 if (millis()-prms>1200 && seca==prsec) {prms=millis(); prsec=seca; RTC.start();} 
 
 lcd.setCursor(0, 0); 
 lcd.print(prms);
 lcd.print(" ");
 lcd.print(seca);
 lcd.print(" ");
 lcd.print(prsec);
  } 
}



//void use() {}

//void read_RTC() {}

void loop() 
{
  
  
  
  
  
  
  if (irrecv.decode(&results)) {
   // bip();
    irrecv.resume();
    //Serial.println(results.value,DEC);
  } else results.value=0;
  
long a=(results.value);
    //     3q             sony       universal        philips         philips2 
    //if (a!=3095542774 || a!=3095542750 || a!=3095542766 /*|| a!=095542742 || a!=3095542758 || a!=3095542748*/) key=0;
         if (a==33731149 || a==2704 || a==3095542774 || a==655548    || a==12)       irkey=1; //Serial.println(a); */ Serial.println ("Power ");
    else if (a==33728599 || a==1168 || a==3095542750 || a==655552    || a==16)       irkey=2; //Serial.println(a); */ Serial.println ("vol+ ");
    else if (a==33700039 || a==3216 || a==3095542766 || a==655553    || a==17)       irkey=3; //Serial.println(a); */ Serial.println ("vol- ");
    else if (a==33716359 || a== 144 || a==3095542742 || a==655568    || a==32)       irkey=4; //Serial.println(a); */ Serial.println ("Prg+ ");
    else if (a==33748999 || a==2192 || a==3095542758 || a==655569    || a==33)       irkey=5; //Serial.println(a); */ Serial.println ("Prg- ");
    else if (a==33735229 || a== 656 || a==3095542748 || a==655549    || a==13)       irkey=6;  //*Serial.println(a); */ Serial.println ("Mute ");
    else if (a==33720439 || a==3280 || a==309554 || a==655)                          irkey=7; //Serial.println(a); // Serial.println ("right ");
    else if (a==33687799 || a== 720 || a==309554 || a==655)                          irkey=8; //Serial.println(a); // Serial.println ("left ");
    else if (a==33738799 || a== 752 || a==309554 || a==655)                          irkey=9; //Serial.println(a); // Serial.println ("up ");
    else if (a==33714319 || a==2800 || a==309554 || a==655)                          irkey=10; //Serial.println(a); // Serial.println ("down ");
    else if (a==33730639 || a==2672 || a==309554 || a==655)                          irkey=11; //Serial.println(a); // Serial.println ("ok ");
    else irkey=0;
 
 //if (irkey!=0 && millis()-irpremil>400) {irpremil=millis(); Serial.println(irkey);}
 
  
//if (/*irkey!=0 && */millis()-irpremil>interval*1.5) {irkey1=irkey;}
//if (irkey!=0 && millis()-irpremil>interval*1.5) {irpremil=millis(); } // показвыает нажатие пульта


// lcd.setCursor(15, 1);
//lcd.print(irkey); 
  
  
  
  
  
  
  
  
  
  
  //if ((RTC.get(DS1307_MIN,true)==0&&RTC.get(DS1307_HR,true)==0)) RTC.start();
  // читаем А0 кнопки на аналогоом входе
  int sensorValue = analogRead(A0);
  int key=(sensorValue+15)/10;
    
  
  ii=((millis()/100)%3); // мигание курсором
  seca=RTC.get(DS1307_SEC,true); 
                                                              
  mina=RTC.get(DS1307_MIN,true); 
  houra=RTC.get(DS1307_HR,true); 
  daya=RTC.get(DS1307_DATE,true); 
  mona=RTC.get(DS1307_MTH,true); 
 // RTC.set(DS1307_YR,yera);
 // yera=RTC.get(DS1307_YR,true); 
 
 

 
 
  
lcd.setCursor(0, 1); if (houra<10) {lcd.print(" ");} lcd.print(houra);
if (var==1 && ii!=0) {lcd.setCursor(0, 1); lcd.print("  ");}

if ((seca)%4==0 || (seca)%4==2)
lcd.print(":");
else
lcd.print(" ");

lcd.setCursor(3, 1); if ((mina)<=9) {lcd.print("0");} lcd.print(mina);
if (var==2 && ii!=0) {lcd.setCursor(3, 1); lcd.print("  ");}

lcd.setCursor(6, 1); if ((daya)<10) {lcd.print(" ");} lcd.print(daya);
if (var==3 && ii!=0) {lcd.setCursor(6, 1); lcd.print("  ");}

lcd.print("/");


lcd.setCursor(9, 1); if ((mona)<10) {lcd.print("0");} lcd.print(mona);
if (var==4 && ii!=0) {lcd.setCursor(9, 1); lcd.print("  ");}


lcd.print("/");


lcd.setCursor(12, 1); lcd.print(RTC.get(DS1307_YR,true)-2000);
if (var==5 && ii!=0) {lcd.setCursor(12, 1); lcd.print("  ");}

 
 
 // движение по меню
  if (key>100&& (millis() - premil > interval*100)) var=0; // сброс курсора через 20 сек
  if (key== key1  && (millis() - premil > interval*2)) var=var-1; 
  if (key== key1 && (millis() - premil > interval*2)) premil=millis();
  if (key== key2 && (millis() - premil > interval*2)) var=var+1; 
  if (key== key2 && (millis() - premil > interval*2)) premil=millis();
  if (var==11) var=0;
  if (var<0) var=10;
  
  // движение по меню IR 
  if (irkey==0&& (millis() - premil > interval*100)) var=0; // сброс курсора через 20 сек
  if (irkey==1&& (millis() - premil > interval)) var=0; // сброс курсора
  if (irkey== 5  && (millis() - premil > interval*2)) var=var-1; 
  if (irkey== 5 && (millis() - premil > interval*2)) premil=millis();
  if (irkey== 4 && (millis() - premil > interval*2)) var=var+1; 
  if (irkey== 4 && (millis() - premil > interval*2)) premil=millis();
  if (var==11) var=0;
  if (var<0) var=10;
  


//+- часы  
if (key==key3 && (millis() - premil > interval) && var==1) {premil=millis(); (RTC.set(DS1307_HR,(houra=houra-1)));}
if (key==key4 && (millis() - premil > interval) && var==1) {premil=millis(); (RTC.set(DS1307_HR,(houra=houra+1)));}  

// IR+- часы  
if (irkey==3 && (millis() - premil > interval) && var==1) {premil=millis(); (RTC.set(DS1307_HR,(houra=houra-1)));}
if (irkey==2 && (millis() - premil > interval) && var==1) {premil=millis(); (RTC.set(DS1307_HR,(houra=houra+1)));}  


     
// +- минуты  var==2
if (key==key3 && (millis() - premil > interval) && var==2) {premil=millis(); (RTC.set(DS1307_MIN,(mina=mina-1)));}
if (key==key4 && (millis() - premil > interval) && var==2) {premil=millis(); (RTC.set(DS1307_MIN,(mina=mina+1)));}

// IR +- минуты  var==2
if (irkey==3 && (millis() - premil > interval) && var==2) {premil=millis(); (RTC.set(DS1307_MIN,(mina=mina-1)));}
if (irkey==2 && (millis() - premil > interval) && var==2) {premil=millis(); (RTC.set(DS1307_MIN,(mina=mina+1)));}


// +- дни  var==3
if (key==key3 && (millis() - premil > interval) && var==3) {premil=millis(); (RTC.set(DS1307_DATE,(daya=daya-1)));}
if (key==key4 && (millis() - premil > interval) && var==3) {premil=millis(); (RTC.set(DS1307_DATE,(daya=daya+1)));}

// IR +- дни  var==3
if (irkey==3 && (millis() - premil > interval) && var==3) {premil=millis(); (RTC.set(DS1307_DATE,(daya=daya-1)));}
if (irkey==2 && (millis() - premil > interval) && var==3) {premil=millis(); (RTC.set(DS1307_DATE,(daya=daya+1)));}

// +- месяц  var==4
if (key==key3 && (millis() - premil > interval) && var==4) {premil=millis(); (RTC.set(DS1307_MTH,(mona=mona-1)));}
if (key==key4 && (millis() - premil > interval) && var==4) {premil=millis(); (RTC.set(DS1307_MTH,(mona=mona+1)));}

//IR +- месяц  var==4
if (irkey==3 && (millis() - premil > interval) && var==4) {premil=millis(); (RTC.set(DS1307_MTH,(mona=mona-1)));}
if (irkey==2 && (millis() - premil > interval) && var==4) {premil=millis(); (RTC.set(DS1307_MTH,(mona=mona+1)));}

// +- год  var==5
if (key==key3 && (millis() - premil > interval*2) && var==5) {premil=millis(); (RTC.set(DS1307_YR,(yera=yera-1)));}
if (key==key4 && (millis() - premil > interval*2) && var==5) {premil=millis(); (RTC.set(DS1307_YR,(yera=yera+1)));}

// IR +- год  var==5
if (irkey==3 && (millis() - premil > interval*2) && var==5) {premil=millis(); (RTC.set(DS1307_YR,(yera=yera-1)));}
if (irkey==2 && (millis() - premil > interval*2) && var==5) {premil=millis(); (RTC.set(DS1307_YR,(yera=yera+1)));}

// запуск часов
//  if (key==key5) RTC.start(); //key5



// lcd.setCursor(0, 0); lcd.print("               ");
if (var==6) 
{
  lcd.setCursor(0, 0); lcd.print("Set OnHr   "); 
  if (AlarmOnHour<10) lcd.print(" ");
  lcd.print(AlarmOnHour); lcd.print(":"); 
  if (AlarmOnMin<10) lcd.print("0");
  lcd.print(AlarmOnMin);
  if (var==6 && ii!=0) {lcd.setCursor(11, 0); lcd.print("  ");}// мигание часами будильника
} 

if (key==key3 && (millis() - premil > interval) && var==6) {premil=millis(); (AlarmOnHour=AlarmOnHour-1);}
if (AlarmOnHour==255) AlarmOnHour=23;
if (key==key4 && (millis() - premil > interval) && var==6) {premil=millis(); (AlarmOnHour=AlarmOnHour+1);}
if (AlarmOnHour==24) AlarmOnHour=0;

//IR
if (irkey==3 && (millis() - premil > interval) && var==6) {premil=millis(); (AlarmOnHour=AlarmOnHour-1);}
if (AlarmOnHour==255) AlarmOnHour=23;
if (irkey==2 && (millis() - premil > interval) && var==6) {premil=millis(); (AlarmOnHour=AlarmOnHour+1);}
if (AlarmOnHour==24) AlarmOnHour=0;



if (var==7) 
{
  lcd.setCursor(0, 0); lcd.print("Set OnMin  ");
  if (AlarmOnHour<10) lcd.print(" ");
  lcd.print(AlarmOnHour); lcd.print(":"); 
  if (AlarmOnMin<10) lcd.print("0");
  lcd.print(AlarmOnMin);
  if (var==7 && ii!=0) {lcd.setCursor(14, 0); lcd.print("  ");}// мигание минутами будильника
}

if (key==key3 && (millis() - premil > interval) && var==7) {premil=millis(); (AlarmOnMin=AlarmOnMin-1);}
if (AlarmOnMin>60) AlarmOnMin=59;
if (key==key4 && (millis() - premil > interval) && var==7) {premil=millis(); (AlarmOnMin=AlarmOnMin+1);}
if (AlarmOnMin==60) AlarmOnMin=0;

//IR
if (irkey==3 && (millis() - premil > interval) && var==7) {premil=millis(); (AlarmOnMin=AlarmOnMin-1);}
if (AlarmOnMin>60) AlarmOnMin=59;
if (irkey==2 && (millis() - premil > interval) && var==7) {premil=millis(); (AlarmOnMin=AlarmOnMin+1);}
if (AlarmOnMin==60) AlarmOnMin=0;


lcd.setCursor(0, 0);
if (var==1) {lcd.print("Set hour        ");}
if (var==2) {lcd.print("Set minute      ");}
if (var==3) {lcd.print("Set date        ");}
if (var==4) {lcd.print("Set month       ");}
if (var==5) {lcd.print("Set year        ");}

if (var==8) 
  {          
  lcd.print("Set OffHr  ");
  if (AlarmOffHour<10) lcd.print(" ");
  lcd.print(AlarmOffHour); lcd.print(":"); 
  if (AlarmOffMin<10) lcd.print("0");
  lcd.print(AlarmOffMin);
  if (var==8 && ii!=0) {lcd.setCursor(11, 0); lcd.print("  ");}// мигание часами будильника выключение 
  }

if (key==key3 && (millis() - premil > interval) && var==8) {premil=millis(); (AlarmOffHour=AlarmOffHour-1);}
if (AlarmOffHour==255) AlarmOffHour=23;
if (key==key4 && (millis() - premil > interval) && var==8) {premil=millis(); (AlarmOffHour=AlarmOffHour+1);}
if (AlarmOffHour==24) AlarmOffHour=0;
//IR
if (irkey==3 && (millis() - premil > interval) && var==8) {premil=millis(); (AlarmOffHour=AlarmOffHour-1);}
if (AlarmOffHour==255) AlarmOffHour=23;
if (irkey==2 && (millis() - premil > interval) && var==8) {premil=millis(); (AlarmOffHour=AlarmOffHour+1);}
if (AlarmOffHour==24) AlarmOffHour=0;

if (var==9)
  {          
  lcd.print("Set OffMin ");
  if (AlarmOffHour<10) lcd.print(" ");
  lcd.print(AlarmOffHour); lcd.print(":"); 
  if (AlarmOffMin<10) lcd.print("0");
  lcd.print(AlarmOffMin);
  if (var==9 && ii!=0) {lcd.setCursor(14, 0); lcd.print("  ");}// мигание минутами будильника выключение 
  }

if (key==key3 && (millis() - premil > interval) && var==9) {premil=millis(); (AlarmOffMin=AlarmOffMin-1);}
if (AlarmOffMin>60) AlarmOffMin=59;
if (key==key4 && (millis() - premil > interval) && var==9) {premil=millis(); (AlarmOffMin=AlarmOffMin+1);}
if (AlarmOffMin==60) AlarmOffMin=0;
//IR
if (irkey==3 && (millis() - premil > interval) && var==9) {premil=millis(); (AlarmOffMin=AlarmOffMin-1);}
if (AlarmOffMin>60) AlarmOffMin=59;
if (irkey==2 && (millis() - premil > interval) && var==9) {premil=millis(); (AlarmOffMin=AlarmOffMin+1);}
if (AlarmOffMin==60) AlarmOffMin=0;


if (var==0) {lcd.print("                ");}

if (var==10){lcd.print("Bright LCD -/+  ");}
if (key==key4 && (millis() - premil > interval) && var==10 ) {premil=millis(); (bright=bright+50);
    if (bright>=254) bright=255;} // прибавить яркость
if (key==key3 && (millis() - premil > interval) && var==10 ) {premil=millis(); (bright=bright-50);
    if (bright<=10) bright=0;} // убавить яркость
//IR    
if (irkey==2 && (millis() - premil > interval) && var==10 ) {premil=millis(); (bright=bright+50);
    if (bright>=254) bright=255;} // прибавить яркость
if (irkey==3 && (millis() - premil > interval) && var==10 ) {premil=millis(); (bright=bright-50);
    if (bright<=10) bright=0;} // убавить яркость    

    
analogWrite(brightPin, bright);


//включение и выключение будильника 
if (houra==AlarmOnHour && mina>=AlarmOnMin || (houra>=(AlarmOnHour+1)  ) ) {digitalWrite (led,HIGH);}
if (houra==AlarmOffHour && mina>=AlarmOffMin || (houra>=(AlarmOffHour+1)) || (houra<AlarmOnHour) ) {digitalWrite (led,LOW);}


//else digitalWrite (led,LOW);
//if (houra>=(AlarmOnHour+1) && mina>=AlarmOnMin) {digitalWrite (led,HIGH);}
//else digitalWrite (led,LOW);
//else if (houra>=(AlarmOnHour-1) &&  houra<=(AlarmOffHour-1)) 
  //      {if mina
    
//{digitalWrite (led,HIGH);}
//else digitalWrite (led,LOW);
//if (AlarmOffHour==houra && AlarmOffMin==mina) digitalWrite (led,LOW);
if (var==0 && key==key4) {digitalWrite (led,HIGH);}
if (var==0 && key==key3) {digitalWrite (led,LOW);}

}

 

sting_18
Offline
Зарегистрирован: 09.07.2015

Вот это я понимаю ответ, спасибо большое.
Как я правильно понял из кода:

//+- часы 

if (key==key3 && (millis() - premil > interval) && var==1) {premil=millis(); (RTC.set(DS1307_HR,(houra=houra-1)));}

- rtc.set изменяет значения часов в DS1307 ?

msng
Offline
Зарегистрирован: 07.06.2012

Да уж ответ))) думаю это можно сделать в 10 раз меньшим скетчем)) наверное самые первые мои часы

да , ртс.сет и есть установка значений 

но у вас может быть другая библиотека и возможно не подойдёт моя программа

но разобраться что да как работат думаю возможно

Ntrud
Offline
Зарегистрирован: 14.06.2015

   Почитал ваши посты про газоразрядные индикаторы, посмотрел на свои часы, собранные в 1980 году на ИН12Б и К155хх

серии, идут до сих пор и лампы ни разу не менялись. Открою вам секрет долголетия ИНок.

ИНки ни в коем случае нельзя

питать аноды чистой постоянкой 200Вольт, иначе они точно сдохнут после 2х лет непрерывного горения. Для долголетней

роботы ламп их надо питать пульсирующим напряжением, то есть намотать на сетевом трансформаторе обмотку 160В,

выпрямить одним диодом без фильтрующих конденсаторов и подать на анодные резисторы ИН12Б (22 - 24Ком).

Трансформатор должен быть обычным железным на 50Гц.

  С уважением.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Ntrud, хотите сказать, что они у вас непрерывно работали 36 лет? :) Или вы просто вспомнили сейчас, и достали из кладовки?)

Ntrud
Offline
Зарегистрирован: 14.06.2015

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

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

питания. В часах кварц 1Мгц. все счетчики - делители собраны на ТМ2 и ЛА3, дешифраторы К155ИД1.

Итого имеем примерно 50 корпусов (плюс дни недели, + будильник). На вопрос, почему за такой срок

эксплуатации не сдохла ни одна микросхема, отвечу - ТМ2 и ЛА3 - золотая 133 серия.

Кстати точность хода часов 10сек в пол года (кварц большой промышленный, подбирался частотомером).

Неработающие катоды со временем отравляются, при перестановке ламп местами через несколько лет

неиспользованые катоды не светятся.

 С уважением.

valter61
Offline
Зарегистрирован: 20.03.2015

Здравствуйте!

Делаю часы на ИН-12Б. Индикацию собрал. Управляющий блок в процессе. Начал писать прогу для arduino (си к сожалению не изучил). Подключил пока к UNO. Часы работают, но идет засветка цифрой в предыдущем регистре. Т.е. например часы показывают 10 12 15. Так вот в первой лампе ярко 1 и слегка 0. Во второй 0 ярко и 1 немного. И т.д. Подскажите как исправить

#include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
#include <Time.h>             //http://playground.arduino.cc/Code/Time
#include <Wire.h>             //http://arduino.cc/en/Reference/Wire (included with Arduino IDE)





// выводы анодов ламп
int Pin_tube[6]={2,3,4,5,6,7};

// выводы на ИД1 (1-2-4-8)
int Pin_num[4] = {11,10,9,8};

//Массив времени (десятки часа,единицы часа,десятки минут и т.д....)
int NumberColb[6]={0,0,0,0,0,0};

//Массив с помощью которого дешефратору задаются цифры
static const uint8_t numbers[11][4] = 
{
  { 0, 0, 0, 0 }, //0
  { 1, 0, 0, 0 }, //1
  { 0, 1, 0, 0 }, //2
  { 1, 1, 0, 0 }, //3
  { 0, 0, 1, 0 }, //4
  { 1, 0, 1, 0 }, //5
  { 0, 1, 1, 0 }, //6	
  { 1, 1, 1, 0 }, //7
  { 0, 0, 0, 1 }, //8
  { 1, 0, 0, 1 }, //9
  { 1, 1, 1, 1 }  //Чисто
};



void setup() {
   Serial.begin(9600);
   
   setTime(10,07,00,1,03,2016); // установка времени
   
 // все пины на выход и low  
   for (int i=2; i<12; i++) {
     pinMode(i, OUTPUT);
   }
    for (int i=2; i<12; i++) {
     digitalWrite (i, LOW);
   }
delay (100);
}

void loop() {
  
  // часы; загоняем текущее время побитово в массив NumberColb
  
int h = hour ();
int cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[0] = cel;  // десятки часа
NumberColb[1] = h;    // еденицы часа

h = minute ();
cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[2] = cel;
NumberColb[3] = h;

h = second ();
cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[4] = cel;
NumberColb[5] = h;

// вывод времени на лампы
    for (int i=0; i<6; i++) {
      
    for (int k=0; k<4; k++) {
     digitalWrite (Pin_num [k], numbers [NumberColb [i]] [k]); // выводим побитово время
      
     }
      digitalWrite (Pin_tube [i], HIGH); // зажигаем поочередно лампы
      
     delayMicroseconds (200000); // время свеченя лампы
     digitalWrite (Pin_tube [i], LOW);
    
     
  }

}
angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016

Чем все закончилось?

valter61
Offline
Зарегистрирован: 20.03.2015

Сейчас уже точно не помню, но сделал гашение лампы с задержкой. Собирал с использованием tlp627. Сейчас собираю другие на ключах транзисторов 92/42

bizzon
Offline
Зарегистрирован: 29.03.2016

А мои на ИН12 с 1982 года ходят не выключаясь. Питание ламп- однополупериодное от отдельной обмотки 200 в. Верхний и нижний края у цифр только потемнели.

angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016

А рабочий скейч есть, а то у меня лампы ин-12а появились для этого дела)

angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016

Помогите

msng
Offline
Зарегистрирован: 07.06.2012

помогаем)))

вот ссылочка на видео, в описании есть ссылка на скетч, качайте... пользуйте...

только есть ощущение что вам будет нужна плата, схема...

valter61
Offline
Зарегистрирован: 20.03.2015

Вот скетч для часов на 6-ти индикаторах на atmega 328 с ds3231 и dht21


#include <DS3231.h>
#include <Wire.h>             //http://arduino.cc/en/Reference/Wire (included with Arduino IDE)
#include "DHT.h"
#include <Bounce.h>
// кнопки 
#define BUTTON1 14
#define BUTTON2 15
#define BUTTON3 16
Bounce bouncer1 = Bounce(BUTTON1,10);
Bounce bouncer2 = Bounce(BUTTON2,10);
Bounce bouncer3 = Bounce(BUTTON3,10);
#define pressed_long 2000 // долговременное нажатие = 2 секунды
unsigned long pressed_moment; // момент нажатия кнопки
unsigned long pressed_moment2; // момент нажатия кнопки 2

int autoPin = 3; //pin фоторезистор
boolean Avto = true; // режим авто подсветки

int Gas = 500; // время гашения
int tOn[3] = {1, 500, 1450};  // время (яркость)  свечения мкс
int TOn = 2; // переменная для массива времени свечения
// яркость подсветки
int tCol[2][3] = 
{
{220, 170, 50}, 
{250, 210, 160}
};

int TCol = 2;

DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte year, month, date, DoW, hour, minute, second;

#define DHTPIN 13
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//DHT dht(DHTPIN, DHTTYPE); //для 16 мгц
DHT dht(DHTPIN, DHTTYPE, 3); // для 8 мгц

// Выводы на аноды 
//Пин подключен к ST_CP входу 74HC595_1

int latchPinA = 7;

//Пин подключен к SH_CP входу 74HC595
int clockPinA = 4;
//Пин подключен к DS входу 74HC595
int dataPinA = 2;
// массив анода на 595
int tanode[8] = {128, 64, 32, 16, 8, 4, 2, 1};// 10000000, 01000000, 00100000...


// выводы на ИД1 (1-2-4-8)
int Pin_num[4] = {11,10,9,8};

//Массив времени (десятки часа,единицы часа,десятки минут и т.д....)
int NumberColb[6]={0,0,0,0,0,0};

//Массив с помощью которого дешефратору задаются цифры
static const uint8_t numbers[11][4] = 
{
  { 0, 0, 0, 0 }, //0
  { 1, 0, 0, 0 }, //1
  { 0, 1, 0, 0 }, //2
  { 1, 1, 0, 0 }, //3
  { 0, 0, 1, 0 }, //4
  { 1, 0, 1, 0 }, //5
  { 0, 1, 1, 0 }, //6	
  { 1, 1, 1, 0 }, //7
  { 0, 0, 0, 1 }, //8
  { 1, 0, 0, 1 }, //9
  { 1, 1, 1, 1 }  //Чисто
};

unsigned long currentMillis=0; 
long previousMillis = 0;        // храним время последнего показа даты
long interval = 20000;           // интервал между включение/выключением даты
long intervalCatod = 600000;  // интервал перебора цифр от отравления
long otrMillis = 0; // храним время последнего пробега от отравления
long catodMillis = 0; // храним время задержки перебора
long setMillis = 0; // храним время последнего нажатия при установке времени даты 
byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете
boolean but= false; // выход из установки времени
boolean bat = false; // выход из установки времени по истечении 8 сек



// Светодиоды
int Red = 3;
int Green = 5;
int Blue = 6;

int color = 0; //разряды светодиодов 595
boolean podsvet = true;

boolean Db = true;
boolean Tb = true;
boolean Hb = true;

void setup() {
 Wire.begin();
   dht.begin();
   
   pinMode(BUTTON1,INPUT);
   digitalWrite (BUTTON1, HIGH); // подключаем встроенный подтягивающий резистор
   pinMode(BUTTON2,INPUT);
   digitalWrite (BUTTON2, HIGH);
   pinMode(BUTTON3,INPUT);
   digitalWrite (BUTTON3, HIGH);
   
   
   /*     Clock.setSecond(0);//Set the second 
        Clock.setMinute(21);//Set the minute 
        Clock.setHour(23);  //Set the hour 
        Clock.setDoW(7);    //Set the day of the week
        Clock.setDate(10);  //Set the date of the month
        Clock.setMonth(4);  //Set the month of the year
        Clock.setYear(16);  //Set the year (Last two digits of the year)
	// Start the serial interface
*/
   
 // все пины на выход и low  
   for (int i=2; i<12; i++) {
     pinMode(i, OUTPUT);
     digitalWrite(i ,HIGH);
   }

}

void loop() {
  currentMillis = millis();
  
  if (analogRead(autoPin)<=500 && Avto == true) {
   TOn = 0;
  TCol =0;
  }
 
  if (analogRead(autoPin)>500 && analogRead(autoPin)<=800 && Avto == true) {
   TOn = 1;
  TCol =1;
  }
  if (analogRead(autoPin)>800 && Avto == true) {
   TOn = 2;
  TCol = 2;
  }
    
   //set hours
 if ( bouncer1.update() ) {
    //if read high
    if ( bouncer1.read() == LOW) 
      { //если кнопка нажата
   pressed_moment = millis(); // запоминаем время нажатия
  }
  else
  { // кнопка отпущена
   if((millis() - pressed_moment) < pressed_long)
   { // если кнопка была нажата кратковременно
      setMillis = currentMillis;
      while (but == false ){
      currentMillis = millis();  
      aButton();
      }
      but = false;
      setMillis = currentMillis;
      while (but == false && bat == false ) {
        currentMillis = millis();
       aButton2();
     
     }
     but = false;
      setMillis = currentMillis;
      while (but == false && bat == false) {
        currentMillis = millis();
       aButton3();
      
     }
     but = false;
     setMillis = currentMillis;
      while (but == false && bat == false) {
        currentMillis = millis();
       aButton4();
      
     }
     but = false;
     setMillis = currentMillis;
    while (but == false && bat == false) {
      currentMillis = millis();
       aButton5();
      
     }
     but = false;
     setMillis = currentMillis;
    while (but == false && bat == false) {
      currentMillis = millis();
       aButton6();
      
     }
 }
 
 otrMillis = currentMillis;
 previousMillis = currentMillis;
 Db = true;
 Tb = true;
 Hb = true;
 but = false;
 bat = false;
 pressed_moment = 0; // обнуляем момент нажатия
  }
 }
  if((pressed_moment > 0) && ((millis() - pressed_moment) > pressed_long))
  { // кнопка удерживалась долго более 2 сек
  setMillis = millis();
  Avto = false;
  while (but == false ){
      for (int i=0; i<6; i++) {
      NumberColb[i]= 0;
      } 
      Zazhig();
      color = 255;
      analogWrite(Blue, tCol[0][TCol]);
      analogWrite(Red, 255);
      analogWrite(Green, 255);
      if ( bouncer3.update() ) {
      if ( bouncer3.read() == LOW) {
     
        if (TOn == 0) {TOn = 3;}
         TOn = TOn - 1;
         setMillis = millis();
         
      }
      }  
         if ( bouncer2.update() ) {
      if ( bouncer2.read() == LOW) {
     
        if (TCol == 0) {TCol = 3;}
         TCol = TCol -1;
         setMillis = millis();
      
      }
      }
      if ( bouncer1.update() ) {
      if ( bouncer1.read() == LOW) {
        but = true;
      }
      }
         if(millis() - setMillis > 8000) {
      but = true;
         }
 
  
  }
  pressed_moment = 0; // обнуляем момент нажатия 
  but = false;
  }

  
  // убираем подсветку
    if ( bouncer3.update() ) {
    //if read high
    if ( bouncer3.read() == LOW) {
      
       podsvet = false;
    }
  }
  
  // включаем подсветку
  
  if ( bouncer2.update() ) {
    //if read high
    if ( bouncer2.read() == LOW) { //если кнопка нажата
   pressed_moment2 = millis(); // запоминаем время нажатия
  }
    else 
  { // кнопка отпущена 
  if((millis() - pressed_moment2) < pressed_long)
  { // если кнопка была нажата кратковременно
       podsvet = true;
    }
  }
  }
   if (pressed_moment2 > 0 && (millis() - pressed_moment2) > pressed_long)
  { // кнопка удерживалась долго более 2 сек
  setMillis = millis();
  Avto = true;
  pressed_moment2 = 0; // обнуляем момент нажатия
  }
  
 
  
  //проверяем не прошел ли нужный интервал, если прошел то
  if (currentMillis - otrMillis > intervalCatod ) {
  Catodmillis();
  otrMillis = currentMillis;
  }
  if(currentMillis - previousMillis > interval) {
   
  if (currentMillis - previousMillis < interval+3000) {
    if (podsvet == true) {color = 255; }
    else {color = 0;}
    if (Db == true) {   
    Date();
    }
  }
  if (currentMillis - previousMillis > interval+3000 && currentMillis - previousMillis < interval+6000) {
    Db = true;
    if (podsvet == true) {color = 56; }
    else {color = 0;}
    if (Tb == true) {
    Temperature();
    }
  }
    
    if (currentMillis - previousMillis > interval+6000 && currentMillis - previousMillis < interval+9000) {
    Tb = true;
    if (podsvet == true) {color = 51; }
    else {color = 0;}
    if (Hb == true) {
    Humidity();
    }
    
    }
    if (currentMillis - previousMillis > interval+9000) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;
 
  }

 } 
    else {
    Hb = true;
    if (podsvet == true) {color = 255; }
    else {color = 0;}
    if(Clock.getSecond()!=prevSecond) { 
    aTime();
    }
 }
 Zazhig();

}

void aTime() { 
   // часы; загоняем текущее время побитово в массив NumberColb

int h = Clock.getHour(h12, PM);
int cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[0] = cel;  // десятки часа
NumberColb[1] = h;    // еденицы часа

h = Clock.getMinute();
cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[2] = cel;
NumberColb[3] = h;

h = Clock.getSecond();
cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[4] = cel;
NumberColb[5] = h;
prevSecond=Clock.getSecond();

  analogWrite(Red, 255);
  analogWrite(Green, 255);
  analogWrite(Blue, tCol[0][TCol]);
}


void Date() {
  // загоняем дату побитово в массив NumberColb
int h = Clock.getDate();
int cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[0] = cel;  // десятки дня 
NumberColb[1] = h;    // еденицы дня

h = Clock.getMonth(Century);
cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[2] = cel;
NumberColb[3] = h;

h = Clock.getYear();
cel=0; 
while (h>=10){cel++; h-=10;}
NumberColb[4] = cel;
NumberColb[5] = h;

Db = false;

analogWrite(Red, 255);
analogWrite(Green, tCol[0][TCol]+20);
analogWrite(Blue, 255);
 
}

void Temperature() {
  // загоняем температуру побитово в массив NumberColb
float c = dht.readTemperature() - 1.00; //корректировка -1 градус
int g = c;
int f = (c - g) * 100;
NumberColb[0] = 11;
NumberColb[1] = 11;

int cel=0; 
while (g>=10){cel++; g-=10;}
NumberColb[2] = cel;
NumberColb[3] = g; 

cel=0; 
while (f>=10){cel++; f-=10;}
NumberColb[4] = cel;
NumberColb[5] = 11;

Tb = false;
analogWrite(Red, tCol[0][TCol]+10);
analogWrite(Green, 255);
analogWrite(Blue, 255);  
}

void Humidity() { 
  // загоняем влажность побитово в массив NumberColb
float hum = dht.readHumidity();


NumberColb[0] = 11;
NumberColb[1] = 11;

int hym=0; 
while (hum>=10){
hym++; 
hum-=10;
}
NumberColb[2] = hym;
NumberColb[3] = hum;


NumberColb[4] = 11;
NumberColb[5] = 11;
Hb = false;

analogWrite(Red, tCol[0][TCol]);
analogWrite(Green, 255);
analogWrite(Blue, tCol[1][TCol]);

  
}

void Zazhig() {
  
  // вывод времени на лампы
    for (int i=0; i<6; i++) {
      
    for (int k=0; k<4; k++) {
     digitalWrite (Pin_num [k], numbers [NumberColb [i]] [k]); // загоняем время в ИД1  
     }
// если нет данных в регистре выключаем анод
     if (NumberColb [i] == 11) {
 digitalWrite(latchPinA, LOW);
 shiftOut(dataPinA, clockPinA, LSBFIRST, color);
 shiftOut(dataPinA, clockPinA, LSBFIRST, 0);
 digitalWrite(latchPinA, HIGH);
     }
     else { 
// зажигаем поочередно лампы со светодиодами
  digitalWrite(latchPinA, LOW);
 shiftOut(dataPinA, clockPinA, LSBFIRST, color);
 shiftOut(dataPinA, clockPinA, LSBFIRST, tanode [i]); 
 digitalWrite(latchPinA, HIGH);        
     }
     
     delayMicroseconds (tOn[TOn]);// время свеченя лампы
     
// гасим анод (убираем засветку предыдущего разряда )
 digitalWrite(latchPinA, LOW);
 shiftOut(dataPinA, clockPinA, LSBFIRST, color);
 shiftOut(dataPinA, clockPinA, LSBFIRST, 0); 
 digitalWrite(latchPinA, HIGH);
 delayMicroseconds (Gas);
  }
}
  // перебор от отравления
  void Catodmillis() {
    if (podsvet == true) {color = 255; }
    else {color = 0;}
  analogWrite(Red, 255);
  analogWrite(Green, tCol[1][TCol]);
  analogWrite(Blue, tCol[1][TCol]);
  
    for (int w=0; w<10; w++) {
    
         for (int u=0; u<6; u++) {
         NumberColb[u] = w;
         }
         while (currentMillis - catodMillis < 150) {
         currentMillis = millis();
         Zazhig();
         }
         catodMillis = currentMillis;
    }
   
  }
  // часы
    void aButton() {
      color = 192;
      aTime();
      Zazhig();
      if ( bouncer2.update() ) {
      if ( bouncer2.read() == LOW) {
       
      int SH = Clock.getHour(h12, PM);
      if (SH == 23){SH=-1;}
      Clock.setHour (SH+1);
      setMillis = currentMillis;
   
      }
    }
    
    if ( bouncer3.update() ) {
      if ( bouncer3.read() == LOW) {
       
      int SH = Clock.getHour(h12, PM);
      if (SH == 0){SH = 24;}
      Clock.setHour (SH-1);
      setMillis = currentMillis;
      }
    }
    if ( bouncer1.update() ) {
      if ( bouncer1.read() == LOW) {
       
     but=true;
   
      }
    }
    if(currentMillis - setMillis > 8000) {
      but = true;
      bat = true;      
    }
    }
    
    // минуты 
    void aButton2() {
      color = 48;
      aTime();
      Zazhig();
      if ( bouncer2.update() ) {
      if ( bouncer2.read() == LOW) {
       
      int SM = Clock.getMinute();
      if (SM == 59){SM=-1;}
      Clock.setMinute (SM+1);
      setMillis = currentMillis;
   
      }
    }
    if ( bouncer3.update() ) {
      if ( bouncer3.read() == LOW) {
       
      int SM = Clock.getMinute();
      if (SM == 0){SM = 60;}
      Clock.setMinute (SM-1);
      setMillis = currentMillis;
      }
    }
    if ( bouncer1.update() ) {
      if ( bouncer1.read() == LOW) {
     
     but =true;
   
      }
    }
    if(currentMillis - setMillis > 8000) {
      but = true;
      bat = true;
      
    }
    }
    
    // секунды
    void aButton3() {
      color = 12;
      aTime();
      Zazhig();
      if ( bouncer2.update() ) {
      if ( bouncer2.read() == LOW) {
       
      int SM = Clock.getSecond();
      if (SM == 59){SM=-1;}
      Clock.setSecond (SM+1);
      setMillis = currentMillis;
   
      }
    }
    if ( bouncer3.update() ) {
      if ( bouncer3.read() == LOW) {
       
      int SM = Clock.getSecond();
      if (SM == 0){SM = 60;}
      Clock.setSecond (SM-1);
      setMillis = currentMillis;
      }
    }
    if ( bouncer1.update() ) {
      if ( bouncer1.read() == LOW) {
      
     but =true;
   
      }
    }
    if(currentMillis - setMillis > 8000) {
      but = true;
      bat = true;
      
    }
    }
    // число 
     void aButton4() {
      color = 192;
      Date();
      Zazhig();
      if ( bouncer2.update() ) {
      if ( bouncer2.read() == LOW) {
       
      int SM = Clock.getDate();
      if (SM == 31){SM= 0;}
      Clock.setDate (SM+1);
      setMillis = currentMillis;
   
      }
    }
    if ( bouncer3.update() ) {
      if ( bouncer3.read() == LOW) {
       
      int SM = Clock.getDate();
      if (SM == 1){SM = 32;}
      Clock.setDate (SM-1);
      setMillis = currentMillis;
      }
    }
    if ( bouncer1.update() ) {
      if ( bouncer1.read() == LOW) {
      
     but =true;
   
      }
    }
    if(currentMillis - setMillis > 8000) {
      but = true;
      bat = true;
      
    }
    }
    // месяц 
    void aButton5() {
      color = 48;
      Date();
      Zazhig();
      if ( bouncer2.update() ) {
      if ( bouncer2.read() == LOW) {
       
      int SM = Clock.getMonth(Century);
      if (SM == 12){SM= 0;}
      Clock.setMonth (SM+1);
      setMillis = currentMillis;
   
      }
    }
    if ( bouncer3.update() ) {
      if ( bouncer3.read() == LOW) {
       
      int SM = Clock.getMonth(Century);
      if (SM == 1){SM = 13;}
      Clock.setMonth (SM-1);
      setMillis = currentMillis;
      }
    }
    if ( bouncer1.update() ) {
      if ( bouncer1.read() == LOW) {
      
     but =true;
   
      }
    }
  if(currentMillis - setMillis > 8000) {
      but = true;
      bat = true;
      
    }  
    }
    // год
     void aButton6() {
      color = 12;
      Date();
      Zazhig();
      if ( bouncer2.update() ) {
      if ( bouncer2.read() == LOW) {
       
      int SM = Clock.getYear();
      if (SM < 16 && SM >= 0) {SM = 16 ;}
      if (SM == 99){SM= 15;}
      Clock.setYear (SM+1);
      setMillis = currentMillis;
   
      }
    }
    if ( bouncer3.update() ) {
      if ( bouncer3.read() == LOW) {
       
      int SM = Clock.getYear();
      if (SM < 16 && SM >= 0) {SM = 16 ;}
      if (SM == 16){SM = 100;}
      Clock.setYear (SM-1);
      setMillis = currentMillis;
      }
    }
    if ( bouncer1.update() ) {
      if ( bouncer1.read() == LOW) {
      
     but =true;
   
      }
    }
    if(currentMillis - setMillis > 8000) {
      but = true;
      bat = true;
    }
    }

 

alek2
Offline
Зарегистрирован: 05.07.2016

Схемой не поделитесь?

angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016

Помогите

/*==================
 * Nixie Clock Driver
 * V.1
 *
 * Set time using Bluetooth module + android app (BlueArduino)
 * 
 * Copywrite aSaxen 
 * Adam SaxГ©n 2014
 ==================*/
 
#include <Wire.h>
#include <Rtc_Pcf8563.h>
#include <DHT.h>

#define DHTPIN 13 
#define DHTTYPE DHT22  
DHT dht(DHTPIN, DHTTYPE);

//Library for multiplexing the Nixie clock
#include <NixieAS.h>

//int pinLayout[] = {PINA_IC1, PINB_IC1, PINC_IC1, PIND_IC1, PINA_IC2, PINB_IC2, PINC_IC2, PIND_IC2, PAIR1, PAIR2, PAIR3}; 
int pinLayout[] = {5, 3, 2, 4, 9, 7, 6, 8, 12, 11, 10};

NixieAS nix(&pinLayout[0]);
int nums[] = {1,3,3,7,0,0};
unsigned char time_raw[7];


//Variable handle for real time clock object
Rtc_Pcf8563 rtc;

int pre_sec = 0;
int cur_sec = 0;

/*For storeing time and date from user*/
/*unsigned char time_date_raw[13];
int pos = 0;
char byteRead;*/

void setup() {                
  Serial.begin(9600);
  
  rtc.initClock();
  rtc.setDate(1, 3, 3, 7, 10);
  rtc.setTime(1, 13, 37);
  
  dht.begin();
  
}

void updRtcTime(){
  rtc.getTime();
  byte ss = rtc.getSecond();
  byte mm = rtc.getMinute();
  byte hh = rtc.getHour();
  nums[0] = hh / 10;
  nums[1]  = hh % 10;
  nums[2]  = mm / 10;
  nums[3]  = mm % 10;
  nums[4]  = ss / 10;
  nums[5]  = ss % 10;
}

void setRTC(){
  int dateTime[3];
  
  //Check if 0 in front of single day/month/year/hh/mm/ss . Ex: 01 02 03
   for(int i=0; i<3; i++){
   
      if(time_raw[2*i] == '0'){
        dateTime[i] = time_raw[2*i+1]-'0';
      }else{
        //Convert char to int with - '0'
        dateTime[i] = 10*(time_raw[2*i]-'0')+(time_raw[2*i+1]-'0');
      }     
   } 
  
   //rtc.setDate(dateTime[0], 0, dateTime[1], 0, dateTime[2]);
   rtc.setTime(dateTime[0], dateTime[1], dateTime[2]);  
   
   for(int i=0; i < 30; i++){
      nums[0] = random(0, 10);
      nums[1] = random(0, 10);
      nums[2] = random(0, 10);
      nums[3] = random(0, 10);
      nums[4] = random(0, 10);
      nums[5] = random(0, 10);
      nix.showDigits(&nums[0],1);
   }
     
}

void displayTempHumid(){
 
   int temp = (int)dht.readTemperature();
   int humi = (int)dht.readHumidity();
   
   for(int i=0; i < 180; i++){
      nums[0] = humi/10;
      nums[1] = humi%10;
      nums[2] = nums[2] = 0;
      nums[3] = nums[2] = 0;
      nums[4] = temp/10;
      nums[5] = temp%10;
      nix.showDigits(&nums[0],2);
   }
  
}

void readBluetooth(){
  int pos = 0;
  char byteRead;
  //Listen for user commands
  if(Serial.available()) {
    /* read the most recent byte */
    byteRead = Serial.read();
    //Trigger and capture data when char '#' is found
    if(byteRead == '#'){
      while(pos < 7 && Serial.available() > 0){
        byteRead = Serial.read();
        time_raw[pos] = byteRead;
        pos++;
        time_raw[pos] = '\0'; //Null terminate string - indicates end of string
      }      
      //Set the time and date after recieving all data from user
      setRTC();  
     }   
  }
  
}

void loop() { 
  
   
  //Se if bluetooth instructions are available
  readBluetooth();
  
  //Update digits for nixie based on RTC IC
  updRtcTime();
  
  
  //Display temperature and humidity every 15 sec
  
  if(abs((nums[4]*10+nums[5])-pre_sec) > 30){
    displayTempHumid();
    updRtcTime();
    pre_sec = (nums[4]*10+nums[5]);
  }
  
  //Call showDigits that will display nums. Every digit will be on for 2 ms
  nix.showDigits(&nums[0],2);
  
}
место Bluetooth module поставить кнопки для управления часами.
angersos
angersos аватар
Offline
Зарегистрирован: 09.06.2016
 Bluetooth module место нее подключить кнопки 
rf68
Offline
Зарегистрирован: 26.02.2017

Классный проект! Собрал http://itworkclub.ru/arduino-часы-на-газоразрядных-индикаторах/#more-62. Там нет антиотравления. Если можно в личку или схему своего, или совет как вставить антиатравление в вышеуказанный.Спасибо rf68@inbox.ru

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
//Подключаем библиотеки для работы часов реального времени
 
#include <DS3231.h>
#include <Wire.h>
 
// выводы для дешифратора
  int out1 = A3;
  int out2 = A1;
  int out4 = A0;
  int out8 = A2;
// выводы для транзисторных ключей
  int key1= 4;
  int key2 = 6;
  int key3 = 7;
  int key4 = 8;
 
  int led1=11;// вывод светодиода
  int keyb=A6;// пин для клавиатуры
 
 
  int keynum=0; //номер нажатой кнопки
  int mode =0; //0 - отображение текущего времени 1- установка времени
  int currentdigit = 0; //0 - установка часов 1- установка минут
  bool blinkflag = 0; // флаг для мигания цифр при установке времени
  bool timeout=false; // таймаут после нажатия кнопки (для устраниния дребезга)
  unsigned long startTime; //для мигания светодиода
  unsigned long startTime2; // для опроса нажатых кнопок
  int sec; //переменная увеличивается каждые 500мс на единицу. Нужна для мигания секундных светодиодов, бывает в двух значениях 0 - светодиоды не горят, 1 - горят, если больше 1, то сбрысывается в 0
 
  // переменные, необходимые для работы ds3231
  DS3231 Clock;
  bool Century=false;
  bool h12;
  bool PM;
  byte ADay, AHour, AMinute, ASecond, ABits;
  bool ADy, A12h, Apm;
 
  //определяем глобальные переменные для различных параметров часов
  int second,minute,hour,date,month,year,temperature;
 
 
void setup() {
  // put your setup code here, to run once:
  // задаем частоту ШИМ на 9 выводе 30кГц
  TCCR1B=TCCR1B&0b11111000|0x01;
  analogWrite(9,130);
 
    // Start the I2C interface
  Wire.begin();
  // Start the serial interface
  Serial.begin(9600);
  
  //задаем режим работы выходов микроконтроллера
  pinMode(out1,OUTPUT);
  pinMode(out2,OUTPUT);
  pinMode(out4,OUTPUT);
  pinMode(out8,OUTPUT);
 
  pinMode(key1,OUTPUT);
  pinMode(key2,OUTPUT);
  pinMode(key3,OUTPUT);
  pinMode(key4,OUTPUT);
 
  pinMode(led1,OUTPUT);
 
  startTime = millis();
  startTime2=startTime;
  sec = 0;
  // считываем текущее вермя
  ReadDS3231();
}
 
void ReadDS3231()   //функция считывает в глобальные переменные minute и hour текущие значения
{
  minute=Clock.getMinute();
  hour=Clock.getHour(h12, PM);
}
 
 
void loop() {
  // put your main code here, to run repeatedly:
  
  int digits[3]; // массив для текущего значения времени на четыре цифры
  int keyval= analogRead(keyb); // считываем значение с клавиатуры
  
  unsigned long currentTime = millis(); //текущее время с момента запуска рограммы
   if (currentTime>=(startTime2+200)) // если прошло 200мс посмотрим какая кнопка была нажата
   {
      timeout=false;
     //проверим нажатие кнопок
      if (keynum==3) // кнопка переключения между режимами "время" и "настройка"
      {
        timeout=true; // запрещаем считывать нажатия кнопок
        if (mode==0) mode=1; // если отображалось время, переходим в режим настроек
        else
          if (mode==1) mode=0; //если был режим настроек, переключаемся на текущее время
      }
      if (keynum==2) // кнопка переключения между часами и минутами
      {
        timeout=true; // запрещаем считывать нажатия кнопок
        // currentdigit либо 0 - настройка часов, либо 1 - настройка минут
        currentdigit++;
        if (currentdigit==2) currentdigit=0;
      }
      if (keynum==1) // кнопка увеличения количества часов или минут(при настройке)
      {
        blinkflag=true; // прекращаем мигать цифрами
        startTime=millis();
        timeout=true;  // запрещаем считывать нажатия кнопок
        if (currentdigit==0) // если меняем часы
        {
          if (hour<=22) hour++;
          else
            hour=0;
          Clock.setHour(hour);
        }
        if (currentdigit==1) // если меняем минуты
        {
          if (minute<=58) minute++;
          else
            minute=0;
         Clock.setMinute(minute);//Set the minute
         Clock.setSecond(0);
        }
      }
      keynum=0; //сбрасываем нажатую кнопку
      startTime2=millis();
   }
 
  if (currentTime>=(startTime+500)) // если прошло 500мс
  {
    blinkflag=!blinkflag; // инвертируем флаг мигающей цифры
      
    if(sec<1) // светодиоды не горят
    {
      // зажечь светодиоды
      digitalWrite(led1,HIGH);
      Serial.println(blinkflag);
      
    }
    if(sec>=1) // светодиоды горят
    {
      // потушить светодиоды
      digitalWrite(led1,LOW);
    }
    startTime = currentTime;
    ReadDS3231();
    sec = (sec+1);
    if(sec>=2) sec=0;
 
  }
    digits[0] = hour/10;
    digits[1] = hour%10;
    digits[2] = minute/10;
    digits[3] = minute%10;
 
    show(digits); // вывести цифры на дисплей
 
  //проверяем нажатые кнопки
  if(!timeout) //если разрешено, считываем нажатую кнопку
  {
    /*keyval - значение функции analogread
     * если нажата первая кнопка, то принимает значение около 200
     * если нажата вторая кнопка то значение около 700
     * если третяя кнопка, то значение будет около 1000
     * эти значения зависят от выбранных резисторов в клавиатуре
    */
    if (keyval>150 && keyval<400) keynum=1;
    if (keyval>700 && keyval<900) keynum=2;
    if (keyval>960) keynum=3;
  }
}
void show(int a[])
{
    //выведем цифру a[0] на первый индикатор
  setNumber(a[0]);
  if (!(mode==1&&currentdigit==0&&blinkflag==false)) //если мы в режиме настройки и происходит настройка часов, то в первая цифра будет мигать
  {
    digitalWrite(key1,HIGH);
    delay(2);
    //потушим первый индикатор
    digitalWrite(key1,LOW);
    delay(1);
  }
  
  //цифра a[1] на второй индикатор
  setNumber(a[1]);
  if (!(mode==1&&currentdigit==0&&blinkflag==false))
  {
  digitalWrite(key2,HIGH);
  delay(2);
  //потушим второй индикатор
  digitalWrite(key2,LOW);
  delay(1);
  }
 
  //цифра a[2] на третий индикатор
  setNumber(a[2]);
  if (!(mode==1&&currentdigit==1&&blinkflag==false))
  {
  digitalWrite(key3,HIGH);
  delay(2);
  //потушим третий индикатор
  digitalWrite(key3,LOW);
  delay(1);
  }
 
  //выведем цифру a[3] на четвертый индикатор
  setNumber(a[3]);
  if (!(mode==1&&currentdigit==1&&blinkflag==false))
  {
  digitalWrite(key4,HIGH);
  delay(2);
  //потушим четвертый индикатор
  digitalWrite(key4,LOW);
  delay(1);
  }
}
// передача цифры на дешифратор
void setNumber(int num)
{
  switch (num)
  {
    case 0:
    digitalWrite (out1,LOW);
    digitalWrite (out2,LOW);
    digitalWrite (out4,LOW);
    digitalWrite (out8,LOW);
    break;
    case 1:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,LOW);
    digitalWrite (out4,LOW);
    digitalWrite (out8,LOW);
    break;
    case 2:
    digitalWrite (out1,LOW);
    digitalWrite (out2,HIGH);
    digitalWrite (out4,LOW);
    digitalWrite (out8,LOW);
    break;
    case 3:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,HIGH);
    digitalWrite (out4,LOW);
    digitalWrite (out8,LOW);
    break;
    case 4:
    digitalWrite (out1,LOW);
    digitalWrite (out2,LOW);
    digitalWrite (out4,HIGH);
    digitalWrite (out8,LOW);
    break;
    case 5:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,LOW);
    digitalWrite (out4,HIGH);
    digitalWrite (out8,LOW);
    break;
    case 6:
    digitalWrite (out1,LOW);
    digitalWrite (out2,HIGH);
    digitalWrite (out4,HIGH);
    digitalWrite (out8,LOW);
    break;
    case 7:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,HIGH);
    digitalWrite (out4,HIGH);
    digitalWrite (out8,LOW);
    break;
    case 8:
    digitalWrite (out1,LOW);
    digitalWrite (out2,LOW);
    digitalWrite (out4,LOW);
    digitalWrite (out8,HIGH);
    break;
    case 9:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,LOW);
    digitalWrite (out4,LOW);
    digitalWrite (out8,HIGH);
    break;
  }
}

 

jgupdimon
Offline
Зарегистрирован: 16.01.2016

Здравствуйте, Можно Вашу печатку? Спасибо.

rf68
Offline
Зарегистрирован: 26.02.2017