подскажите, а лучше на примере моём покажите как избавится от делэев и настроить щочик фор

Green
Offline
Зарегистрирован: 01.10.2015

Ну хоть не обижаетесь и в позу не становитесь - уже хорошо.
Я бы тоже советовал softSerial для начала.

ВладимирN
Offline
Зарегистрирован: 14.11.2019

Добрый день не подскажете по  softSerial. Точнее как сделать не аппаратный сериал порт. И на какие контакты его лучше выводить. А то хочу сделать голосовое уведомления с мп3 модуля но не охота занимать аппаратный порт. Да и вообще не нашёл можно ли его на нано реализовать. С аппаратным вроде как разобрался. Спасибо!!! 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

https://doc.arduino.ua/ru/prog/SoftwareSerial
http://wikihandbk.com/wiki/Arduino:%D0%91/SoftwareSerial

Цитата:

можно ли его на нано реализовать

Можно.

 

ВладимирN
Offline
Зарегистрирован: 14.11.2019

Спасибо!!!

ВладимирN
Offline
Зарегистрирован: 14.11.2019

подскажите, можно ли модуле PWM PC9685. Управлять серво приводами с помощью потенциометра и если это возможно. То какой командой.

sadman41
Offline
Зарегистрирован: 19.10.2016

В принципе - можно. Команды у PWM PC9685 - запись необходимых значений в регистры I2C: https://cdn-shop.adafruit.com/datasheets/PCA9685.pdf

ВладимирN
Offline
Зарегистрирован: 14.11.2019

Всем здравия!!! Сильно не ругайте. Вот какое-то время спустя. Прочитав не скажу что зубрил а лишь прочёл книги что рекомендовали. кое что под черпнув с форума. Своял вот сие чудо. ниже привожу своё убожество;)

#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);
}
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ты это полтора года писал ?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Хоть бы про массивы почитал, не говорю уже про структуры и классы...

ВладимирN
Offline
Зарегистрирован: 14.11.2019

да) 

ВладимирN
Offline
Зарегистрирован: 14.11.2019

А зачем тут массивы?

bwn
Offline
Зарегистрирован: 25.08.2014

ВладимирN пишет:

А зачем тут массивы?

Ну, хотя бы для удобства.)

Morroc
Offline
Зарегистрирован: 24.10.2016

Заметили, что в скетче ни одного фора нет ? Автор за полтора года не смог настроить щочик фор.  )

ВладимирN
Offline
Зарегистрирован: 14.11.2019

с циклом пробовал. Всё виснет на нем и пока он крутится, изображения тормозит. Вот и решил на милисс.   

Morroc
Offline
Зарегистрирован: 24.10.2016

Если работает как задумано, то и норм, первые программы как то так и выглядят. Массивы и прочее нужно чтобы по пять раз не писать в коде блоки вроде такого

  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); 

ВладимирN
Offline
Зарегистрирован: 14.11.2019

Спасибо за пример. Буду пробовать, это ещё не конечный результат. Планирую воткнуть энкодер и связать ещё две ардуинки. По сериалу которые будут пересылать данные тахометра, спидометра, одометра. Плюс задумка вывод всего на на Nextion или как вариант андроид с возможностью передачи по сети и управления климатом. Так что мне ещё грызть и грызть гранит науки. 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ВладимирN пишет:

Спасибо за пример. Буду пробовать, это ещё не конечный результат. Планирую воткнуть энкодер и связать ещё две ардуинки. По сериалу которые будут пересылать данные тахометра, спидометра, одометра. Плюс задумка вывод всего на на Nextion или как вариант андроид с возможностью передачи по сети и управления климатом. Так что мне ещё грызть и грызть гранит науки. 

Такими темпами ещё лет 5 уйдет

ВладимирN
Offline
Зарегистрирован: 14.11.2019

Я не куда не спешу. А знания лишними не бывают. Это хобби.  

Morroc
Offline
Зарегистрирован: 24.10.2016

ВладимирN пишет:

По сериалу которые будут пересылать данные тахометра, спидометра, одометра. Плюс задумка вывод всего на на Nextion 

Плохая идея, даже без Nextion одной ардуины для всего этого достаточно, интерфейс между двумя тоже геморрой, лучше не надо. 

jz.tixas29
Offline
Зарегистрирован: 26.02.2021

if (millis( ) - переменная потом ее значения НООО 

ЧТО ОЗНАЧАЕТ толь тире толи згак минус после (millis)-

Kakmyc
Offline
Зарегистрирован: 15.01.2018

jz.tixas29 пишет:

if (millis( ) - переменная потом ее значения НООО 

ЧТО ОЗНАЧАЕТ толь тире толи згак минус после (millis)-

Учебник почитать настоятельно рекомендую

sadman41
Offline
Зарегистрирован: 19.10.2016

Рано вы такие вопросы задание. Ведь ещё не выяснено что значат m, i, l и то ли скобка, то ли смайлик после букв.

ВладимирN
Offline
Зарегистрирован: 14.11.2019

как только минутка свободная есть, так грызу букварь. все примеры что в букваре были перепробовал. Сложность начинается когда один пример с другим скрещивать начинаю. Вот тут все подводные камни и вылазят. То-есть не знания азбуки пытаюсь писать тексты. Я вот сейчас на таймерах застрял. Благо с миллис хоть чу-чуть разобрался и то понимаю что лишь малость. 

ВладимирN
Offline
Зарегистрирован: 14.11.2019

означает минус интервал в виде 10000 который записывается в переменную interval. и по достижению значения включает MP3. Это я так и положения вышел, чтоб пока трек не доиграет заново не начнется. так как каждый цикл ардуино он начинает играть с ночала.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ВладимирN пишет:

означает минус интервал в виде 10000 который записывается в переменную interval. и по достижению значения включает MP3. Это я так и положения вышел, чтоб пока трек не доиграет заново не начнется. так как каждый цикл ардуино он начинает играть с ночала.

А были бы мозги, изучил бы библиотеку и реализовал как положено, а не через одно место

Гриша
Offline
Зарегистрирован: 27.04.2014

пост 107, строки 28-31,36,37

028 	const int analogIn = A0;
029	int Analog1Value = A1;
030	int Analog2Value = A2;
031	int Analog3Value = A3;
036	int Analog4Value = A4;
037	int Analog5Value = A5;

... зачем одно общее название менять на другое? а потом еще и использовать их как переменные?

170	   Analog1Value = analogRead(A1);
171	  Analog2Value = analogRead(A2);
172	  Analog3Value = analogRead(A3);

это я к тому, что имя переменной должно нести некий смысл или быть простой, на пример:

170	   ToiletCisternPressure1  = analogRead(A1); 
171	   ToiletCisternLevel1  = analogRead(A2); 

имеют смысл, а у вас черте что....

bwn
Offline
Зарегистрирован: 25.08.2014

ВладимирN пишет:

Я вот сейчас на таймерах застрял. Благо с миллис хоть чу-чуть разобрался и то понимаю что лишь малость. 

В "Песочнице" есть ссылки на этюды от ЕвгенияП, в том числе и про таймеры.

Morroc
Offline
Зарегистрирован: 24.10.2016

ВладимирN пишет:
Я вот сейчас на таймерах застрял.

У вас есть какая нибудь задача, которую без них сложно или невозможно решить ? Найдите такую, только интересную - должно помочь. Просто так изучать ради изучения тяжко, по себе знаю.

MaksVV
Offline
Зарегистрирован: 06.08.2015

а может и не нужен щочик фор. может так, хотя нет, это тоже выглядит коряво...

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();
  }

 в мп3 плеере пин busy есть для этого 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

MaksVV пишет:

 в мп3 плеере пин busy есть для этого 

Он там больше для красоты

ВладимирN
Offline
Зарегистрирован: 14.11.2019

Спасибо за пример. Возьму на заметку. Что уж по приличнее моего )

ВладимирN
Offline
Зарегистрирован: 14.11.2019

спасибо, намучался с ним 

ВладимирN
Offline
Зарегистрирован: 14.11.2019
#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ста оборотов. Я уже что только не пробовал 

ВладимирN
Offline
Зарегистрирован: 14.11.2019

код взял как пример. не важно какой бы я не пробовал. На прерываниях все брешут. Не один точно не показывает. нет стабильных оборотов 

ВладимирN
Offline
Зарегистрирован: 14.11.2019

С начала грешил что Некстион корректировки вносит. но и в сериал тоже нет стабильных оборотов. пробовал и на 1602. всю голову сломал. не пойму в чём дело.

 

ВладимирN
Offline
Зарегистрирован: 14.11.2019

ардуинки менял, не помогло. грешил на питания ставил кренку 5в без изменений.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Кто же в прерывании занимается вычислениями, максимум получи значение микрос и то это точность 4 микросекунды, надо делать на таймерах

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А с чего снимается сигнал ?

rkit
Offline
Зарегистрирован: 23.11.2016

ua6em пишет:

Кто же в прерывании занимается вычислениями, максимум получи значение микрос и то это точность 4 микросекунды, надо делать на таймерах

а микрос не на таймерах теперь

ВладимирN
Offline
Зарегистрирован: 14.11.2019

с датчика холла

ВладимирN
Offline
Зарегистрирован: 14.11.2019

Я этот код ка пример положил. Выносил все вычисления  в луп.  те жэ яйца только в профиль

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Скорее всего надо шумы сигнала отфильтровать через R C цепочку...

ВладимирN
Offline
Зарегистрирован: 14.11.2019

С таймерами аппаратными, что в первом посте работает с погрешностью 40-60 оборотов. Но я пока мало с ними знаком. но такая погрешность меня устраивает. Вот и думаю может на них перейти. Но нормальной литературы не нашёл. Может  кто даст ссылку на них. С РЦ не пробовал кондёр ставил без мазы.

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Оптимально глянуть сигнал осциллографом.

Я снимаю сигнал с датчика скорости. Он тоже электромагнитный. Сигнал в автомобиле крайне загрязнен.

RPM = 60 / ((float)(micros() - lastflash) / 1000000);

надо заменить на 

RPM = 60000000/(micros() - lastflash);

ВладимирN
Offline
Зарегистрирован: 14.11.2019

я пока не в машине, а на столе с обычного датчика холла пробую. так что грешить на шумы не приходится. 

b707
Offline
Зарегистрирован: 26.05.2017

ВладимирN пишет:

я пока не в машине, а на столе с обычного датчика холла пробую. так что грешить на шумы не приходится. 

а обороты с чего меряете тогда?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

http://arduino.ru/forum/proekty/virtualnyi-ostsillograf

Вот таким скетчем можно приблизительно глянуть что там происходит с сигналом.

Если не гребенка с пиками или провалами, то пробовать RC цепочку.

ВладимирN
Offline
Зарегистрирован: 14.11.2019

А это тут при чём. С чего бы Я не мерил. не уж то вы думаете что мотор (электро двигатель) так шуметь может. хотя и они менялись. выше писал что на прерываниях, токая проблема. 

ВладимирN
Offline
Зарегистрирован: 14.11.2019

попробую от пишусь. чёт я о РЦ не подумал. хотя о кондёре мысли были. грешил и на плохой контакт. но при появ, этот факт отпал. ранее и на свой говна код грешил. но пере пробовав множество кодов. как и свои знания по прерыванию. столкнулся с данной проблемой. вот и решил задать вопрос так сказать. знаю многие Гайвера тут терпеть не могут. но обратил внимания что даже на его видео он тормозит шлиф диск. типа вот работает. пробую его код таже фигня. так что тема остаётся открыта. мне ведь надо. не знать какие обороты может выдать (мотор) а сам факт стабильности оборотов. и может дуня их считать стабильно. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Просто конденсатор - это легкое КЗ !