13 июня, 2019 - 07:48 | |
---|---|
Управление дроссельной заслонкой карбюратора относительно оборотов двигателя и температуры.
|
romeo_com
![]() 13.06.2019 |
13 июня, 2019 - 08:44 | #1 |
---|---|
Подробное описание проекта. С описание всех мелочей, процессов и действий которые должен выполнять проект. Будущее за микроконтроллерами |
Admin
![]() 3.07.2018 |
18 октября, 2019 - 09:17 | #3 |
---|---|
romeo_com пишет:как добавить файл? |
romeo_com
![]() 13.06.2019 |
18 октября, 2019 - 09:20 | #5 |
---|---|
#include <Servo.h> //библиотека серво (стандартная) #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal_I2C.h> #define ONE_WIRE_BUS A1 // пин для дс18б20 ( one wire) // initialize the library with the numbers of the interface pins LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей Servo servo; //объявить серво назвать servo OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress Thermometer = {0x28, 0xFF, 0xC5, 0x2F, 0x86, 0x16, 0x4, 0xC6}; //адресс датчика 18b20 unsigned long lastflash; int TempMax; int RPM, pos; unsigned int min_pos = 0; //минимальная частота оборотов unsigned int max_pos = 1500; //максимальная частота оборотов unsigned int min_ser = 0; //полностью закрыта заслонка unsigned int max_ser = 180; //полностью открытас заслонка void setup() { sensors.begin(); Serial.begin(9600); //открыть порт attachInterrupt(0, sens, RISING); //подключить прерывание на 2 пин при повышении сигнала pinMode(3, OUTPUT); //3 пин как выход digitalWrite(3, HIGH); //подать 5 вольт на 3 пин servo.attach(4); //серво на 4 порту { lcd.init(); lcd.backlight();// Включаем подсветку дисплея //lcd.setCursor(0, 1); } } void sens() { RPM = 60 / ((float)(micros() - lastflash) / 1000000); //расчет lastflash = micros(); //запомнить время последнего оборота } void printTemperature(DeviceAddress Thermometer) { float T = sensors.getTempC(Thermometer); //lcd.setCursor(8, 1); //lcd.print("Temp C: "); //lcd.print(T); } void loop() { sensors.requestTemperatures(); int T = (sensors.getTempC(Thermometer)); if (T <= (75)) { pos = map(RPM, min_pos, max_pos, min_ser, max_ser); //перевести значение от минимума до максимума в угол поворота сервы (от 0 до 180) servo.write(pos); //повернуть серву lcd.setCursor(0, 0); lcd.print("Temp C: "); lcd.print(T); lcd.setCursor(0, 1); lcd.print("RPM "); lcd.print(RPM); //послать в порт if ((micros() - lastflash) > 1000000)//если сигнала нет больше секунды { RPM = 0; //считаем что RPM 0 } } if ((T >= (55))) { servo.write(max_ser); //отключение автоподсоса при достижении температуры (полностью открыта заслонка) delay(1000); //задержка для закрытия заслонки воздуха servo.detach(); // отклюение серво привода заслонки } }
|
romeo_com
![]() 13.06.2019 |