Здравствуйте, сделал горелку на отработке, решил прилепить автоматизацию, нашел инфу про ардуино купил мегу, два датчика ds18b20, ик датчик пламени и блок на 4 реле, полистав инет, решил попробовать написать прогу, с этим дело имею впервые... написал скетч, но ничего не работает, при включении питания все лампы на реле загораются и ни на датчик пламени, ни на нагрев датчиков темп не реагирует... может толкнете в нужное русло, что упустил, где почитать... вот т.н. "скетч" Код (C++): #include <OneWire.h> #include <DallasTemperature.h> //DS18b20 #define ONE_WIRE_BUS 10 // датчики температуры на 10 пине OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress sensor1 = {0x28, 0xFF, 0xE0, 0x9F, 0x83, 0x15, 0x02, 0xC0}; // адреса датчиков DeviceAddress sensor2 = {0x28, 0xFF, 0x46, 0x9D, 0x83, 0x15, 0x02, 0x68}; // Температура float temp1 = 0; // текущая температура первого датчика float temp2 = 0; // второй датчик // // настраиваем выводы #define RELAY_PIN1 22 // выходы на реле #define RELAY_PIN2 23 #define RELAY_PIN3 24 #define RELAY_PIN4 25 #define IR_PIN 26 // вход датчика ИК пламени void setup() { sensors.begin(); sensors.setResolution(sensor1, 10); sensors.setResolution(sensor2, 10); pinMode(IR_PIN, INPUT); // пин ик датчика выход pinMode(RELAY_PIN1, OUTPUT); // пины реле выходы pinMode(RELAY_PIN2, OUTPUT); pinMode(RELAY_PIN3, OUTPUT); pinMode(RELAY_PIN4, OUTPUT); } void loop() { sensors.requestTemperatures(); // Температура temp1 = sensors.getTempC(sensor1); // получаем температуру temp2 = sensors.getTempC(sensor2); digitalRead (IR_PIN); // проверка пламени delay (1000); if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 0) { digitalWrite(RELAY_PIN1, HIGH); digitalWrite(RELAY_PIN2, LOW); digitalWrite(RELAY_PIN3, LOW); digitalWrite(RELAY_PIN4, LOW); } else if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 1){ digitalWrite(RELAY_PIN1, LOW); digitalWrite(RELAY_PIN2, HIGH); digitalWrite(RELAY_PIN3, LOW); digitalWrite(RELAY_PIN4, LOW); }else if (temp1 >= 34 && temp2 > 34 && IR_PIN == 0){ digitalWrite(RELAY_PIN1, LOW); digitalWrite(RELAY_PIN2, LOW); digitalWrite(RELAY_PIN3, HIGH); digitalWrite(RELAY_PIN4, LOW); } else if (temp1 >= 34 && temp2 > 34 && IR_PIN == 1){ digitalWrite(RELAY_PIN1, LOW); digitalWrite(RELAY_PIN2, LOW); digitalWrite(RELAY_PIN3, LOW); digitalWrite(RELAY_PIN4, HIGH); } else { digitalWrite(RELAY_PIN1, LOW); digitalWrite(RELAY_PIN2, LOW); digitalWrite(RELAY_PIN3, LOW); digitalWrite(RELAY_PIN4, LOW); } } помогите пожалуйста советом, что не так делаю, что почитать..
У вас значение, которое получается в строке "digitalRead (IR_PIN); // проверка пламени" не записывается ни в какую переменную, а в сравнениях получается, что вы сравниваете номер пина IR_PIN с 0 и 1. Поскольку IR_PIN всегда равен 26, то не выполняется ни одно из условий. Вам нужно либо сделать перменную, в которой будет записано состояние датчик пламени (как вариант irSensorState= digitalRead(IR_PIN); ) и в сравнениях смотреть, что в ней записано: if (temp1 >= 34 && temp2 <= 34 && irSensorState == 0) {... Либо сделать без нее: if (temp1 >= 34 && temp2 <= 34 && digitalRead(IR_PIN) == 0) {...
Спасибо большое за ответ, правда я пару дней назад сам допетрил ... Но все равно спасибо, вы единственный кто указал на ошибку, хотя я на двух форумах спрашивал. Если не против, я потом тут ещё поспрашиваю, когда совершенствовать код буду.
Да без проблем! Только учитывайте тот факт, что первую плату Arduino я себе приобрел полтора месяца назад и опыта пока особого нет
Только Ир датчик походу даёт 0 когда пламя есть и 1 когда нет... Поэтому сделал flame =! digitalRead(IR_PIN) Дальше в условиях if flame==0
Насчет показаний датчика - надо в его описании смотреть, там обычно все достаточно просто. А насчет программирования - да, без проблем. Я в этом немного понимаю.