Ви не увійшли.
код с почты )
исправление отправил, но как вариант не читаете )
//Выбор мелодии пользователем
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);
с случайными параметрами
В последней версии (той, что скинул на почту) программа внезапно перестала давать збой в части повторяющейся мелодии после сработки таймера... Буду следить дальше.
как вариант 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)();
будете ковырять чужой код в реальном железе, разберетесь быстро, без использования - разбор кода - практически бесполезное занятие
делайте что то , и все получится
Нет. Пустой экран((
Мигание не критично.
P.S. такой код мне совершенно не понятен. Как этому можно научится? Никакой логики...
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);
}
так работает ?
мигание потом сделаем
контроллер у Вас все время в работе,
ему бы спать побольше как порядному человеку
либо ожидать новой команды
void time_on_lcd() перепишем через 2-3 часа )
потом скажете что и как.
Спасибо большое, NoName!
Если позволите, еще один вопрос - очень сильно моргает дисплей при воспроизведении даты/времени. Когда просто выводим текст - картинка стабильная. Для уменшения ефекта мерцания я написал команду "delay (200)":
void loop()
{
now = rtc.now();
time_on_lcd();
delay(200);
timer_bell();
bell_menu();
}
Но теперь случилось что-то, чего я не могу об'яснить. Дата/время пропали с дисплея вообще. Проверил все соединения. Заново синхронизировал RTC с комп'ютерными часами. Не помогло.
Дата/время вернулись на экран как только я закоментировал "delay (200)". Но отображаются с тем же мерцанием. Уменьшение времени паузы проблему не решило.
Чем это можно об'яснить?
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; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
};
}
#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);
}
}
}
последнюю редакцию покажите
Мелодию отрабатывает верно, но и запускает постоянно(((
Мелодия играет практически не останавливаясь (остановка только на время "зависания часов" - секунды на 2-3.
немного промиле помешало правильно прочитать код )
в час ночи мелодия 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,
}
NoName, пожалуйста, попробуйте обьяснить мне как работает этот код. Самое интересное для меня что это - (new_hour%13) + 1)? Почему именно 13?
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 от нового часа это важно?
Извините, NoName, Ваш ник ввел меня в заблуждение - я подумал, что коменты оставлены несколькими участниками.
Спасибо всем за то, что уделили мне свое время. Мне очень приятно.
Так как опыта в программировании у меня нет, я практически не понимаю кода. Поэтому разбирать Ваши рекомендации буду долго))
Начал с коментария #2.
Не понимаю Вашего кода вообще. Это волшебство - Вы уменьшили код в разы! И он работает! Правда, первый вариант "wtv020sd16p.playVoice( (new_hour%13) + 1);" после первого срабатывания в 23:00 спрабатывает каждый раз как только заканчивается мелодия и часы снова начинают идти. Расскоментил второй вариант. Жду 24:00