Добрый день, спасибо вам за отклики я сегодня займусь подтяжкой, нарисовал схему как сейчас все подключено и как нужно сделать подтяжку к земле (можете посмотреть верно ли?).
Изменил код ( у нас коленвал в течении одного цикла совершает 2 оборота поэтому магнит проходи мимо датчика 2 раза, следовательно обороты х2, нам нужно чтобы в выводе были обороты \2).
Возникли 2 новых вопроса, мы хотим сделать “прибор” переносным, т.е чтобы не устанавливать стационарно, проехал, снял логи, настроился снова проехал снял логи проверил, и так с несколькими картами. А так как датчик холла придется крепить кастомно, у нас есть особенности с маховиками и магнитами, то проще наверное сделать как то по другому.
Поэтому возникли следующие вопросы
-
Больше уже по схемотехнике, возможно ли реализовать снятие импульса с провода зажигания а не с датчика холла, как я понимаю нужен датчик чтобы ловить всплеск, далее конвертация получается в цифровой сигнал и передача на пин в ардуино. По принципу как сделано на автомобильных стробоскопах прищепка на высоковольтный провод, так же на некоторых универсальных лодочных тахометрах реализован провод который обматывается вокруг провода ВВ и с него идет считывание оборотов.
-
У нас в выводе AFR в вольтах, а хотелось бы получить его в единицах, где 0В - 10 AFR, 5В - 20 AFR. т.е нужно преобразование на выводе в порт и запись на карту чтобы допустим при 1В-12 2В-14 2.5В-15 2.75В-15.5 единиц AFR. На всякий случай укажу из тех.документации на контроллер данные: Linear Output: 0[v]@0.68[Lambda] linear to 5[v]@1.36[Lambda], 10[AFR] linear to 20[AFR] equivalent for gasoline. Не могу сообразить как сделать это?
#include <SPI.h>
#include <SD.h>
unsigned long lastflash;
int RPM;
int analogValue; // Переменная для хранения значения с аналогового пина
File dataFile;
void setup() {
Serial.begin(9600); // Открыть порт
// Инициализация SD карты
if (!SD.begin(10)) { // Номер пина CS может быть другим, проверьте подключение
Serial.println("Ошибка инициализации SD карты!");
return;
}
// Создание или открытие файла для записи данных
dataFile = SD.open("data.txt", FILE_WRITE);
if (dataFile) {
dataFile.println("RPM,AFR");
dataFile.close();
} else {
Serial.println("Ошибка открытия файла для записи!");
}
attachInterrupt(0, sens, RISING); // Подключить прерывание на 2 пин при повышении сигнала
}
void sens() {
unsigned long currentTime = micros();
if (lastflash != 0) { // Убедиться, что lastflash уже установлен
RPM = 60 / ((float)(currentTime - lastflash) / 1000000); // Расчет
}
lastflash = currentTime; // Запомнить время последнего оборота
}
void loop() {
if ((micros() - lastflash) > 1000000) { // Если сигнала нет больше секунды
RPM = 0; // Считаем что RPM 0
}
// Чтение значения с аналогового пина A0
analogValue = analogRead(A0);
// Преобразование значения в напряжение (0-5В)
float AFR = analogValue * (5.0 / 1023.0);
// Деление RPM на 2
int halfRPM = RPM / 2;
// Вывод значений в порт
Serial.print("RPM: ");
Serial.print(halfRPM);
Serial.print(" AFR: ");
Serial.println(AFR, 2); // Округляем до 2 знаков после запятой
// Открытие файла для записи данных
dataFile = SD.open("data.txt", FILE_WRITE);
if (dataFile) {
dataFile.print(halfRPM);
dataFile.print(",");
dataFile.println(AFR, 2); // Запись значения AFR с двумя знаками после запятой
dataFile.close();
} else {
Serial.println("Ошибка открытия файла для записи!");
}
delay(500); // Задержка для стабильности
}
