Ви не увійшли.
З якою із частин яка конкретно проблема?
Будь-яку задачу, складнішу за блимання єдиним світлодіодом, декомпонуйте на простіші підзадачі і вирішуйте їх послідовно.
Спочатку реалізуйте індикацію, просто відображення довільних цифр.
Потім реалізуйте взаємодію з мікросхемою годинника по I²C, відображайте поточний час.
Далі реалізуйте обробку натиснення кнопок і перемикання внутрішнього стану. Меню - це класичний скінченний автомат, ознайомтесь із теорією автоматів.
Поступово доповнюйте функціонал, але беріться за наступну функцію після того як попередні вже працюють.
За яким протоколом "сайт" очікує дані? "Сирий" TCP чи UDP? HTTP GET/PUT/POST? В якому форматі мають бути дані?
Прімітивний TCP сервер можна запустити за допомогою
$ socat TCP-LISTEN:8080 -
Звісно, хост, на якому запускається сервер, має бути доступний з GPRS-мережі.
Відслідковувати трафік можна, наприклад, за допомогою wireshark.
Існують різні методи. Можна відтворювати PCM-кодований сигнал за допомогою ШІМ або зовнішнього DAC. Але при розрядності 8 біт і частоті дискретизації 8 кГц 1 секунда звуку займатиме 8 кб. На Atmega328p без зовнішньої EEPROM влізе не більше 4 секунд, а там ще код і бутлоадер. Якщо знизити розрядність до 4 біт, то влізе вдвічі більше, але якість буде гіршою.
Одноголосну мелодію можна відтворити "цифровим" методом, генеруючи прямокутний сигнал. tone()/delay() - це найпростіший спосіб.
#define PIN_BUZZER 3
void setup() {
pinMode(PIN_BUZZER, OUTPUT);
}
struct note {
uint16_t frequency;
uint16_t duration;
};
static const PROGMEM note notes[] = {
{ 293, 240 },
{ 329, 240 },
{ 349, 240 },
{ 392, 240 },
{ 329, 480 },
{ 261, 240 },
{ 293, 720 }
};
void loop() {
for (auto *p = notes; p < notes + sizeof(notes)/sizeof(*notes); ++p) {
note note;
memcpy_P(¬e, p, sizeof(note));
if (note.frequency) {
tone(PIN_BUZZER, note.frequency);
} else {
noTone(PIN_BUZZER);
}
delay(note.duration);
}
noTone(PIN_BUZZER);
for (;;) {}
}
Порахувати частоту ноти можна за формулою f=F*2^(n/12), де F - частота базової ноти, n - кількість напівтонів від базової ноти. Додатні значення - вверх, від'ємні - вниз. Зазвичай за базову ноту беруть "ля" першої октави, і її частоту - 440 Гц, але це не обовʼязково.
Але в метода з tone()/delay() є недоліки. По-перше, delay() виконується процесором, і в цей час він не може робити нічого іншого.
По-друге, tone() обчислює дільник таймера по частоті в рантаймі, що не дуже ефективно. Можна розрахувати дільники заздалегідь при компіляції, і в рантаймі завантажувати їх безпосередньо в регістр таймера. Тим більше для низьких нот похибка в половину герца вже становить десятки центів і відчутна вухом.
Можна поєднати відтворення окремих нот з ШІМ і отримати щось схоже на поліфонію. Для апаратного ШІМ в ардуіно скоріш за все доведеться використовувати TIM1 або TIM2, тому що TIM0 ардуіно використовує для своїх потреб.
Вибір оптимального метода залежить від конкретних вимог і можливостей заліза.
UPD: перемикати пін в OUTPUT не потрібно, tone() це робить сама: Tone.cpp:255