Добрый день не подскажете по softSerial. Точнее как сделать не аппаратный сериал порт. И на какие контакты его лучше выводить. А то хочу сделать голосовое уведомления с мп3 модуля но не охота занимать аппаратный порт. Да и вообще не нашёл можно ли его на нано реализовать. С аппаратным вроде как разобрался. Спасибо!!!
Всем здравия!!! Сильно не ругайте. Вот какое-то время спустя. Прочитав не скажу что зубрил а лишь прочёл книги что рекомендовали. кое что под черпнув с форума. Своял вот сие чудо. ниже привожу своё убожество;)
#include <Wire.h> // подключаем библиотеку для работы с шиной I2C
#include <Servo.h>
#include <OneWire.h> // подключаем библиотеку для работы датчика температуры
#include <SPI.h>
#include <Eeprom24C01_02.h>
#include <SD.h>
#include <Adafruit_BMP085.h>
#include <DallasTemperature.h>
#include <LCD_1602_RUS.h> // подключаем библиотеку для работы с LCD дисплем
#include <iarduino_RTC.h> // подключаем библиотеку для работы с RTC модулем
#include <DS3232RTC.h>
#define EEPROM_ADDRESS 0x50
#define ONE_WIRE_BUS 35
#include <DFPlayer_Mini_Mp3.h>
LCD_1602_RUS lcd(0x3F, 16, 2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
LCD_1602_RUS lcd1(0x27, 16, 2);
iarduino_RTC time(RTC_DS3231); // объявляем переменную для работы с RTC модулем, указывая название модуля
DS3232RTC myRTC;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_BMP085 bmp;
Servo myservo;
Servo myservo1;
Servo myservo2;
int UgolServo;
int UgolServo1;
int UgolServo2;
const int analogIn = A0;
int Analog1Value = A1;
int Analog2Value = A2;
int Analog3Value = A3;
float val = 0;
int Water;
byte Oil;
byte fuel;
int Analog4Value = A4;
int Analog5Value = A5;
static Eeprom24C01_02 eeprom(EEPROM_ADDRESS);
int flag=0;
int flag1 = 0;
int mimenu=1;
int mimenu_oshibok=1;
byte knopka_menu = 22; //кнопка реле
byte knopka_up = 23; //кнопка прокрутки меню
byte knopka_down = 24;
byte knopka_pech = 25;
byte rele = 26;
byte rele1 = 27;
byte rele2 = 28;
byte handbrake = 29;
byte right_door = 30;
byte left_door = 31;
byte washer = 32;
byte Water_level = 33;
byte Brake_fluid = 34;
// 35 дачик дс18б20
byte front_pads = 36;
byte rear_pads = 37;
byte knopka = 38;
byte knopka_steklo = 39;
byte Tachometer = 40;
byte Speedometer = 41;
byte rezerv = 42;
byte rezerv1 = 43;
int solon = 12; // выход на светодиод
int tuman = 11; // выход на светодиод
int diod = 10;
int yarkost = 0; //переменая хранящая яркость
int zero = 0; //переменая хранящая яркость
int yarkost_handbrake = 20; //переменая хранящая яркость
int yarkost_tuman = 254; //переменая хранящая яркость
unsigned long interval = 600000;
unsigned long prev = 0;
unsigned long interval1;
unsigned long interval2;
unsigned long interval3;
unsigned long interval4;
unsigned long interval5;
unsigned long interval6;
unsigned long interval7;
void setup() {
Serial.begin (9600);
Serial1.begin (9600);
/* eeprom.initialize();
const byte address = 0;
const byte address1 = 1;
const byte address2 = 2;
eeprom.writeByte(address, 0xAA); //записываем в 0вую ячейку АА
eeprom.writeByte(address1, 0x28);
eeprom.writeByte(address2, 120);
delay(10); //ждём 0.1секу. Это надо для записи
byte data = eeprom.readByte(address); //Читаем с 0вой ячейки
byte data1 = eeprom.readByte(address1);
byte data2 = eeprom.readByte(address2);
Serial.print("Read byte = 0x"); //Выводим в монитор что в ячейке
Serial.print(data, HEX); //Выводим в монитор что в ячейке
Serial.println("");
Serial.print(data1, HEX);
Serial.println(""); //Выводим в монитор что в ячейке
Serial.print(data2);
Serial.println("");
*/ mp3_set_serial (Serial1);
mp3_set_volume (30);
//time.settime(2020, 12, 20 0,35,12);
time.gettime(RTC_DS3231); // Установить 18 часов, 24 минут, 0 секунд, а дату оставить без изменений.
myRTC.begin();
time.begin(); // инецилизируем часы
// time.gettime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
bmp.begin();
sensors.begin();
lcd.init(); //инецилизируем LCD
lcd1.init();
lcd.backlight(); // включаем подсветку LCD
lcd1.backlight();
pinMode(knopka_menu, INPUT_PULLUP); // кнопка меню выбор
pinMode(knopka_up, INPUT_PULLUP); //кнопка +
pinMode(knopka_down, INPUT_PULLUP); //кнопка -
pinMode(knopka_pech, INPUT_PULLUP); //кнопка печка
pinMode(rele, OUTPUT); // выход на реле
pinMode(rele1, OUTPUT); // выход на реле
pinMode(rele2, OUTPUT); // выход на реле
pinMode(handbrake, INPUT_PULLUP); // резистор 1к к + от кнопки через диод к контакту
pinMode(right_door, INPUT_PULLUP); // резистор 1к к + от кнопки через диод к контакту
pinMode(left_door, INPUT_PULLUP); // резистор 1к к + от кнопки через диод к контакту
pinMode(washer, INPUT_PULLUP); //омыватель
pinMode(Water_level, INPUT_PULLUP); //уровень воды
pinMode(Brake_fluid, INPUT_PULLUP); //тормазная жидкость
pinMode(front_pads, INPUT_PULLUP); //передние колодки
pinMode(rear_pads, INPUT_PULLUP); //задние колодки
pinMode(knopka, INPUT_PULLUP);
pinMode(knopka_steklo, INPUT_PULLUP);
pinMode(Tachometer, INPUT); //вход...
pinMode(Speedometer, INPUT); //вход...
pinMode(solon, OUTPUT); // выход на светодиод
pinMode(tuman, OUTPUT); // выход на светодиод
pinMode(diod, OUTPUT);
myservo.attach(7); //контакт сервы
myservo1.attach(8); //контакт сервы
myservo2.attach(9); //контакт сервы
lcd.setCursor(0, 0); //положения курсора экрана
lcd.print("Привет друг" ); //выводим приветствие
val = analogRead(A0);
val = val / 1024 * 56.6; // делитель на резисторах 10k 100k
if (val < 12 ) { // условия измерения акумулятора при старте
mp3_play (5); // отпровляем в порт mp3 плеера команду на воспроизведения файла
delay(5000);
}
if (bmp.readPressure() < 100100 ) { // условия измерения давления при дожде
mp3_play (8); // отпровляем в порт mp3 плеера команду на воспроизведения файла
delay(5000);
}
delay(2000);
lcd.clear(); //очищаем экран
}
void loop() {
val = analogRead(A0);
val = val / 1024 * 56.6; // делитель на резисторах 10k 100k
Analog1Value = analogRead(A1);
Analog2Value = analogRead(A2);
Analog3Value = analogRead(A3);
Water = map (Analog1Value, 0, 1024, 130, -10); // резистор 1к +
Oil = map (Analog2Value, 0, 360, 0,9); // резистор 1к +
fuel = map (Analog3Value, 0, 360, 50, -36); // резистор 1к +
Analog4Value = analogRead(A4);
UgolServo = map (Analog4Value, 0, 1024, 0, 180);
UgolServo1 = map (Analog4Value, 0, 1024, 0, 180);
myservo.write(UgolServo);
myservo1.write(UgolServo1);
sensors.requestTemperatures();
/*
(Serial.available()==0); //проверяем пришло ли что в сериал порт
int vag = Serial.read() - '0';
if (vag == 1)// если в порт пришол единица
{
Serial.println("led is on");//пишим в порт светодиод включен
digitalWrite(ledPin,HIGH);// включаем светодиод
lcd1.setCursor(0, 0);
lcd1.print("led is on");
}
if (vag == 0)// если в порт пришол ноль
{
Serial.println("Led is off");//пишим в порт светодиод выключен
digitalWrite(ledPin, LOW);// выключаем светодиод
lcd1.setCursor(0, 0);
lcd1.print("led is off");
}
*/
if(digitalRead(knopka_menu) == LOW&&flag==0){
mimenu++;
lcd.clear(); //очищаем экран
flag=1;
if(mimenu>7)
{
mimenu=1;
}
}
if(digitalRead(knopka_menu) == HIGH&&flag==1){
flag=0;
}
if(mimenu==1){
lcd.setCursor(4, 0);
lcd.print(time.gettime("H:i:s"));
lcd.setCursor(0, 1);
lcd.print(time.gettime(" d-m-D-Y"));
}
if(mimenu==2){
lcd.setCursor(0, 0);
lcd.print(val, 1);
lcd.print("Вольт");
lcd.setCursor(0, 1);
lcd.print(Water, 1);
lcd.print((char)223); // знак градуса
lcd.print("Вода");
}
if(mimenu==3){
lcd.setCursor(0, 0);
lcd.print(fuel, 1);
lcd.print("Бензин");
lcd.setCursor(0, 1);
lcd.print(Oil, 1);
lcd.print("Масло");
}
if(mimenu==4){
lcd.setCursor(0, 0);
lcd.print(UgolServo);
lcd.print("Ноги");
lcd.setCursor(0, 1);
lcd.print(UgolServo1);
lcd.print("Лицо");
}
if(mimenu==5){
lcd.setCursor(0, 0);
lcd.print (" Старт ");
lcd.setCursor(0, 1);
unsigned long t=millis()/1000;{
if (t/60/60<10) { lcd.print ("0"); }
lcd.print (t/60/60);
lcd.print (":");
if (t/60%60<10) { lcd.print ("0"); }
lcd.print ((t/60)%60);
lcd.print (":");
if (t%60<10) { lcd.print ("0"); }
lcd.print (t%60);
}}
if(mimenu==6){
lcd.setCursor(0, 1);
lcd.print(sensors.getTempCByIndex(0),1);
lcd.print((char)223);
lcd.setCursor(0, 0);
lcd.print(" Температура в ");
//lcd.print("davlenie=");
//lcd.print(bmp.readPressure()*0.007500617);
//lcd.print("mmHg");
}
if(mimenu==7){
lcd.setCursor(0, 0);
lcd.print("Температура");
lcd.print(bmp.readTemperature());
lcd.print((char)223);
lcd.setCursor(0, 1);
lcd.print("Давление ");
lcd.print(bmp.readPressure());
lcd.print("Pa");
}
if (digitalRead(knopka_steklo) == LOW && digitalRead(Tachometer) == HIGH )
{
lcd1.setCursor(10, 1);
lcd1.print("*");
digitalWrite(rele, HIGH );
prev = millis();
}
if ( millis() - prev >= interval )
{
prev = millis();
lcd1.setCursor(10, 1);
lcd1.print(" ");
digitalWrite(rele, LOW);
}
if (digitalRead(left_door) == LOW && digitalRead(Speedometer) == HIGH ){
if (millis() - interval1 > 10000) { // Вместо 10000 подставьте нужное вам значение паузы
interval1 = millis();
mp3_play (1);
}
}
if (digitalRead(right_door) == LOW && digitalRead(Speedometer) == HIGH ) { //
if (millis() - interval2 > 10000) { // Вместо 10000 подставьте нужное вам значение паузы
interval2 = millis();
mp3_play (2);
}
}
if (digitalRead(handbrake) == LOW && digitalRead(Speedometer) == HIGH ) { //
if (millis() - interval3 > 10000) { // Вместо 10000 подставьте нужное вам значение паузы
interval3 = millis();
mp3_play (3);
}
}
if (val < 12 && digitalRead(Tachometer) == HIGH ) { //
if (millis() - interval4 > 10000) { // Вместо 10000 подставьте нужное вам значение паузы
interval4 = millis();
mp3_play (4);
}
}
if (Water > 98 && digitalRead(Tachometer) == HIGH ) { //
if (millis() - interval5 > 10000) { // Вместо 10000 подставьте нужное вам значение паузы
interval5 = millis();
mp3_play (6);
}
}
if (Oil < 1 && digitalRead(Tachometer) == HIGH ) { //
if (millis() - interval6 > 10000) { // Вместо 10000 подставьте нужное вам значение паузы
interval6 = millis();
mp3_play (7);
}
}
// свет в солоне
if (digitalRead(left_door) == LOW || digitalRead(right_door)== LOW) {
yarkost += 2;
if (yarkost > 254){
yarkost == 254;
}
yarkost = constrain(yarkost, 0, 254);
analogWrite(solon,yarkost);
}
else{
yarkost -= 10;
if (yarkost < 0){
yarkost == 0;
}
yarkost = constrain(yarkost, 0, 254);
analogWrite(solon,yarkost);
}
//туманки
if(digitalRead(Tachometer) == LOW ) {
zero = constrain(zero, 0, 254);
analogWrite(tuman,zero);
}
if (digitalRead(handbrake) == LOW && digitalRead(Tachometer) == HIGH ) {
yarkost_handbrake = constrain(yarkost_handbrake, 0, 254);
analogWrite(tuman,yarkost_handbrake);
}
if (digitalRead(handbrake) == HIGH && digitalRead(Tachometer) == HIGH ){
yarkost_tuman = constrain(yarkost_tuman, 0, 254);
analogWrite(tuman,yarkost_tuman);
}
}
Если работает как задумано, то и норм, первые программы как то так и выглядят. Массивы и прочее нужно чтобы по пять раз не писать в коде блоки вроде такого
if (digitalRead(right_door) == LOW && digitalRead(Speedometer) == HIGH ) {
if (millis() - interval2 > 10000) { // Вместо 10000 подставьте нужное вам значение паузы
interval2 = millis();
mp3_play (2);
}
}
вы делаете одинаковый набор действий над однотипными элементами, можно обернуть это в цикл (ну вот как раз таки в for), а изменяемые части прописать так: if (digitalRead(datchick[i])... if (millis() - interval[i] > delayint[i])... mp3_play(i);
Спасибо за пример. Буду пробовать, это ещё не конечный результат. Планирую воткнуть энкодер и связать ещё две ардуинки. По сериалу которые будут пересылать данные тахометра, спидометра, одометра. Плюс задумка вывод всего на на Nextion или как вариант андроид с возможностью передачи по сети и управления климатом. Так что мне ещё грызть и грызть гранит науки.
Спасибо за пример. Буду пробовать, это ещё не конечный результат. Планирую воткнуть энкодер и связать ещё две ардуинки. По сериалу которые будут пересылать данные тахометра, спидометра, одометра. Плюс задумка вывод всего на на Nextion или как вариант андроид с возможностью передачи по сети и управления климатом. Так что мне ещё грызть и грызть гранит науки.
как только минутка свободная есть, так грызу букварь. все примеры что в букваре были перепробовал. Сложность начинается когда один пример с другим скрещивать начинаю. Вот тут все подводные камни и вылазят. То-есть не знания азбуки пытаюсь писать тексты. Я вот сейчас на таймерах застрял. Благо с миллис хоть чу-чуть разобрался и то понимаю что лишь малость.
означает минус интервал в виде 10000 который записывается в переменную interval. и по достижению значения включает MP3. Это я так и положения вышел, чтоб пока трек не доиграет заново не начнется. так как каждый цикл ардуино он начинает играть с ночала.
означает минус интервал в виде 10000 который записывается в переменную interval. и по достижению значения включает MP3. Это я так и положения вышел, чтоб пока трек не доиграет заново не начнется. так как каждый цикл ардуино он начинает играть с ночала.
А были бы мозги, изучил бы библиотеку и реализовал как положено, а не через одно место
У вас есть какая нибудь задача, которую без них сложно или невозможно решить ? Найдите такую, только интересную - должно помочь. Просто так изучать ради изучения тяжко, по себе знаю.
а может и не нужен щочик фор. может так, хотя нет, это тоже выглядит коряво...
if (millis() - prevtime > 10000) { // Вместо 10000 подставьте нужное вам значение паузы
bool play = 0;
if (digitalRead(Speedometer))
{
if (!digitalRead(left_door)) {mp3_play (1);play=1;}
if (!digitalRead(right_door)) {mp3_play (2);play=1;}
if (!digitalRead(handbrake)) {mp3_play (3);play=1;}
}
if (digitalRead(Tachometer))
{
if (val < 12) {mp3_play (4);play=1;}
if (Water>98) {mp3_play (6);play=1;}
if (Oil < 1) {mp3_play (7);play=1;}
}
if (play) prevtime = millis();
}
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
unsigned long lastflash;
int RPM;
void setup() {
Serial.begin(9600); //открыть порт
attachInterrupt(0, sens, RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
lcd.init();
lcd.backlight();
}
void sens() {
RPM = 60 / ((float)(micros() - lastflash) / 1000000); //расчет
lastflash = micros(); //запомнить время последнего оборота
}
void loop() {
if ((micros() - lastflash) > 1000000) { //если сигнала нет больше секунды
RPM = 0; //считаем что RPM 0
}
доброго дня, всем. Вопрос на засыпку почему показания прыгают от 600 до 8ста оборотов. Я уже что только не пробовал
С начала грешил что Некстион корректировки вносит. но и в сериал тоже нет стабильных оборотов. пробовал и на 1602. всю голову сломал. не пойму в чём дело.
С таймерами аппаратными, что в первом посте работает с погрешностью 40-60 оборотов. Но я пока мало с ними знаком. но такая погрешность меня устраивает. Вот и думаю может на них перейти. Но нормальной литературы не нашёл. Может кто даст ссылку на них. С РЦ не пробовал кондёр ставил без мазы.
А это тут при чём. С чего бы Я не мерил. не уж то вы думаете что мотор (электро двигатель) так шуметь может. хотя и они менялись. выше писал что на прерываниях, токая проблема.
попробую от пишусь. чёт я о РЦ не подумал. хотя о кондёре мысли были. грешил и на плохой контакт. но при появ, этот факт отпал. ранее и на свой говна код грешил. но пере пробовав множество кодов. как и свои знания по прерыванию. столкнулся с данной проблемой. вот и решил задать вопрос так сказать. знаю многие Гайвера тут терпеть не могут. но обратил внимания что даже на его видео он тормозит шлиф диск. типа вот работает. пробую его код таже фигня. так что тема остаётся открыта. мне ведь надо. не знать какие обороты может выдать (мотор) а сам факт стабильности оборотов. и может дуня их считать стабильно.
Ну хоть не обижаетесь и в позу не становитесь - уже хорошо.
Я бы тоже советовал softSerial для начала.
Добрый день не подскажете по softSerial. Точнее как сделать не аппаратный сериал порт. И на какие контакты его лучше выводить. А то хочу сделать голосовое уведомления с мп3 модуля но не охота занимать аппаратный порт. Да и вообще не нашёл можно ли его на нано реализовать. С аппаратным вроде как разобрался. Спасибо!!!
https://doc.arduino.ua/ru/prog/SoftwareSerial
http://wikihandbk.com/wiki/Arduino:%D0%91/SoftwareSerial
можно ли его на нано реализовать
Можно.
Спасибо!!!
подскажите, можно ли модуле PWM PC9685. Управлять серво приводами с помощью потенциометра и если это возможно. То какой командой.
В принципе - можно. Команды у PWM PC9685 - запись необходимых значений в регистры I2C: https://cdn-shop.adafruit.com/datasheets/PCA9685.pdf
Всем здравия!!! Сильно не ругайте. Вот какое-то время спустя. Прочитав не скажу что зубрил а лишь прочёл книги что рекомендовали. кое что под черпнув с форума. Своял вот сие чудо. ниже привожу своё убожество;)
Ты это полтора года писал ?
Хоть бы про массивы почитал, не говорю уже про структуры и классы...
да)
А зачем тут массивы?
А зачем тут массивы?
Ну, хотя бы для удобства.)
Заметили, что в скетче ни одного фора нет ? Автор за полтора года не смог настроить щочик фор. )
с циклом пробовал. Всё виснет на нем и пока он крутится, изображения тормозит. Вот и решил на милисс.
Если работает как задумано, то и норм, первые программы как то так и выглядят. Массивы и прочее нужно чтобы по пять раз не писать в коде блоки вроде такого
вы делаете одинаковый набор действий над однотипными элементами, можно обернуть это в цикл (ну вот как раз таки в for), а изменяемые части прописать так: if (digitalRead(datchick[i])... if (millis() - interval[i] > delayint[i])... mp3_play(i);
Спасибо за пример. Буду пробовать, это ещё не конечный результат. Планирую воткнуть энкодер и связать ещё две ардуинки. По сериалу которые будут пересылать данные тахометра, спидометра, одометра. Плюс задумка вывод всего на на Nextion или как вариант андроид с возможностью передачи по сети и управления климатом. Так что мне ещё грызть и грызть гранит науки.
Спасибо за пример. Буду пробовать, это ещё не конечный результат. Планирую воткнуть энкодер и связать ещё две ардуинки. По сериалу которые будут пересылать данные тахометра, спидометра, одометра. Плюс задумка вывод всего на на Nextion или как вариант андроид с возможностью передачи по сети и управления климатом. Так что мне ещё грызть и грызть гранит науки.
Такими темпами ещё лет 5 уйдет
Я не куда не спешу. А знания лишними не бывают. Это хобби.
По сериалу которые будут пересылать данные тахометра, спидометра, одометра. Плюс задумка вывод всего на на Nextion
Плохая идея, даже без Nextion одной ардуины для всего этого достаточно, интерфейс между двумя тоже геморрой, лучше не надо.
if (millis( ) - переменная потом ее значения НООО
ЧТО ОЗНАЧАЕТ толь тире толи згак минус после (millis)-
if (millis( ) - переменная потом ее значения НООО
ЧТО ОЗНАЧАЕТ толь тире толи згак минус после (millis)-
Учебник почитать настоятельно рекомендую
Рано вы такие вопросы задание. Ведь ещё не выяснено что значат m, i, l и то ли скобка, то ли смайлик после букв.
как только минутка свободная есть, так грызу букварь. все примеры что в букваре были перепробовал. Сложность начинается когда один пример с другим скрещивать начинаю. Вот тут все подводные камни и вылазят. То-есть не знания азбуки пытаюсь писать тексты. Я вот сейчас на таймерах застрял. Благо с миллис хоть чу-чуть разобрался и то понимаю что лишь малость.
означает минус интервал в виде 10000 который записывается в переменную interval. и по достижению значения включает MP3. Это я так и положения вышел, чтоб пока трек не доиграет заново не начнется. так как каждый цикл ардуино он начинает играть с ночала.
означает минус интервал в виде 10000 который записывается в переменную interval. и по достижению значения включает MP3. Это я так и положения вышел, чтоб пока трек не доиграет заново не начнется. так как каждый цикл ардуино он начинает играть с ночала.
А были бы мозги, изучил бы библиотеку и реализовал как положено, а не через одно место
пост 107, строки 28-31,36,37
... зачем одно общее название менять на другое? а потом еще и использовать их как переменные?
это я к тому, что имя переменной должно нести некий смысл или быть простой, на пример:
имеют смысл, а у вас черте что....
Я вот сейчас на таймерах застрял. Благо с миллис хоть чу-чуть разобрался и то понимаю что лишь малость.
В "Песочнице" есть ссылки на этюды от ЕвгенияП, в том числе и про таймеры.
У вас есть какая нибудь задача, которую без них сложно или невозможно решить ? Найдите такую, только интересную - должно помочь. Просто так изучать ради изучения тяжко, по себе знаю.
а может и не нужен щочик фор. может так, хотя нет, это тоже выглядит коряво...
в мп3 плеере пин busy есть для этого
в мп3 плеере пин busy есть для этого
Он там больше для красоты
Спасибо за пример. Возьму на заметку. Что уж по приличнее моего )
спасибо, намучался с ним
доброго дня, всем. Вопрос на засыпку почему показания прыгают от 600 до 8ста оборотов. Я уже что только не пробовал
код взял как пример. не важно какой бы я не пробовал. На прерываниях все брешут. Не один точно не показывает. нет стабильных оборотов
С начала грешил что Некстион корректировки вносит. но и в сериал тоже нет стабильных оборотов. пробовал и на 1602. всю голову сломал. не пойму в чём дело.
ардуинки менял, не помогло. грешил на питания ставил кренку 5в без изменений.
Кто же в прерывании занимается вычислениями, максимум получи значение микрос и то это точность 4 микросекунды, надо делать на таймерах
А с чего снимается сигнал ?
Кто же в прерывании занимается вычислениями, максимум получи значение микрос и то это точность 4 микросекунды, надо делать на таймерах
а микрос не на таймерах теперь
с датчика холла
Я этот код ка пример положил. Выносил все вычисления в луп. те жэ яйца только в профиль
Скорее всего надо шумы сигнала отфильтровать через R C цепочку...
С таймерами аппаратными, что в первом посте работает с погрешностью 40-60 оборотов. Но я пока мало с ними знаком. но такая погрешность меня устраивает. Вот и думаю может на них перейти. Но нормальной литературы не нашёл. Может кто даст ссылку на них. С РЦ не пробовал кондёр ставил без мазы.
Оптимально глянуть сигнал осциллографом.
Я снимаю сигнал с датчика скорости. Он тоже электромагнитный. Сигнал в автомобиле крайне загрязнен.
RPM = 60 / ((
float
)(micros() - lastflash) / 1000000);
надо заменить на
RPM = 60
000000/(
micros() - lastflash);
я пока не в машине, а на столе с обычного датчика холла пробую. так что грешить на шумы не приходится.
я пока не в машине, а на столе с обычного датчика холла пробую. так что грешить на шумы не приходится.
а обороты с чего меряете тогда?
http://arduino.ru/forum/proekty/virtualnyi-ostsillograf
Вот таким скетчем можно приблизительно глянуть что там происходит с сигналом.
Если не гребенка с пиками или провалами, то пробовать RC цепочку.
А это тут при чём. С чего бы Я не мерил. не уж то вы думаете что мотор (электро двигатель) так шуметь может. хотя и они менялись. выше писал что на прерываниях, токая проблема.
попробую от пишусь. чёт я о РЦ не подумал. хотя о кондёре мысли были. грешил и на плохой контакт. но при появ, этот факт отпал. ранее и на свой говна код грешил. но пере пробовав множество кодов. как и свои знания по прерыванию. столкнулся с данной проблемой. вот и решил задать вопрос так сказать. знаю многие Гайвера тут терпеть не могут. но обратил внимания что даже на его видео он тормозит шлиф диск. типа вот работает. пробую его код таже фигня. так что тема остаётся открыта. мне ведь надо. не знать какие обороты может выдать (мотор) а сам факт стабильности оборотов. и может дуня их считать стабильно.
Просто конденсатор - это легкое КЗ !