Всем привет! Прошу помощи. Пожалуйста, очень надо разобраться, так как сам мало волоку в этом деле пока что. Внизу скетч программы, которая будет сигнализировать о невключенном напряжении сигналом Пищалки. 2 пин это концевик. Так вот, как заставить программу работать: 1.чтобы она начинала как бы отстчёт с размыкания концевика. 2. как сделать чтобы эти циклы не повторялись постоянно с зажатым концевиком. Спасибо за советы и подсказски. Всем добра!! Вот код: Код (C++): int analogInput = 0; float vout = 0.0; float vin = 0.0; #define R1 62. // сопротивление R1 (62K) #define R2 3.3 // сопротивление R2 (3.3K) int value = 0; void setup(){ Serial.begin(9600); pinMode(analogInput, INPUT); pinMode(2,OUTPUT); pinMode(3,INPUT); } void loop(){ value = analogRead(analogInput); vin = ((float)analogRead(A1))*5. / 1024. / R2 * (R1 + R2); Serial.print("U1 = "); delay(1000); Serial.print(vin, 1); delay(1000); { if ((digitalRead(3)==HIGH)&& (vin>0.0))//напряжение больше нуля, сообщает что всё нормально и пищит два раза { digitalWrite(2,HIGH); delay(100); digitalWrite(2,LOW); delay(100); digitalWrite(2,HIGH); delay(100); digitalWrite(2,LOW); delay(100); } if ((digitalRead(3)==HIGH)&& (vin==0))//напряжение не включено, сообщает длинным писком, чтобы включить напряжение обратно { digitalWrite(2,HIGH); delay(2000); digitalWrite(2,LOW); } } }
Если пин №2 - это концевик, то почему он настроен на выход ( pinMode(2,OUTPUT); )? Для чего нужна переменная value, если ее значение нигде не используется? Зачем каждый раз в цикле вычислять значение R1 + R2, если оно константа? При включении МК, напряжение на входе A1 есть или нет, или не известно?
И Извиняюсь, концевик 3 пин., а напряжение он измеряет, толь ко когда нажимается концевик и сравнивает его отсутствие или присутствие. Как заставить ждать цикл до следующего размыкания концевика? Не повторяя цикл. А запуская его только когда замыкает концевик?
Так до конца и не понял, контроль напряжения нужен только в момент замыкания концевика, или пока он замкнут? По существу вопроса, добавьте логическую переменную и выполняйте действия только когда ее состояние меняется. Примерно так: Код (C++): bool vinLost = true; ... if ((vin > 0) && vinLost) { vinLost = false; ... } else if ((vin == 0) && !vinLost) { vinLost = true; ... }
Напряжение нужно замерять только когда нажимается концевик, и исходя из полученного результата включать пищалку разово или несколько раз, чтобы как бы показать мол "напряжения нет, включи его", и просто так не уходи, и всё, то есть чтобы цикл отработал один всего раз и ждать до следующего размыкания концевика и последующего его замыкания. Спасибо Большое, ночь впереди, буду пытать Arduino))
Здравствуй, дорогой друг. Я немного по твоему совету пошаманил над кодом. Получилось на мой взгляд попроще даже. Но вот незадача у меня всё идёт по кругу в loop'е. Подскажи пожалуйста над некоторыми моментами : проблемы выделил в комментариях в void loop(): Код (C++): const int konc = 3; int analogInput = 0; float vout = 0.0; float vin = 0.0; #define R1 62. // сопротивление R1 (62K) #define R2 3.3 // сопротивление R2 (3.3K) int value = 0; int Koncevik = 0; void setup(){ Serial.begin(9600); pinMode(analogInput, INPUT); pinMode(2,OUTPUT); pinMode(konc,INPUT); } void loop(){ while( Koncevik == 0){ Koncevik = digitalRead(konc); delay(500); //вот здесь всё пищание digitalWrite(2, HIGH);//повторяется при delay(100); digitalWrite(2,LOW);//открытой так сказать двери delay(70); digitalWrite(2,HIGH); delay(100); digitalWrite(2,LOW);} while(Koncevik == 1){ Koncevik = digitalRead(konc); value = analogRead(analogInput); vin = ((float)analogRead(A1))*5. / 1024. / R2 * (R1 + R2); Serial.print("U1 = "); delay(1000); Serial.print(vin, 1); delay(1000); if ((digitalRead(konc)==1) && (vin>0)){ digitalWrite(2,HIGH);//это условие выполняется delay(100);//ровно, но только тоже зациклено digitalWrite(2,LOW); delay(100); } else if ((digitalRead(konc)==1) && (vin==0)){ digitalWrite(2,HIGH);// с этим та же беда delay(1000); digitalWrite(2,LOW); delay(100); } } }
Попробуйте такой код: Код (C++): #define BUZZ_PIN = 2; #define KONC_PIN = 3; #define R1 62. // сопротивление R1 (62K) #define R2 3.3 // сопротивление R2 (3.3K) const float CF = 1024.0 / (5.0 * (R1 / R2)); float v_in = 0.0; bool is_koncevik_on = false; void setup(){ Serial.begin(9600); pinMode(A1, INPUT); pinMode(BUZZ_PIN, OUTPUT); pinMode(KONC_PIN, INPUT); } void loop() { if (!digitalRead(KONC_PIN)) { is_koncevik_on = false; delay(500); digitalWrite(BUZZ_PIN, HIGH); delay(100); digitalWrite(BUZZ_PIN,LOW); delay(70); digitalWrite(BUZZ_PIN,HIGH); delay(100); digitalWrite(BUZZ_PIN,LOW); } else { //v_in = (float)analogRead(A1) * 5. / 1024. / R2 * (R1 + R2); v_in = (float)analogRead(A1) / CF; Serial.print("U1 = "); delay(1000); // зачем тут задержка??? Serial.print(v_in, 1); delay(1000); if (!is_koncevik_on) { is_koncevik_on = true; if (v_in > 0) { digitalWrite(BUZZ_PIN, HIGH); delay(100); digitalWrite(BUZZ_PIN, LOW); delay(100); } else { digitalWrite(BUZZ_PIN, HIGH); delay(1000); digitalWrite(BUZZ_PIN, LOW); delay(100); } } } } Если в строке Код (C++): v_in = (float)analogRead(A1) / CF; будет неверный результат, то эту строку закомментируйте, а перед ней - раскомментируйте. Для чего нужно читать analogInput и зачем нужны переменные value и vout - я не понял, поэтому убрал эти места из кода.
УРААА, Всё замечательно, формулы и моя и Ваша, рабочие=) Спасибо ОгромеННООЕЕЕ, Благодаря тебе верю в Людей и не теряю надежду в изучении языков программирования =) Но вот только при открытии, вот здесь Код (C++): void loop() { if (!digitalRead(KONC_PIN)) { is_koncevik_on = false; delay(500); digitalWrite(BUZZ_PIN, HIGH); delay(100); digitalWrite(BUZZ_PIN,LOW); delay(70); digitalWrite(BUZZ_PIN,HIGH); delay(100); digitalWrite(BUZZ_PIN,LOW); } else { Всё идёт зациклено, а хотел чтобы два раза просто пискнуло и всё. Буду думать что с этим поделать можно)
Вот доделал, Всё рбаотает. Спасибо Огромное! Век тебя помнить буду. p.s.: немного п Код (C++): #define BUZZ_PIN 2 #define KONC_PIN 3 #define R1 62. // сопротивление R1 (62K) #define R2 3.3 // сопротивление R2 (3.3K) const float CF = 1024.0 / (5.0 * (R1 / R2)); float v_in = 0.0; bool is_koncevik_on = false; void setup(){ Serial.begin(9600); pinMode(A1, INPUT); pinMode(BUZZ_PIN, OUTPUT); pinMode(KONC_PIN, INPUT); } void loop() { if (!digitalRead(KONC_PIN)) { if(is_koncevik_on){//добавил, чтобы повторялось всего один раз is_koncevik_on = false; delay(500); digitalWrite(BUZZ_PIN, HIGH); delay(100); digitalWrite(BUZZ_PIN,LOW); delay(70); digitalWrite(BUZZ_PIN,HIGH); delay(100); digitalWrite(BUZZ_PIN,LOW); } }else { v_in = (float)analogRead(A1) * 5. / 1024. / R2 * (R1 + R2);// работают обе, но твоя проще. Спасибо ТЕБЕ! на ошибках учатся //v_in = (float)analogRead(A1) / CF; Serial.print("U1 = "); Serial.print(v_in, 1); delay(1000); if (!is_koncevik_on) { is_koncevik_on = true; if (v_in > 0) { digitalWrite(BUZZ_PIN, HIGH); delay(100); digitalWrite(BUZZ_PIN, LOW); delay(100); } else { digitalWrite(BUZZ_PIN, HIGH); delay(1000); digitalWrite(BUZZ_PIN, LOW); delay(100); } } } } оправил