Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

NoName
2016-03-21 10:26:37

код с почты )
исправление отправил, но как вариант не читаете )

//Выбор мелодии пользователем
void bell_menu()
{
  char key  = 0;
  key = customKeypad.getKey();
 
  if (( key >= '0' ) && ( key <= '9' ));
  play_selected_music ( key - 0x20);

}

  if (( key >= '0' ) && ( key <= '9' ));
классическая ошибка ) ";" в неправильном месте, warning наверняка был, но кто ж их читает )

правильный код
if (( key >= '0' ) && ( key <= '9' ))
{
  play_selected_music ( key - 0x20);
}
иначе условие не срабатывает
и выполняется   play_selected_music ( key - 0x20);
с случайными параметрами

Jugun
2016-03-15 22:04:45

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

NoName
2016-03-15 10:58:28

как вариант arduino не поддерживает %2i
такой вариант проще?

char str[32] = {0};

void  prepare_2d_sto_str ( int position, int data )
{
 if ( data >= 100 )
 {
 str[position  ] =  '*';
 str[position+1] =  '*';
 return;
 }
 str[position  ] =  data     %10;
 str[position+1] =  (data/10)%10;
}  
			   
void time_on_lcd()
{

// "--:--:--        "
// "--/--/--        "
static unsigned char old_sec = 0xFF ;
int foo;

if  ( old_sec ==  now.second() )  	return;
old_sec =  now.second();

// clear str
for ( foo = 0; foo < 32; foo++ )
str[foo] = ' ';

str[2] = ':';
str[5] = ':';

str[18] = '/';
str[21] = '/';

prepare_2d_sto_str ( 0, now.hour() );
prepare_2d_sto_str ( 3, now.minute() );
prepare_2d_sto_str ( 6, now.second() );

prepare_2d_sto_str ( 16+0, now.year() );
prepare_2d_sto_str ( 16+3, now.month() );
prepare_2d_sto_str ( 16+6, now.day() );

lcd.setCursor(0, 0);
for ( foo = 0; foo < 32; foo++ )
	lcd.write(str[foo]);
}

покажите тот код что используете, лучше почтой, что б тему не засорять
что то мне не нравится в вашем релизе,
мой код без проверки )


самое стёмное для отладки в примерах ниже, особенно если где то не уследил и накосячил с памятью )
но встречается редко

 (*&f)();
 void (*pf)(void) = &f;
 (*pf)();
 typedef void (*funcType)(void);
 funcType pf2 = &f;
 (*pf2)();

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

Jugun
2016-03-14 23:51:18

Нет. Пустой экран((

Мигание не критично.

P.S. такой код мне совершенно не понятен. Как этому можно научится? Никакой логики...

NoName
2016-03-14 21:30:41
void time_on_lcd()
{

char str[32] = {0};
// "--:--:--        "
// "----/--/--      "
static unsigned char old_sec = 0xFF ;


if  ( old_sec ==  now.second() )  	return;
old_sec =  now.second();

sprintf( str, "%2i:%2i:%2i",
			   now.hour(), now.minute(), now.second() );

lcd.setCursor(0, 0);
lcd.print (str); 
sprintf( str, "%4i/%2i/%2i",
			   			   now.year(), now.month(), now.day() );

lcd.setCursor(0, 1);
lcd.print (str); 

}

так работает ?
мигание потом сделаем

NoName
2016-03-14 21:10:32

контроллер у Вас все время в работе,
ему бы спать побольше как порядному человеку
либо ожидать новой команды

void time_on_lcd()  перепишем через 2-3 часа )
потом скажете что и как.

Jugun
2016-03-14 20:59:49

Спасибо большое, NoName!

Если позволите, еще один вопрос - очень сильно моргает дисплей при воспроизведении даты/времени. Когда просто выводим текст - картинка стабильная. Для уменшения ефекта мерцания я написал команду "delay (200)":
void loop()
{
  now = rtc.now();
  time_on_lcd();
  delay(200);
  timer_bell();
  bell_menu();
}

Но теперь случилось что-то, чего я не могу об'яснить. Дата/время пропали с дисплея вообще. Проверил все соединения. Заново синхронизировал RTC с комп'ютерными часами. Не помогло.
Дата/время вернулись на экран как только я закоментировал "delay (200)". Но отображаются с тем же мерцанием. Уменьшение времени паузы проблему не решило.
Чем это можно об'яснить?

NoName
2016-03-14 00:32:39
void timer_bell()
{
  static int old_current_hour = 0xFF;
  int new_hour = now.hour();
  int number_sound;
  if ( old_current_hour == 0xFF )
  { // no music on  start
    old_current_hour = new_hour;
  }
  // Включение выхода на усилитель
  if (now.minute() == 59 )
  {
    if  ( now.second() == 50 )
      digitalWrite (51, LOW);
  }
  if (now.minute() == 1 )
  {
    if ( now.second() == 15 )
      digitalWrite (51, HIGH);
  }
  //кінець спрацювання виходу 51
  // Сработка на заданое время - каждый час звучит мелодия
  // - 1 sec ??????
  if ( old_current_hour !=  new_hour )
  {
    //wtv020sd16p.playVoice( table_music[new_hour%24]);
    wtv020sd16p.playVoice( (new_hour % 12) + 1);
   old_current_hour = new_hour; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  };

}
Jugun
2016-03-14 00:16:55

#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>
#include <Wtv020sd16p.h>
#include <Keypad.h>

RTC_DS1307 rtc;
LiquidCrystal  lcd (8, 9, 4, 5, 6, 7); // set the LCD address to 0x27 for a 16 chars and 2 line display

//Звуковий модуль: вказано піни
int resetPin = 19;  // The pin number of the reset pin.
int clockPin = 18;  // The pin number of the clock pin.
int dataPin = 17;  // The pin number of the data pin.
int busyPin = 16;  // The pin number of the busy pin.
Wtv020sd16p wtv020sd16p(resetPin, clockPin, dataPin, busyPin);
//кінець опису звукового модуля

DateTime now;

const byte ROWS = 4; //four rows
const byte COLS = 3; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {31, 33, 35, 37}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {39, 41, 43}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

const unsigned char table_music [24]
= {
  12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
};

void setup() {
  Wire.begin();
  Serial.begin(9600);
  rtc.begin();
  lcd.begin(16 , 2);
  lcd.home();
  lcd.clear();
  wtv020sd16p.reset();
}

void loop()
{
  now = rtc.now();
  time_on_lcd();
  delay(200);
  timer_bell();
  bell_menu();
}
//---------------------------------------------
void printDigits(int digits)
{
  // додає нуль якщо година, хвилина або секунда менша 10 (для гарного відображення часу).
  if (digits < 10) {
    lcd.print('0');
  }
  lcd.print(digits);
}
//---------------------------------------------
void time_on_lcd()
{
  //рисуем часы
  lcd.setCursor(0, 0);
  printDigits (now.hour());

  //рисуем минуты
  lcd.setCursor(3, 0);
  printDigits(now.minute());

  //рисуем статическое двоеточие между часами и минутами
  lcd.setCursor(2, 0);
  lcd.print(":");

  //рисуем секунды

  lcd.setCursor(6, 0);
  printDigits(now.second());

  //рисуем моргающее двоеточие, привязано к секундам, вывод слева или справа двоеточие зависит от четности секунд

  lcd.setCursor(5, 0);
  if (now.second() % 10 % 2 == 0) {
    lcd.print(":");
  }
  else
  {
    lcd.print(" ");
  }

  // Дата-месяц-день в нижней строке
  lcd.setCursor(0, 1);
  printDigits(now.year());

  lcd.setCursor(4, 1);
  lcd.print("-");

  lcd.setCursor(5, 1);
  printDigits(now.month());

  lcd.setCursor(7, 1);
  lcd.print("-");

  lcd.setCursor(8, 1);
  printDigits(now.day());
}

//---------------------------------------------
void timer_bell()
{
  static int old_current_hour = 0xFF;

  int new_hour = now.hour();
  int number_sound;

  if ( old_current_hour == new_hour )
  { // no music on  start
    old_current_hour = new_hour;
  }

  // Включение выхода на усилитель
  if (now.minute() == 59 )
  {
    if  ( now.second() == 50 )
      digitalWrite (51, LOW);
  }

  if (now.minute() == 1 )
  {
    if ( now.second() == 15 )
      digitalWrite (51, HIGH);
  }
  //кінець спрацювання виходу 51

  // Сработка на заданое время - каждый час звучит мелодия
  // - 1 sec ??????
  if ( old_current_hour !=  new_hour )
  {
    //wtv020sd16p.playVoice( table_music[new_hour%24]);
    wtv020sd16p.playVoice( (new_hour % 12) + 1);
    return;
  };
}
//---------------------------------------------
void play_selected_music (int number_music)
{
  char key = customKeypad.getKey();
  lcd.clear();
  lcd.setCursor(0 , 0);
  lcd.print("Play track №1?"); // pls add number_music
  lcd.setCursor(0 , 1);
  lcd.print("*-YES    #-N0");
  do
  {
    key = customKeypad.getKey();
    switch (key)
    case '*':
    {
      lcd.clear();
      lcd.print("Playing melody 1"); // pls add number_music
      digitalWrite (51, LOW);
      wtv020sd16p.playVoice(1);
      //      delay (5000);
      digitalWrite (51, HIGH);
      lcd.clear();
      return;
    }
    switch (key)
    case '#':
    {
      lcd.clear();
      return;
    }
  } while ( key != '*' || key != '#' );
}


//----------------------------------------------------------------
//Выбор мелодии пользователем
void bell_menu()
{
  char key = customKeypad.getKey();
  if (key); // Check for a valid key.
  {
    switch (key)
    case '1':
    {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Play track №1?");
      lcd.setCursor(0, 1);
      lcd.print("*-YES    #-N0");
      do
      {
        key = customKeypad.getKey();
        switch (key)
        case '*':
        {

          digitalWrite (51, LOW);
          lcd.clear();
          lcd.print("Playing melody 1");
          wtv020sd16p.playVoice(1);
          //wtv020sd16p.stopVoice();
          //wtv020sd16p.playVoice(1);
          delay (10000);
          digitalWrite (51, HIGH);
          lcd.clear();
          return;
        }
        switch (key)
        case '#':
        {
          lcd.clear();
          return;
        }
      } while ( key != '*' || key != '#' );

      if (( key >= '0' ) && ( key <= '9' ));
      play_selected_music (key - 0x20);

    }
  }
}

NoName
2016-03-14 00:03:59

последнюю редакцию покажите

Jugun
2016-03-13 23:32:53

Мелодию отрабатывает верно, но и запускает постоянно(((
Мелодия играет практически не останавливаясь (остановка только на время "зависания часов" - секунды на 2-3.

NoName
2016-03-13 11:16:40

немного промиле помешало правильно прочитать код )
в час ночи мелодия 1 а не 2

   if ( old_current_hour !=  new_hour )
   {
    old_current_hour =  new_hour; // зыбыл (((
    wtv020sd16p.playVoice( table_music[new_hour%24]);
   }

таблицы удобнее, можете сами выбрать   номер на каждый час
точно, %12 + 1   нужно, но тогда будет не правильно )

все не так )
0 - 12 мелодия
1 - 1
2 - 2
3 - 3
12 -

... используйте таблицу,   первый номер 12 )

const unsigned char table_music [24]
= {
    12,1,2,3,4,5,6,7,8,9,10,11,
    12,1,2,3,4,5,6,7,8,9,10,11,
}

Jugun
2016-03-13 01:09:05

NoName, пожалуйста, попробуйте обьяснить мне как работает этот код. Самое интересное для меня что это - (new_hour%13) + 1)? Почему именно 13?

NoName пише:
const unsigned char table_music [24]
= {
	1,2,3,4,5,6,7,8,9,10,11,12,
	1,2,3,4,5,6,7,8,9,10,11,12
}  

void timer_bell()
{
  static int old_current_hour = 0xFF; 

   int new_hour = now.hour(); 
   int number_sound;

  if ( old_current_hour == 0xFF )
  { // no music on  start 
   old_current_hour = new_hour;
 }

 // Включение выхода на усилитель
  if (now.minute() == 59 )
  {
    if  ( now.second() == 50 )
    digitalWrite (51, LOW);
  }

  if (now.minute() == 1 )
  {
   if ( now.second() == 15 )
    digitalWrite (51, HIGH);
  }
  //кінець спрацювання виходу 51

  // Сработка на заданое время - каждый час звучит мелодия
   // - 1 sec ??????
   if ( old_current_hour !=  new_hour )
   {
	wtv020sd16p.playVoice( (new_hour%13) + 1);
     //  or  
    // wtv020sd16p.playVoice( table_music[new_hour%24]);
   }
}

много кода (((
но задача отлично прописана, молодцы!
по частям давайте оптимизировать
- 1 sec  от нового часа это важно?

Jugun
2016-03-13 00:33:41

Извините, NoName, Ваш ник ввел меня в заблуждение - я подумал, что коменты оставлены несколькими участниками.

Jugun
2016-03-13 00:11:59

Спасибо всем за то, что уделили мне свое время. Мне очень приятно.

Так как опыта в программировании у меня нет, я практически не понимаю кода. Поэтому разбирать Ваши рекомендации буду долго))
Начал с коментария #2.
Не понимаю Вашего кода вообще. Это волшебство - Вы уменьшили код в разы! И он работает! Правда, первый вариант "wtv020sd16p.playVoice( (new_hour%13) + 1);" после первого срабатывания в 23:00 спрабатывает каждый раз как только заканчивается мелодия и часы снова начинают идти. Расскоментил второй вариант. Жду 24:00

Підвал форуму