Всем привет с толкнулся с проблемой в написании скетча. Есть коридор, светодиодная лента, Arduino, 3 Ультразвуковой дальномера (HC-SR04) и 1 Реле 5V 2-Channel Relay Shield. вот изоброжение примерной схемы коридора и расположение датчиков также есть не доделанный скетч Код (Text): #define ON 0 #define OFF 1 int echoPin = 31; int initPin = 30; int relePin = 22; int distance = 0; unsigned long pulseTime = 0; int echoPin2 = 41; int initPin2 = 40; int relePin2 = 23; int distance2 = 0; unsigned long pulseTime2 = 0; int echoPin3 = 51; int initPin3 = 50; int distance3 = 0; unsigned long pulseTime3 = 0; const long lightHold = 5000; void setup() { pinMode(initPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(relePin, OUTPUT); pinMode(initPin2, OUTPUT); pinMode(echoPin2, INPUT); pinMode(relePin2, OUTPUT); pinMode(initPin3, OUTPUT); pinMode(echoPin3, INPUT); digitalWrite(relePin, OFF); digitalWrite(relePin2, OFF); Serial.begin(9600); } void loop() { digitalWrite(initPin, HIGH); delayMicroseconds(10); digitalWrite(initPin, LOW); pulseTime = pulseIn(echoPin, HIGH); distance = pulseTime/58; digitalWrite(initPin2, HIGH); delayMicroseconds(10); digitalWrite(initPin2, LOW); pulseTime2 = pulseIn(echoPin2, HIGH); distance2 = pulseTime2/58; Serial.print("SRF05_1: "); Serial.print(distance, DEC); Serial.print("cm "); Serial.print("SRF05_2: "); Serial.print(distance2, DEC); Serial.println("cm "); if (distance <= 10) { digitalWrite(relePin, LOW); delay(lightHold); } else { digitalWrite(relePin, HIGH); } if (distance2 <= 20) { digitalWrite(relePin2, LOW); delay(lightHold); } else { digitalWrite(relePin2, HIGH); } if (distance3 <= 10) { digitalWrite(relePin, LOW); digitalWrite(relePin2, LOW); delay(lightHold); } else { digitalWrite(relePin, HIGH); digitalWrite(relePin2, HIGH); } } проблема в этом скетче при проходе 1 датчика лента (relePin) загораеться а когда проходишь 2 датчик (relePin2) не загораеться до тех пор пока не перестанет гореть 1 лента! как это исправить? Разъясняю если кто то не понял действия должны быть такими: 1) если заходишь в коридор и задеваешь сенсор 1 то включается первая половина коридора подсветки и при прохождение сенсора 2 вдобавок к 1 половине коридора включается 2 половина коридора 2) если заходишь в коридор и задеваешь сенсор 2 то включается вторая половина коридора подсветки 3) если выходишь из задней комнаты и задеваешь сенсор 3 то включается весь коридор и в этом случае 1 и 2 сенсор не должны срабатывать! 4) при прохождение каждого датчика отправляется команда на загорание ленты на 5 секунд но если кто то проходит этот датчик повторно то должно добавляться по 5 секунд!
(3) условия для сенсоров 1 и 2 должны проверяться только если не сработал сенсор 3 (4) измеряете время между срабатываниями сенсоров, если меньше 10 сек, увеличиваете lightHold, если сенсор не срабатывал дольше какого то времени, сбрасываете lightHold на начальное значение. Ну и по оформлению кода: 1. для пинов int -> const int чтобы не кушать память за зря 2. rele -> relay 3. оформляйте константы и переменные в определенном стиле и всегда его придерживайтесь, например, так: CONSTANT GlobalVariable local_variable functionName() чтобы сразу при взгляде на идентификатор было понятно что это такое.
Код (Text): const int SENSOR_COUNT = 3; // sensor control pins const int PIN_RESET[SENSOR_COUNT] = {30, 40, 50}; // sensor data pins const int PIN_SENSE[SENSOR_COUNT] = {31, 41, 51}; // const int SENSOR_THRESHOLD[SENSOR_COUNT] = {10, 20, 10}; // relay control pins const int PIN_RELAY_1 = 22; const int PIN_RELAY_2 = 23; const long DEFAULT_ON_PERIOD = 5000; const float SENSOR_SCALE = 58.0; unsigned long sense_time[SENSOR_COUNT]; unsigned long relay_on_period = DEFAULT_ON_PERIOD; int readDistance(const int sensor) { digitalWrite(PIN_RESET[sensor], HIGH); delayMicroseconds(10); digitalWrite(PIN_RESET[sensor], LOW); unsigned long value = pulseIn(PIN_SENSE[sensor], HIGH); int result = (int)floor(value/SENSOR_SCALE); return result; } void setup() { for (int i = 0; i < SENSOR_COUNT; i++) { pinMode(PIN_RESET[i], OUTPUT); pinMode(PIN_SENSE[i], INPUT); sense_time[i] = millis(); } pinMode(PIN_RELAY_1, OUTPUT); pinMode(PIN_RELAY_2, OUTPUT); digitalWrite(PIN_RELAY_1, LOW); digitalWrite(PIN_RELAY_2, LOW); Serial.begin(9600); } void loop() { int distance[SENSOR_COUNT]; boolean flag_on[SENSOR_COUNT]; boolean flag_off[SENSOR_COUNT]; unsigned long time = millis(); for (int i = 0; i < SENSOR_COUNT; i++) { distance[i] = readDistance(i); Serial.print("SRF05_ "); Serial.print(i+1); Serial.print(": "); Serial.print(distance[0], DEC); Serial.print("cm "); flag_on[i] = distance[i]<SENSOR_THRESHOLD[i]; unsigned long idle_period = time-sense_time[i]; if (flag_on[i]) { if ((idle_period>DEFAULT_ON_PERIOD) && (idle_period<2*DEFAULT_ON_PERIOD)) { relay_on_period += DEFAULT_ON_PERIOD; } sense_time[i] = time; flag_off[i] = false; } else { if (idle_period>=2*DEFAULT_ON_PERIOD) { relay_on_period = DEFAULT_ON_PERIOD; } flag_off[i] = (idle_period>relay_on_period); } } // if (flag_on[2]) { digitalWrite(PIN_RELAY_1, LOW); digitalWrite(PIN_RELAY_2, LOW); } else { if (flag_on[0]) { digitalWrite(PIN_RELAY_1, LOW); } else if (flag_off[0] && flag_off[2]) { digitalWrite(PIN_RELAY_1, HIGH); } if (flag_on[1]) { digitalWrite(PIN_RELAY_2, LOW); } else if (flag_off[1] && flag_off[2]) { digitalWrite(PIN_RELAY_2, HIGH); } } // pause between sensor polls delay(100); } Вот примерно так получается... в работе не проверял.