вам нужно создать тахометр, но не с датчиком холла, а с фоторезистором и светодиодом

Прошу прощения, не могли бы вы помочь мне создать это устройство на базе Arduino? Вам нужно создать тахометр, но не с датчиком Холла, а с фоторезистором и светодиодом. Значение должно передаваться на экран по I2C.

Есть ли проблема с программой?

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET -1
#define PHOTO_PIN A3
#define LED_PIN 7
#define BUTTON_PIN 8  // Цифровой пин для кнопки
#define THRESHOLD 500

Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);

int rpm = 0;
float rads = 0;
unsigned long lastTime = 0;
bool state = 0;
int count = 0;
bool isRunning = false; // Флаг для измерения состояния
unsigned long blinkInterval = 500; // интервал мигания
unsigned long lastBlinkTime = 0; // последний раз, когда светодиод мигнул

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  pinMode(PHOTO_PIN, INPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // Установить контакт кнопки как вход с подтягиванием

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.print("RPM: ");
  display.setCursor(0, 10);
  display.print("rad/s:");
  display.display();
}

void loop() {
   if (digitalRead(BUTTON_PIN) == LOW) {  // Если кнопка нажата (состояние LOW)
        isRunning = !isRunning;          // Переключить состояние измерения
        while(digitalRead(BUTTON_PIN) == LOW); // Ждать отпускания кнопки

    }
   if(isRunning)
   {
     unsigned long currentTime = millis();
    if (currentTime - lastBlinkTime >= blinkInterval)
     {
       digitalWrite(LED_PIN, !digitalRead(LED_PIN));
       lastBlinkTime = currentTime;
     }


    int sensorValue = analogRead(PHOTO_PIN);

    if (state == 0 && sensorValue > THRESHOLD) {
        state = 1;
        lastTime = millis();
    }
    if (state == 1 && sensorValue < THRESHOLD){
        state = 0;
          unsigned long currentTime = millis();
          if (currentTime > lastTime){
            unsigned long interval = currentTime - lastTime;
            rpm = 60000 / interval;
            rads = (2*3.14159 * (float)rpm) / 60.0;
          }
          lastTime = currentTime;
    }
  }
    else
     digitalWrite(LED_PIN, LOW);

    // Печать на OLED
    display.fillRect(30, 0, 60, 8, SSD1306_BLACK); // правильный вызов здесь
    display.setCursor(30, 0);
    display.print(rpm);

    display.fillRect(30, 10, 60, 8, SSD1306_BLACK); // правильный вызов здесь
    display.setCursor(30, 10);
    display.print(rads);
    display.display();


    Serial.print("RPM: ");
    Serial.print(rpm);
    Serial.print("  rad/s: ");
    Serial.println(rads);
    delay(100);
}

, 👍-2

Обсуждение

есть ли проблема с программой? ... сообщите нам, если у вас возникнет проблема, @jsotola

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

Вы тестировали свой код на оборудовании? Если да, то чего вы ожидали и что именно произошло?, @chrisl

Маловероятно, что вы сможете сделать это с ["фоторезистором"](https://en.wikipedia.org/wiki/Photoresistor), если только измеряемые вами обороты не составляют секунды! Причина? Номинальное время задержки включения фоторезистора составляет 10 мс. Однако номинальное время задержки выключения может достигать секунды., @st2000


1 ответ


0

Это близко к тому, что вы пытаетесь сделать.

https://www.pcbway.com/project/shareproject/Arduino_Tachometer_RPM_meter_with_IR_sensor_module_0769c1d8.html

Вот тахометр (измеритель оборотов) на Arduino с модулем ИК-датчика. Это простой способ создать тахометр, отображающий результат на OLED-дисплее в виде числа оборотов и индикатора выполнения. Что касается вашего кода, на переключение состояния кнопки может влиять дребезг. Добавьте небольшую задержку после обнаружения нажатия кнопки, чтобы устранить дребезг.

,

пожалуйста, не отвечайте на школьные вопросы, не показав никаких усилий, @jsotola