Генерация частоты при помощи tone() на двух выводах, регуляция энкодером

Всем здравствуйте. Есть стандартный экран с энкодером RepRapDiscountFullGraphicSmartController, RAMPS и Mega 2560.
Также есть такой скетч, который делает следующее – генерируется частота с помощью tone() и выводится на экран, частота регулируется потенциометром. Переделать надо так, чтобы частота изменялась не потенциометром, а энкодером в диапазоне от 1000 до 10000 герц с шагом 500 гц, а также чтобы эта частота была на выходах 26 и 36, как известно, tone() может работать одновременно только на одном порте, поэтому нужно сделать какой-то быстрый переброс или другой фокус, чтобы она была на этих двух портах. Отблагодарю на Сбер :wink:

#include <U8glib.h>

#define DOGLCD_CS       16
#define DOGLCD_MOSI     17
#define DOGLCD_SCK      23
#define BTN_EN1         31
#define BTN_EN2         33
#define pson            5

const int potPin = A1;
const int StepA = 26;
const int StepB = 36;

int potValue = 0;
int frequency = 1000; 

U8GLIB_ST7920_128X64_1X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS);
void setup(void) {
  u8g.begin();
  pinMode(StepA, OUTPUT);
  pinMode(StepB, OUTPUT);
  pinMode(pson, OUTPUT);
  u8g.setColorIndex(1);   
}

void loop() {
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_unifont);
    u8g.setPrintPos(30, 30); 
    u8g.print(frequency);
    u8g.print(" Hz");
  } while (u8g.nextPage());

  potValue = analogRead(potPin);
  frequency = map(potValue, 0, 1023, 1000, 10000); 

  tone(StepA,  frequency);
  tone(StepB, frequency);
  
  digitalWrite(pson, HIGH);
}

2тр fridgetester@mail.ru

пины выходов изменить скорее всего не получится.

Для подключения энкодера дорого. Жду более выгодных предложений.

Жги дальше! :joy:

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

Не поверишь, Вася, написал в ChatGPT и за 2 секунды получил ответ БЕСПЛАТНО! Роботы отнимают работку у вас аднака, меркантильные “мешки с костями (с)” :rofl:

класс, токо ты смотри шоб они тебе в штаны не насрали, а то бывали случаи.

1 лайк

Итак, уважаемые знатоки, по итогу игры 100 евро отправляются ChatGPT!

Я безумно рад за тебя и чатгпт, Вы двое - пара. Не пиши тут больше ничего. Я сильно грустить начинаю, бухаю, а мне доктор запретил и @ua6em потом шутки не понимает мои…

“Не пиши тут больше ничего” - прошу прощения за наглость, не расценивайте как хамство, позвольте поинтересоваться, а Вы тут, собственно, кто?!
ПыСы Здоровье надо беречь, может тебе проще не заходить на форум, если все так плохо? Тут ведь могут и “Динаху” сказать…

Можно посмотреть ответ chatgpt?

да ясно же что чешет)

ОГА, чешу…

#include <U8glib.h>
#include <Encoder.h>
#define DOGLCD_CS       16
#define DOGLCD_MOSI     17
#define DOGLCD_SCK      23
#define pson            5

Encoder myEncoder(33, 31);

const int potPin = A1;
const int tonePin = 26;

long currentFrequency = 1000; // Начальная частота
long previousPosition = -999;

U8GLIB_ST7920_128X64_1X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS);
void setup(void) {
  u8g.begin();
pinMode(tonePin, OUTPUT);
  pinMode(pson, OUTPUT);
  u8g.setColorIndex(1);   
}

void loop() {

  long newPosition = myEncoder.read() / 4;

  if (newPosition != previousPosition) {
    currentFrequency = map(newPosition, 0, 180, 1000, 10000);
    tone(tonePin, currentFrequency);
    previousPosition = newPosition;
  }

  tone(tonePin,  currentFrequency);

u8g.firstPage();
  do {
    u8g.setFont(u8g_font_unifont);
    u8g.setPrintPos(30, 30); 
    u8g.print(currentFrequency);
    u8g.print(" Hz");
  } while (u8g.nextPage());
  
  digitalWrite(pson, HIGH);
}

ааа, ну чЁ, классно))
зачем 30 дублирует 34?
и это где?

О как, теперь чатгпт неотформатированный и частично прокоментированный код выдает.

1 лайк

Так я уже почистил его и пины назначил свои, добавил сигнал PSON.

Я хотел увидеть, как чатгпт решил задачу про tone на двух пинах. А то все рассказывают про волшебство ИИ, а я как ни спрошу - получаю фигу. А что чатгпт может дать пример подключения экондера, коими весь интернет завален — это не секрет.

1 лайк

ага, на ESP32, да чтобы работал и конфликтовал, да без пропусков - не верю

Чего? На esp32 есть железный обработчик энкодера, работает идеально, и с чем ему там конфликтовать?

1 лайк

не знаю, я использовал рекомендуемую arduino.cc библиотеку, конфликтует