количество импульсов по времени.

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

Итак.... развиваю тему часов на ГРИ. За основу была взята "древняя" прошивка, без наворотов. Из "плюшек" только перебор цифр при смене времени. Для начала "прикрутил" сигнал часа на пищалке. Затем для сигнала часа "прикрутил" МР3 модуль. Теперь есть идея, но нет понимания как её реализовать. Задача выводить на пин импульсы с определённым периодом количеством равное часам. По итогу к пину будет подключаться либо эл.магнит (бой), либо шаговый двигатель.

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

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

У переменной нет ни длительности импульса, ни промежутка между ними...

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

Это я прекрасно понимаю. Но количество импульсов завязывается именно на неё.  Ну хорошо... Как я делал раньше.... Создавал условие типа: если часы=12 и мин=0 и сек=0 , то ... далее либо включение пина либо команда на мр3. при этом замечал что на пищалке каждый час разная длительность импульса. как я понимаю, это потому что прошивка "находит" эту строку в разное время в течении секунды. 

Я вижу вариант с созданием условий типа :

если часы=8 и минуты=0 и сек=00 то пин=1

иначе часы=0 и мин=0 и сек=2 то пин=1... и тд до нужного количества импульсов. 

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

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

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

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

Нарисуйте импульс на ноге через delay - всё равно часы, им спешить не положено. Возьмите обратный цикл for в котором переменная со значением часов будет уменьшаться до нуля и прокрутите ранее написанный импульс. На ноге выпадет точно соответствующее часам количество импульсов.  

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

Rumata пишет:

Это я вам как врач говорю

А заодно и "как мать и как женщина" :-)

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

..."но сися у меня одна...")

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

Есть у этой прошивки ещё одна особенность. Если документирую вывод в монитор порта состояние клавиатуры, то кнопки работать перестают. 

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

Код то хоть можешь правильно вставить? И со спойлером, а не простынёй.

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

мог бы .... вставил. 

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

Мегавольт пишет:

мог бы .... вставил. 

где тебе часами заниматься, если ты код не можешь вставить...

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

Вот вот. Посмотри вокруг - другие ведь могут.

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

думаю это не самый оптимальный вариант. "делей" же буквально тормозит полностью программу. Предполагается, что вся канитель с импульсами займёт 1-8 сек (от количества часов). То есть на это время мигание разделителей прекратится...  

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

спасибо! понял.

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018
#include <DFPlayer_Mini_Mp3.h>
#include <DS3231.h>
#include <Wire.h>
 #include <SoftwareSerial.h>
// выводы для дешифратора
  int out1 = A3;
  int out2 = A1;
  int out4 = A0;
  int out8 = A2;
// выводы для транзисторных ключей
  int key1 = 8;
  int key2 = 7;
  int key3 = 6;
  int key4 = 4;
 
  int led1=11;// вывод светодиода
  int keyb=A6;// пин для клавиатуры
  int buzz=3;// пин пищалки
 
  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;
  
  int lastMinute;
 
void setup() {
  // put your setup code here, to run once:
  // задаем частоту ШИМ на 9 выводе 30кГц
  TCCR1B=TCCR1B&0b11111000|0x01;
  
  analogWrite(9,150); // настраиваем скважность импульса. Этим подгоняем напряжение на лампах 180 В
 
    // Start the I2C interface
  Wire.begin();
  // Start the serial interface
  Serial.begin(9600);
  
  mp3_set_serial (Serial);    //set Serial for DFPlayer-mini mp3 module
   mp3_set_volume (20); //задаём громкость
  
  //задаем режим работы выходов микроконтроллера
  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);
  pinMode(buzz,OUTPUT);
 
  startTime = millis();
  startTime2=startTime;
  sec = 0;
  // считываем текущее вермя
  ReadDS3231();
  delay(1000);
  lastMinute = minute%10;
}
 
void ReadDS3231()   //функция считывает в глобальные переменные minute и hour текущие значения
{
  minute=Clock.getMinute();
  hour=Clock.getHour(h12, PM);
  second=Clock.getSecond();
}
 
 
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 && mode==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.print(hour);
// Serial.print(" ");
 //Serial.print(minute);
//Serial.print(" "); 
 // Serial.print(second);
// Serial.println(" ");     
// Serial.println(blinkflag);
      Serial.print("Keyval=");
    Serial.println(keyval);
     
    }
    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;
  
    //антиотравление
  if (minute%10!=lastMinute && mode == 0)
  {

    digits[3] = lastMinute;
    lastMinute = minute%10;
    
    Safe(digits);
    digits[3] = lastMinute;
  }
  //
 
    show(digits); // вывести цифры на дисплей

//пищалка. Если установлена на плате, активная 5 В
//if ((hour>=8) & (hour<=20) & (minute==0) & (second==0))
//digitalWrite(buzz,HIGH);
//else
//digitalWrite(buzz,LOW);

//МР3 модуль
if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0
{ mp3_play (20);}                                // то включаем трек -3
 else if((hour==9) & (minute==0) & (second==0)){  //иначе если час=9, мин=0, сек=0
mp3_play (1);}                                 // то играем трек-7 ...
else if((hour==10) & (minute==0) & (second==0)){
mp3_play (3);}
else if((hour==11) & (minute==0) & (second==0)){
mp3_play (4);}
else if((hour==12) & (minute==0) & (second==0)){
mp3_play (2);}
else if((hour==13) & (minute==0) & (second==0)){
mp3_play (11);}
else if((hour==14) & (minute==0) & (second==0)){
mp3_play (18);}
else if((hour==15) & (minute==0) & (second==0)){
mp3_play (6);}
else if((hour==16) & (minute==0) & (second==0)){
mp3_play (10);}
else if((hour==17) & (minute==0) & (second==0)){
mp3_play (19);}
else if((hour==18) & (minute==0) & (second==0)){
mp3_play (12);}
else if((hour==19) & (minute==0) & (second==0)){
mp3_play (9);}
else if((hour==20) & (minute==0) & (second==0)){
mp3_play (21);}
else if((hour==21) & (minute==0) & (second==0)){
mp3_play (5);}

else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье
mp3_play (16);}
else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){
mp3_play (17);}

  //проверяем нажатые кнопки
  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;
  }
}
void Safe(int n[])
{
  int h1 = n[0];
  int h2 = n[1];
  int m1 = n[2];
  int m2 = n[3];

  n[0]++;
  while(n[0]!=h1)
  {
    
    for (int x=0;x<2;x++)
    {
      show(n);
    }
    n[0]++;
    if (n[0]>9) n[0]=0;
  }
  
  n[1]++;
  while(n[1]!=h2)
  {
    
    for (int x=0;x<2;x++)
    {
      show(n);
    }
    n[1]++;
    if (n[1]>9) n[1]=0;
  }
  
  n[2]++;
  while(n[2]!=m1)
  {
    
    for (int x=0;x<2;x++)
    {
      show(n);
    }
    n[2]++;
    if (n[2]>9) n[2]=0;
  }
  
  n[3]++;
  while(n[3]!=m2)
  {
    
    for (int x=0;x<2;x++)
    {
      show(n);
    }
    n[3]++;
    if (n[3]>9) n[3]=0;
  }
  

}

 

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

Мегавольт пишет:

мог бы .... вставил. 

Вот и вставьте. Как выражается граф, это входной тест 

Вашу портянку я удалю

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

код показывает, что ни про массивы, ни про циклы, ни про switch() вы не в курсе....

Может какую-то книжку почитать?

 

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

не то что бы совсем не в курсе..... Код изначально не мой и ему лет энцать.... Более того это уже плод коллективного (хоть и не сильно развитого) разума. Моё тут только "пищалка" и "мр3". Книжку обязательно почитаю, уроки Гайвера пересмотрю.... 

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

Интересно, вот тут делей для чего? - чтобы цифры мигали?

//выведем цифру a[0] на первый индикатор
  setNumber(a[0]);
  if (!(mode==1&&currentdigit==0&&blinkflag==false)) //если мы в режиме настройки и происходит настройка часов, то в первая цифра будет мигать
  {
    digitalWrite(key1,HIGH);
    delay(2);
    //потушим первый индикатор
    digitalWrite(key1,LOW);
    delay(1);
  }

если зажигать цифру на 2 миллисекунды -думаете  кто-то это сможет заметить?

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

На сколько я понимаю, это для работы динамической индикации. Цифры выводятся последовательно. Кстати... Если тот же импульс реализовать через "делей" , то и индикация "повиснет". Не вариант.... 

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

Ну значит не через делей, а через блинк визаут делей. Тема такая есть . Посмотрите и сделайте импульс. Обратный фор всё равно делать надо, только не через фор, а самому по тому же принципу растягивая на весь луп.

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

Мегавольт пишет:

На сколько я понимаю, это для работы динамической индикации

во-первых, в комментариях написано совсем иное - я специально их оставил, копируя код. Во-вторых, при динамической индикации никто не ставит задержек в выключенном состоянии - это нарушит показ соседних цифр.

Думаю, это никакая не "динамика". а именно что попытка мигать цифрой. Только реализованное вообще без понимания предмета.

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

Почитал я "напутствие" для новичков..... Почитал соседние темы.... Пересмотрел свою....  И меня что то терзают смутные сомнения..... Это форум вообще про Ардуино? Только самый ленивый меня не "пнул" и "носом не тыкнул".... Вы тут как "камеди клаб" что ли? все из бывших КВНовцов?  И главное на это времени и сил не жалко, а вот просто взять и по теме ответить.... Вас в школе били что ли, что Вы тут самоутверждаетесь....  Как там в "напутсвии"? " уровень подготовки старожилов известен, ваш, еще нужно подтвердить." Возможно уровень и известен.... но каков он на самом то деле? что то не бросается в глаза. Уровень "дедовщины", да высокий.... ну так форум то вроде не про это. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А вот этот участок кода у вас работает?
 

//МР3 модуль
if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0
{ mp3_play (20);}                                // то включаем трек -3
 else if((hour==9) & (minute==0) & (second==0)){  //иначе если час=9, мин=0, сек=0
mp3_play (1);}                                 // то играем трек-7 ...
else if((hour==10) & (minute==0) & (second==0)){
mp3_play (3);}
else if((hour==11) & (minute==0) & (second==0)){
mp3_play (4);}
else if((hour==12) & (minute==0) & (second==0)){
mp3_play (2);}
else if((hour==13) & (minute==0) & (second==0)){
mp3_play (11);}
else if((hour==14) & (minute==0) & (second==0)){
mp3_play (18);}
else if((hour==15) & (minute==0) & (second==0)){
mp3_play (6);}
else if((hour==16) & (minute==0) & (second==0)){
mp3_play (10);}
else if((hour==17) & (minute==0) & (second==0)){
mp3_play (19);}
else if((hour==18) & (minute==0) & (second==0)){
mp3_play (12);}
else if((hour==19) & (minute==0) & (second==0)){
mp3_play (9);}
else if((hour==20) & (minute==0) & (second==0)){
mp3_play (21);}
else if((hour==21) & (minute==0) & (second==0)){
mp3_play (5);}
 
else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье
mp3_play (16);}
else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){
mp3_play (17);}

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

ТС перезалей пожалуйста свой код, чтобы номера строк были. Как у вас вообще получилось без номеров код вставить?
 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А дубли Сообщения получились потому, что задолбали 502 и 504 ошибки форума!!! Когда уже починят?!

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

#include <DFPlayer_Mini_Mp3.h>
#include <DS3231.h>
#include <Wire.h>
 #include <SoftwareSerial.h>
// выводы для дешифратора
  int out1 = A3;
  int out2 = A1;
  int out4 = A0;
  int out8 = A2;
// выводы для транзисторных ключей
  int key1 = 8;
  int key2 = 7;
  int key3 = 6;
  int key4 = 4;
 
  int led1=11;// вывод светодиода
  int keyb=A6;// пин для клавиатуры
  int buzz=3;// пин пищалки
 
  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;
  
  int lastMinute;
 
void setup() {
  // put your setup code here, to run once:
  // задаем частоту ШИМ на 9 выводе 30кГц
  TCCR1B=TCCR1B&0b11111000|0x01;
  
  analogWrite(9,150); // настраиваем скважность импульса. Этим подгоняем напряжение на лампах 180 В
 
    // Start the I2C interface
  Wire.begin();
  // Start the serial interface
  Serial.begin(9600);
  
  mp3_set_serial (Serial);    //set Serial for DFPlayer-mini mp3 module
   mp3_set_volume (20); //задаём громкость
  
  //задаем режим работы выходов микроконтроллера
  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);
  pinMode(buzz,OUTPUT);
 
  startTime = millis();
  startTime2=startTime;
  sec = 0;
  // считываем текущее вермя
  ReadDS3231();
  delay(1000);
  lastMinute = minute%10;
}
 
void ReadDS3231()   //функция считывает в глобальные переменные minute и hour текущие значения
{
  minute=Clock.getMinute();
  hour=Clock.getHour(h12, PM);
  second=Clock.getSecond();
}
 
 
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 && mode==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.print(hour);
// Serial.print(" ");
 //Serial.print(minute);
//Serial.print(" "); 
 // Serial.print(second);
// Serial.println(" ");     
// Serial.println(blinkflag);
      Serial.print("Keyval=");
    Serial.println(keyval);
     
    }
    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;
  
    //антиотравление
  if (minute%10!=lastMinute && mode == 0)
  {

    digits[3] = lastMinute;
    lastMinute = minute%10;
    
    Safe(digits);
    digits[3] = lastMinute;
  }
  //
 
    show(digits); // вывести цифры на дисплей

//пищалка. Если установлена на плате, активная 5 В
//if ((hour>=8) & (hour<=20) & (minute==0) & (second==0))
//digitalWrite(buzz,HIGH);
//else
//digitalWrite(buzz,LOW);

//МР3 модуль
if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0
{ mp3_play (20);}                                // то включаем трек -3
 else if((hour==9) & (minute==0) & (second==0)){  //иначе если час=9, мин=0, сек=0
mp3_play (1);}                                 // то играем трек-7 ...
else if((hour==10) & (minute==0) & (second==0)){
mp3_play (3);}
else if((hour==11) & (minute==0) & (second==0)){
mp3_play (4);}
else if((hour==12) & (minute==0) & (second==0)){
mp3_play (2);}
else if((hour==13) & (minute==0) & (second==0)){
mp3_play (11);}
else if((hour==14) & (minute==0) & (second==0)){
mp3_play (18);}
else if((hour==15) & (minute==0) & (second==0)){
mp3_play (6);}
else if((hour==16) & (minute==0) & (second==0)){
mp3_play (10);}
else if((hour==17) & (minute==0) & (second==0)){
mp3_play (19);}
else if((hour==18) & (minute==0) & (second==0)){
mp3_play (12);}
else if((hour==19) & (minute==0) & (second==0)){
mp3_play (9);}
else if((hour==20) & (minute==0) & (second==0)){
mp3_play (21);}
else if((hour==21) & (minute==0) & (second==0)){
mp3_play (5);}

else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье
mp3_play (16);}
else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){
mp3_play (17);}

  //проверяем нажатые кнопки
  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;
  }
}
void Safe(int n[])
{
  int h1 = n[0];
  int h2 = n[1];
  int m1 = n[2];
  int m2 = n[3];

  n[0]++;
  while(n[0]!=h1)
  {
    
    for (int x=0;x<2;x++)
    {
      show(n);
    }
    n[0]++;
    if (n[0]>9) n[0]=0;
  }
  
  n[1]++;
  while(n[1]!=h2)
  {
    
    for (int x=0;x<2;x++)
    {
      show(n);
    }
    n[1]++;
    if (n[1]>9) n[1]=0;
  }
  
  n[2]++;
  while(n[2]!=m1)
  {
    
    for (int x=0;x<2;x++)
    {
      show(n);
    }
    n[2]++;
    if (n[2]>9) n[2]=0;
  }
  
  n[3]++;
  while(n[3]!=m2)
  {
    
    for (int x=0;x<2;x++)
    {
      show(n);
    }
    n[3]++;
    if (n[3]>9) n[3]=0;
  }
  

}
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

BOOM пишет:

А вот этот участок кода у вас работает?
 

//МР3 модуль
if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0
{ mp3_play (20);}                                // то включаем трек -3
 else if((hour==9) & (minute==0) & (second==0)){  //иначе если час=9, мин=0, сек=0
mp3_play (1);}                                 // то играем трек-7 ...
else if((hour==10) & (minute==0) & (second==0)){
mp3_play (3);}
else if((hour==11) & (minute==0) & (second==0)){
mp3_play (4);}
else if((hour==12) & (minute==0) & (second==0)){
mp3_play (2);}
else if((hour==13) & (minute==0) & (second==0)){
mp3_play (11);}
else if((hour==14) & (minute==0) & (second==0)){
mp3_play (18);}
else if((hour==15) & (minute==0) & (second==0)){
mp3_play (6);}
else if((hour==16) & (minute==0) & (second==0)){
mp3_play (10);}
else if((hour==17) & (minute==0) & (second==0)){
mp3_play (19);}
else if((hour==18) & (minute==0) & (second==0)){
mp3_play (12);}
else if((hour==19) & (minute==0) & (second==0)){
mp3_play (9);}
else if((hour==20) & (minute==0) & (second==0)){
mp3_play (21);}
else if((hour==21) & (minute==0) & (second==0)){
mp3_play (5);}
 
else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье
mp3_play (16);}
else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){
mp3_play (17);}

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

ТС перезалей пожалуйста свой код, чтобы номера строк были. Как у вас вообще получилось без номеров код вставить?

ТС, вот смотри какая мысль у меня по твоему вопросу. Вместо запуска mp3 (или перед ним - я не знаю как он работает - отдал команду на проигрывание и пошёл дальше или ждёт завершения проигрыша?) в этом участке кода взводишь флаг «надо бы подолбить в колокол», ещё одной переменной присваиваешь значение часа, в другой запоминаешь значение миллис. Я думаю идею понял? По типу блин без делея уже управляешь электромагнитом или чем там в колокол хотел долбить. )

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

BOOM пишет:

А вот этот участок кода у вас работает?
 

//МР3 модуль
if ((hour==8) & (minute==30) & (second==0)) //Если час=8 и минуты=30 и секунды =0
{ mp3_play (20);}                                // то включаем трек -3
 else if((hour==9) & (minute==0) & (second==0)){  //иначе если час=9, мин=0, сек=0
mp3_play (1);}                                 // то играем трек-7 ...
else if((hour==10) & (minute==0) & (second==0)){
mp3_play (3);}
else if((hour==11) & (minute==0) & (second==0)){
mp3_play (4);}
else if((hour==12) & (minute==0) & (second==0)){
mp3_play (2);}
else if((hour==13) & (minute==0) & (second==0)){
mp3_play (11);}
else if((hour==14) & (minute==0) & (second==0)){
mp3_play (18);}
else if((hour==15) & (minute==0) & (second==0)){
mp3_play (6);}
else if((hour==16) & (minute==0) & (second==0)){
mp3_play (10);}
else if((hour==17) & (minute==0) & (second==0)){
mp3_play (19);}
else if((hour==18) & (minute==0) & (second==0)){
mp3_play (12);}
else if((hour==19) & (minute==0) & (second==0)){
mp3_play (9);}
else if((hour==20) & (minute==0) & (second==0)){
mp3_play (21);}
else if((hour==21) & (minute==0) & (second==0)){
mp3_play (5);}
 
else if ((hour>=8) & (hour<=13) & (minute==59) & (second==50)){ //тиканье
mp3_play (16);}
else if ((hour>=14) & (hour<=20) & (minute==59) & (second==50)){
mp3_play (17);}

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

ТС перезалей пожалуйста свой код, чтобы номера строк были. Как у вас вообще получилось без номеров код вставить?
 

Да, всё работает. Это моё "произведение". не вижу ни какого противоречия. А без номеров вставил убрав их во вкладке "дополнительно" окна вставки. 

МР3 плеер подключен с библиотекой и используются штатные команды. 

 

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

BOOM пишет:

ТС, вот смотри какая мысль у меня по твоему вопросу. Вместо запуска mp3 (или перед ним - я не знаю как он работает - отдал команду на проигрывание и пошёл дальше или ждёт завершения проигрыша?) в этом участке кода взводишь флаг «надо бы подолбить в колокол», ещё одной переменной присваиваешь значение часа, в другой запоминаешь значение миллис. Я думаю идею понял? По типу блин без делея уже управляешь электромагнитом или чем там в колокол хотел долбить. )

Вот с языка сорвал. Секунду будет пытаться воспроизвести музыку?

Надо поставить флаг, что воспроизвёл. И на первой секунде снять.

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

в прошивке с колоколом МР3 не будет совсем. За ненадобностью. 

МР3 работает стабильно. Глюков за почти 2 года не замечал. И собрано уже 4 экземпляра. 

Ардуино окончания воспроизведения не ждёт. У неё вообще с модулем МР3 обратной связи нет. Отправила команду и дальше своими делами занимается. 

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018
#include <Stepper.h>

// change this to the number of steps on your motor
#define STEPS 100

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);

// the previous reading from the analog input
int previous = 0;

void setup() {
  // set the speed of the motor to 30 RPMs
  stepper.setSpeed(30);
}

void loop() {
  // get the sensor value
  int val = analogRead(0);

  // move a number of steps equal to the change in the
  // sensor reading
  stepper.step(val - previous);

  // remember the previous value of the sensor
  previous = val;
}

Есть вот такой пример. Допустим я убираю опрос с датчика, а переменную количества шагов приравниваю к часам. Скорость мне даст нужный промежуток между импульсами. (то что 4 пина, это пока не принципиально) 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Мегавольт пишет:

в прошивке с колоколом МР3 не будет совсем. 

Так зачем Вы это говно нам показываете?

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

mykaida пишет:

Мегавольт пишет:

в прошивке с колоколом МР3 не будет совсем. 

Так зачем Вы это говно нам показываете?

А нахрена тогда просили всю прошивку выкатить? 

 

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

BOOM пишет:

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


Это число шагов на 360 градусов. Так что нормальная идея, в принципе. К тому же библиотечки шаговых умеют в неблокирующем режиме работать, без delay и sms.

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

BOOM пишет:

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

Задаётся количество шагов на полный оборот мотора. А сколько шагов он сделает зависит от положения потенциометра. Вроде так. 

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

BOOM пишет:

А вот этот участок кода у вас работает?
 

...
else if((hour==10) & (minute==0) & (second==0)){
...

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

А чем вообще вообще логические операции отличаются от битовых?

Только тем, что битовые работают с каждым битом числа, а логические работают с любым числом как с однобитным.

Но в логических переменных используется всего один бит. Результат конъюнкции или дизъюнкции при работе с такими переменными приводят к одному и тому же результату вне зависимости от того, логическая это операция или битовая (все биты кроме нулевого как были, так и останутся равными 0).

 

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

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

Не прокатывает с этой библиотекой для шаговых моторов. Она тормозит выполнение кода пока шаговик работает.... 

Ну не может быть, что бы у такой простой задачи не было лёгкого решения. 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Может так попробовать

const byte PIN = 2; //
unsigned long on_ = 0;
byte schet = 0;
byte hours_ = 7; // например, пробить 7 часов
bool ZVON = true;

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

void loop() {

  if (ZVON) {

    if ((millis() - on_) >= 1000) {
      on_ = millis();
      schet++;
      if (schet < 2) { 
        digitalWrite(PIN, HIGH);//1сек сигнал
      }
      else {
        digitalWrite(PIN, LOW);//3сек пауза
        if (schet > 3) {
          hours_--;  // количество сигналов
          schet = 0;
        }
      }
      if (hours_ == 0) {
        ZVON = false;

      }
    }
  }
}

 

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

Неправильно библиотеку используете, думаю. Должен у неё быть и неблокирующий ход.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Дим-мычъ пишет:

Может так попробовать

const byte PIN = 2; //
unsigned long on_ = 0;
byte schet = 0;
byte hours_ = 7; // например, пробить 7 часов
bool ZVON = true;

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

void loop() {

  if (ZVON) {

    if ((millis() - on_) >= 1000) {
      on_ = millis();
      schet++;
      if (schet < 2) { 
        digitalWrite(PIN, HIGH);//1сек сигнал
      }
      else {
        digitalWrite(PIN, LOW);//3сек пауза
        if (schet > 3) {
          hours_--;  // количество сигналов
          schet = 0;
        }
      }
      if (hours_ == 0) {
        ZVON = false;

      }
    }
  }
}

 

Ну я типа таком и писал выше. ))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Дим-мычъ пишет:

Может так попробовать

const byte PIN = 2; //
unsigned long on_ = 0;
byte schet = 0;
byte hours_ = 7; // например, пробить 7 часов
bool ZVON = true;

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

void loop() {

  if (ZVON) {

    if ((millis() - on_) >= 1000) {
      on_ = millis();
      schet++;
      if (schet < 2) { 
        digitalWrite(PIN, HIGH);//1сек сигнал
      }
      else {
        digitalWrite(PIN, LOW);//3сек пауза
        if (schet > 3) {
          hours_--;  // количество сигналов
          schet = 0;
        }
      }
      if (hours_ == 0) {
        ZVON = false;

      }
    }
  }
}

 

Ну я типа таком и писал выше. ))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Да почините уже сервер, задолбало!!!

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

BOOM пишет:

Ну я типа таком и писал выше. ))

Да. похоже что так.

Когда-то Alexey_Rem показал мне пример (ещё раз ему спасибо), по сути это его разновидность,

где угодно может подойти)))

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

sadman41 пишет:
Неправильно библиотеку используете, думаю. Должен у неё быть и неблокирующий ход.

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

 

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

добился таки я результата.  Пересмотрел уроки, всеми тут так не любимого, Гайвера  и нашёл пару примеров из которых вывел нужный мне. потом подработал его по примеру от ВООМ.  По сути можно было добиться полного выполнения исходной задачи, но вовремя себя остановил. Пришло понимание, что получить, например, в 8 вечера 20 сигналов, это явный перебор. Пока остановился на пяти. Но количество, длительность, пауза... это всё легко меняется и уже можно подогнать на конечном изделии. Главное часть кода сформирована и удачно вписалась в исходный код и проходит "обкатку" на готовых часах. 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Как в китайском боевике: главный герой пошел учится к Великому мастеру(там ему открылась истина) и потом сам сам тал Великим воином и всех победил

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

Офигенный сюжет! Буду к этому стремиться. 

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

Alexey_Rem пишет:

Как в китайском боевике: главный герой пошел учится к Великому мастеру(там ему открылась истина)

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

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

b707 пишет:

Думаю, это никакая не "динамика". а именно что попытка мигать цифрой. Только реализованное вообще без понимания предмета.

"Думать надо меньше, а соображать больше!" (с)  

Ни какой попытки мигать цифрой тут нет!  Ну и само собой это не динамическая индикация.... (тут я конечно тупанул) Это просто задержка, что бы действие не выполнялось несколько раз за кротчайший промежуток времени и всё! как я выяснил, это не редко практикуется не только для часов ГРИ, но и на других видах часов и вообще при выводе на экран или сегменты. 

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

Мегавольт пишет:

.... потом подработал его по примеру от ВООМ.  .....

 

прошу прощения... пример был от Дим-мычъ.