Доброго всем времени суток! Прошу подсказки в программировании ардуино. Тех задача - менять угол поворота серво в зависимости от температуры ( автоподсос на карбюратор). Почему серво поворачивается 5 шагов, возвращается назад и так по кругу. Если можно, сильно тапками не кидать - это мой первый опыт программирования. Скетч:
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <Servo.h>
Servo myservo;
int dspin = 10;
int val;
OneWire ds(10); // Подключаем датчик к 10 цифровому пину
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Подключаем LCD
void setup(void)
{
myservo.attach(9);
lcd.begin(16, 2); //16 знаков, 2 строки
lcd.print("Temp:"); //Печатаем верхнюю строку LCD
lcd.setCursor(9, 0);
}
void loop(void)
{
byte i;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
// Ищем алрес датчика
if ( !ds.search(addr))
{
ds.reset_search();
delay(250);
return;
}
// Проверяем не было ли помех при передаче
if (OneWire::crc8(addr, 7) != addr[7])
{
return;
}
// Определяем серию датчика
switch (addr[0])
{
case 0x10:
type_s = 1;
break;
case 0x28:
;
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}
ds.reset();
ds.select(addr); // Выбираем адрес
ds.write(0x44, 1); // Производим замер, в режиме паразитного питания
delay(1000);
ds.reset();
ds.select(addr);
ds.write(0xBE); // Считываем оперативную память датчика
for ( i = 0; i < 9; i++)
{
data[i] = ds.read(); // Заполняем массив считанными данными
} // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
int16_t raw = (data[1] << 8) | data[0]; // Переводим температуру в шкалы по Цельсию и Фаренгейту
if (type_s)
{
raw = raw << 3;
}
if (data[7] == 0x10)
{
raw = (raw & 0xFFF0) + 12 - data[6];
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00)
raw = raw << 3;
else if (cfg == 0x20)
raw = raw << 2;
else if (cfg == 0x40) \
raw = raw << 1;
}
celsius = (float)raw / 16.0;
lcd.setCursor(0, 1); //Пишем в LCD на 2 строке
lcd.print("C:");
lcd.setCursor(2, 1);
lcd.print(celsius); //Цельсии
lcd.setCursor(8, 1);
val = (float)raw / 16.0;
if (val == 25);
{
myservo.write(5);
delay(500);
}
if (val == 30);
delay(500);
{
myservo.write(10);
delay(500);
}
if (val == 35);
{
myservo.write(15);
delay(500);
}
if (val == 40);
{
myservo.write(20);
delay(500);
}
if (val == 45);
{
myservo.write(25);
delay(500);
}
if (val == 50);
{
myservo.write(30);
delay(500);
}
}