Ви не увійшли.

Світловий бар'єр 1 - OUT 1
Світловий бар'єр 2 - OUT 2
Неактивний

Датчики то фігня, а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..

Датчики то фігня, а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..
Цього я не знаю, як і багато іншого
Неактивний

Того ніхто не знає (ц)
Вдалось прочитати повідомлення?
так
Неактивний

а ось зрозуміти, як цей форум працює, що якісь повідомлення видно зразу, якісь ні..
Наскільки розумію, воно занадто рано створює посилання на нову сторінку стрічки (оті [ 1 2 3 4 ] вгорі біля теми), і при відповіді автоматично перекидає на ту неіснуючу сторінку. Якщо повернутись на попередню сторінку, то повідомлення стає видно.
Неактивний

А ось деякі свої повідомлення я не бачу. Але якщо почну писати нове повідомлення, і натисну preview - тоді побачу 

Для реалізації лічильника обертів із моторчика CD-ROM і виводу на TM1637, спершу переконайся, що мотор дає чіткі імпульси — краще використовувати енкодер. Підключи його до цифрових пінів, наприклад D2 і D3, і відстежуй зміну станів для визначення напрямку. Лічильник має інкрементуватися або декрементуватися, переходити з 9999 на 0000 і навпаки. Для скидання — окрема кнопка на піні, яка обнуляє значення. Використовуй бібліотеки TM1637Display та Encoder.
Неактивний

Беремо оптопару з опто мишки
Принцип роботи: Кулко з прорізами обертається між ІЧ-випромінювачем та приймачем оптопари.
При кожному проходженні прорізу сигнал на піні змінюється (LOW - HIGH).
Вважаємо кількість імпульсів.
За замовчуванням: 1 імпульс = 1 проріз. Але нам потрібно: 1 оборот = N прорізів > калібрування.
Встанови через Arduino IDE > Скетч > Підключити бібліотеку > Керувати бібліотеками: 
TM1637Display (автор: avishorp)
    
Як калібрувати: 
Запусти пристрій. Повертай колесо рівно один оборот. Натисніть кнопку "Калібрування" - екран покаже "CAL". Зроби один повний оборот. Знову натисніть "Калібрування" - пристрій запам'ятає кількість імпульсів за оборот.
Або два датчики Холла, зсунуті по колу на 1/4 кроку між магнітами → вийде квадратурний сигнал. 
Варіанти: 
    Один магніт + два датчики - зміщені на 45-90 ° механічно

#include <TM1637Display.h>
// Пины
#define CLK 2
#define DIO 3
#define PIN_A 4
#define PIN_B 5
#define BTN_RESET 6
#define BTN_CAL 7
// TM1637 дисплей
TM1637Display display(CLK, DIO);
// Переменные
volatile long pulseCount = 0;        // счётчик импульсов
long revolutions = 0;                // количество оборотов
int pulsesPerRevolution = 24;        // калибровочное значение (по умолчанию 24 прорези на оборот)
bool calibrating = false;            // режим калибровки
unsigned long lastTime = 0;
// Предварительное объявление
void updateDisplay();
void ICACHE_RAM_ATTR onPulse();
void setup() {
  pinMode(PIN_A, INPUT_PULLUP);
  pinMode(PIN_B, INPUT_PULLUP);
  pinMode(BTN_RESET, INPUT_PULLUP);
  pinMode(BTN_CAL, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(PIN_A), onPulse, CHANGE);
  attachInterrupt(digitalPinToInterrupt(PIN_B), onPulse, CHANGE);
  display.setBrightness(0x0f); // максимальная яркость
  Serial.begin(9600);
}
void loop() {
  static unsigned long lastDebounce = 0;
  int readingReset = digitalRead(BTN_RESET);
  int readingCal = digitalRead(BTN_CAL);
  // Кнопка сброса
  if (readingReset == LOW && millis() - lastDebounce > 200) {
    pulseCount = 0;
    revolutions = 0;
    updateDisplay();
    lastDebounce = millis();
  }
  // Кнопка калибровки
  if (readingCal == LOW && millis() - lastDebounce > 200) {
    calibrating = !calibrating;
    if (calibrating) {
      // Выводим "CAL" на дисплей
      uint8_t data[] = {0b00111001, 0b00001110, 0b00111001, 0b00111001}; // "CAL"
      display.setSegments(data);
    } else {
      // Выход из калибровки — считаем, что 1 оборот = текущее значение |pulseCount|
      if (abs(pulseCount) > 0) {
        pulsesPerRevolution = abs(pulseCount);
      }
      pulseCount = 0;
      revolutions = 0;
    }
    delay(300); // антидребезг
    lastDebounce = millis();
  }
  // Обновляем обороты раз в 100 мс
  if (millis() - lastTime > 100) {
    if (!calibrating) {
      revolutions = pulseCount / pulsesPerRevolution;
    }
    updateDisplay();
    lastTime = millis();
  }
}
// Обработка изменения сигнала на A или B
void ICACHE_RAM_ATTR onPulse() {
  static uint8_t lastState = 0;
  uint8_t state = (digitalRead(PIN_A) << 1) | digitalRead(PIN_B);
  if (state != lastState) {
    // Квадратурный декодер
    switch (lastState) {
      case 0b00:
        if (state == 0b01) pulseCount--;
        else if (state == 0b10) pulseCount++;
        break;
      case 0b01:
        if (state == 0b11) pulseCount--;
        else if (state == 0b00) pulseCount++;
        break;
      case 0b11:
        if (state == 0b10) pulseCount--;
        else if (state == 0b01) pulseCount++;
        break;
      case 0b10:
        if (state == 0b00) pulseCount--;
        else if (state == 0b11) pulseCount++;
        break;
    }
    lastState = state;
  }
}
// Обновление дисплея
void updateDisplay() {
  if (calibrating) return;
  // Показываем обороты (с учётом знака)
  char str[5];
  sprintf(str, "%4ld", revolutions);
  display.showNumberDec(revolutions, false, 4, 0);
}Остання редакція nickjust (2025-08-26 18:38:58)
Неактивний