#501 Re: Програмування Arduino » Софт для газорозрядного годинника в середовищі Ардуїно. » 2023-12-02 12:12:11

З якою із частин яка конкретно проблема?
Будь-яку задачу, складнішу за блимання єдиним світлодіодом, декомпонуйте на простіші підзадачі і вирішуйте їх послідовно.
Спочатку реалізуйте індикацію, просто відображення довільних цифр.
Потім реалізуйте взаємодію з мікросхемою годинника по I²C, відображайте поточний час.
Далі реалізуйте обробку натиснення кнопок і перемикання внутрішнього стану. Меню - це класичний скінченний автомат, ознайомтесь із теорією автоматів.
Поступово доповнюйте функціонал, але беріться за наступну функцію після того як попередні вже працюють.

#502 Re: Програмування Arduino » передача данных по GPRS » 2023-12-01 19:12:19

За яким протоколом "сайт" очікує дані? "Сирий" TCP чи UDP? HTTP GET/PUT/POST? В якому форматі мають бути дані?
Прімітивний TCP сервер можна запустити за допомогою

$ socat TCP-LISTEN:8080 -

Звісно, хост, на якому запускається сервер, має бути доступний з GPRS-мережі.
Відслідковувати трафік можна, наприклад, за допомогою wireshark.

#503 Re: Програмування Arduino » Збір інформації для своїх мелодій,активний зуммер. » 2023-12-01 18:25:54

Існують різні методи. Можна відтворювати 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(&note, 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

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