вам нужно создать тахометр, но не с датчиком холла, а с фоторезистором и светодиодом
Прошу прощения, не могли бы вы помочь мне создать это устройство на базе 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);
}
@Aviva Jппаин, 👍-2
Обсуждение1 ответ
Это близко к тому, что вы пытаетесь сделать.
https://www.pcbway.com/project/shareproject/Arduino_Tachometer_RPM_meter_with_IR_sensor_module_0769c1d8.html
Вот тахометр (измеритель оборотов) на Arduino с модулем ИК-датчика. Это простой способ создать тахометр, отображающий результат на OLED-дисплее в виде числа оборотов и индикатора выполнения. Что касается вашего кода, на переключение состояния кнопки может влиять дребезг. Добавьте небольшую задержку после обнаружения нажатия кнопки, чтобы устранить дребезг.
пожалуйста, не отвечайте на школьные вопросы, не показав никаких усилий, @jsotola
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Arduino nano как клавиатура HID
- Питание светодиодной ленты - Сколько ампер?
- Самый компактный способ питания Arduino от розетки
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
есть ли проблема с программой?... сообщите нам, если у вас возникнет проблема, @jsotolaвам нужно создать тахометр... это похоже на школьное задание... пожалуйста, покажите свою работу и объясните, где вы застряли, @jsotolaВы тестировали свой код на оборудовании? Если да, то чего вы ожидали и что именно произошло?, @chrisl
Маловероятно, что вы сможете сделать это с ["фоторезистором"](https://en.wikipedia.org/wiki/Photoresistor), если только измеряемые вами обороты не составляют секунды! Причина? Номинальное время задержки включения фоторезистора составляет 10 мс. Однако номинальное время задержки выключения может достигать секунды., @st2000