Добры вечер всем) подскажите, на сколько падает напряжение на ардуино уно в цепи с фоторезиком? В пределах от чего до чего? Стандартный Фоторезистор из набора. Если я буду считывать аналоговым входом на плате будет меняться в темноте от 0 до 1024 на свету?
Я занимался этим вопросом, когда решал эту схему. Вот мои выводы исходя из формулы делителя напряжения и номинала резистора. Если хочешь подключить резистор другого номинала, тогда уже считай сам и выводи диапазон значений по данной методике. В данном случае видно, что при резисторе в 100 кОм диапазон 110 – 853, а при 10 кОм 557 – 1004.
Добрый вечер, я ламер. Извините за столь глупый вопрос, но почему при выполнении этой программы Условия If - перебираются и выполняются? Ошибка в чем? Пытаюсь считать показания с фоторезистора и вывести соответствующую цифру согласно поделенным показателям.... показания от 555..1000 Прошу прощения, не пойму где запутался....((((((((((( Код (Text): void setup() { pinMode(2, OUTPUT); // Пищалка (в принципе не нужна) pinMode(A0, INPUT); // Аналоговый вход для считывания показания pinMode(3, OUTPUT); // цифорвые выходы питающие светодиодную цифру pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); digitalWrite(3, LOW); // Заведомо выключенны digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } void loop() { if (900 > analogRead(A0) < 1000) { digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); tone(2, analogRead(A0), 20); delay(500); } //////////////////////////////////////////////// 9 if (850 > analogRead(A0) < 900) { digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); digitalWrite(3, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 8 if (700 > analogRead(A0) < 850) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 7 if (650 > analogRead(A0) < 700) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(9, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 6 if (600 > analogRead(A0) < 650) { digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, HIGH); digitalWrite(8, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 5 if (580 > analogRead(A0) < 599) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, HIGH); digitalWrite(8, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 4 if (569 > analogRead(A0) < 579 ) { digitalWrite(3, LOW); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(6, HIGH); digitalWrite(9, HIGH); digitalWrite(5, HIGH); digitalWrite(4, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 3 if (556 > analogRead(A0) < 568) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(6, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 2 if (550 > analogRead(A0) < 555) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 1 }
if (900 > analogRead(A0) < 1000) - забавная конструкция, и притом синтаксически правильная. А по факту она означает следующее: сравниваем 900 и то, что возвращает analogRead(A0). Результат сравнения, если не ошибаюсь, равен 1 (в любом случае, что-то не равное 0) в случае выполнения условия (вернулось меньше 900) или 0 в случае невыполнения условия. Данный результат сравнивается с 1000, что в итоге всегда верно. Насколько я себе представляю задуманное, то надо оформлять это дело так: int ar_rc=analogRead(A0); if ((900<ar_rc)&&(ar_rc<1000)) В других if то же самое. Только считывание из A0 нужно только одно, перед первой проверкой. Кроме того, чтобы избежать лишних вычислений можно воспользоваться else Примерно так: int ar_rc=analogRead(A0); if ((900<ar_rc)&&(ar_rc<1000)) { ... } else if ((800<ar_rc)&&(ar_rc<901)) { ... } else if ((700<ar_rc)&&(ar_rc<801)) { ... }
можешь пояснить почему мой вариант не сработал, хотя вроде с точки зрения логики правильно все. До этого я кодил на делфи
Ну в Delphi тоже нужно было бы написать if 900 > analogRead(A0) and analogRead(A0) < 1000 then begin end;
Проверил, сделал сравнение иное чем было у меня, в итоге имею аналогичную ситцацию, все выражения верны и программа переключает цифры по очереди так, будто все они истина. Вот код Код (Text): void setup() { pinMode(2, OUTPUT); // Пищалка (в принципе не нужна) pinMode(A0, INPUT); // Аналоговый вход для считывания показания pinMode(3, OUTPUT); // цифорвые выходы питающие светодиодную цифру pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); digitalWrite(3, LOW); // Заведомо выключенны digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } void loop() { int result; result = analogRead(A0); if ((901 > result) && (result < 1004)) { digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); tone(2, analogRead(A0), 20); delay(500); } //////////////////////////////////////////////// 9 if ((851 > result) && (result < 900)) { digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); digitalWrite(3, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 8 if ((701 > result) && (result < 850)) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 7 if ((651 > result) && (result < 700)) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(9, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 6 if ((600 > result) && (result < 650)) { digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, HIGH); digitalWrite(8, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 5 if ((580 > result) && (result < 599)) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, HIGH); digitalWrite(8, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 4 if ((569 > result) && (result < 579)) { digitalWrite(3, LOW); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(6, HIGH); digitalWrite(9, HIGH); digitalWrite(5, HIGH); digitalWrite(4, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 3 if ((559 > result) && (result < 568)) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(6, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 2 if ((554 > result) && (result < 558)) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 1 }
Если все условия срабатывают, это означает. что из А0 считывается что-то меньшее, чем 554. Собственно говоря, любое условие из представленных в последнем коде выглядит странно. Возьмем, например, последнее ((554 > result) && (result < 558)) Получается, что значение result проверяется на то, что оно меньше 554 и меньше 558. Т.е условие истинно, если result меньше 554. Логичнее было бы изменить оператор в первой паре скобок на < Т.е. ((554 < result) && (result < 558)) Вот тогда условие будет истинным, если result между 554 и 558. PS. Еще один момент. На границах диапазонов ни один if не сработает. При использованных значениях границ логичнее использовать операторы <=, которые позволят включить границы в диапазон.
Если не ошибаюсь, то надо еще скобки расставить. В Delphi вроде and имеет тот же приоритет, что и операции сравнения. if (900 < analogRead(A0)) and (analogRead(A0) < 1000) then
На деле практике получился разброс от 350 - при ярком свете и до 1024 - когда темно. В теории должно было быть от 555 до 1005...... Это все зависит от материалов изготовления и т д, правильно я понимаю? А вот рабочий код Код (Text): void setup() { pinMode(2, OUTPUT); // Пищалка (в принципе не нужна) pinMode(A0, INPUT); // Аналоговый вход для считывания показания pinMode(3, OUTPUT); // цифорвые выходы питающие светодиодную цифру pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); // Заведомо выключенны } void LedOff() // Отключение светодиодов на случий прерывания сигнала с А0 { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); } void loop() { int result; result = analogRead(A0); if ((1000 <= result) && (result <= 1024)) { digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(3, HIGH); tone(2, analogRead(A0), 20); delay(500); } //////////// 0 else { LedOff(); } if ((0 <= result) && (result <= 350)) { digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); tone(2, analogRead(A0), 20); delay(500); } else { LedOff(); } //////////////////////////////////////////////// 9 if ((351 <= result) && (result <= 450)) { digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); digitalWrite(3, HIGH); tone(2, analogRead(A0), 20); delay(500); } else { LedOff(); } /////////////////////////////// 8 if ((451 <= result) && (result <= 550)) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 7 else { LedOff(); } if ((551 <= result) && (result <= 650)) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(9, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 6 else { LedOff(); } if ((651 <= result) && (result <= 750)) { digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(9, HIGH); digitalWrite(8, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 5 else { LedOff(); } if ((750 <= result) && (result <= 850)) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(9, HIGH); digitalWrite(8, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 4 else { LedOff(); } if ((851 <= result) && (result <= 950)) { digitalWrite(3, LOW); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(6, HIGH); digitalWrite(9, HIGH); digitalWrite(5, HIGH); digitalWrite(4, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 3 else { LedOff(); } if ((951 <= result) && (result <= 1000)) { digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(6, HIGH); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 2 else { LedOff(); } if ((1001 <= result) && (result <= 1024)) { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); tone(2, analogRead(A0), 20); delay(500); } /////////////////////////////// 1 else { LedOff(); } } Фото: https://yadi.sk/i/syKQF-0Mbvkxx загрузил на яндекс диск, загрузить сюда не получилось Получилось что, при выключенном свете горит 0, при нарастании света вокруг датчика показатель растет до 9, не знаю для чего это можно и нужно ли использовать, но оно работает
Вот тут я теряюсь в догадках. При теоретических расчётах я руководствовался этими данными http://files.amperka.ru/datasheets/vt900.pdf - там есть фоторезистор из набора - VT90N2. Далее, ошибка в формуле явно маловероятна, её нам дают с пошаговым выводом в конспекте, да и в других источниках она та же. При подаче на аналоговый вход Arduino напряжение от 0 до 5 вольт конвертируется в одну из градаций от 0 до 1023. Верно? Значит и диапазон выведен правильно. Сейчас соберу твою схему, посмотрю
Ну дела. У меня значения: 1009 - максимум 198 - минимум 198 - это 0,96 В (светил фонариком прямо впритык к фоторезистору) А значит если вывести из этого сопротивление фоторезистора по формуле, оно составит 2,38 кОм Если опять обратиться к тех характеристикам, то там написано, что 12 кОм - это минимальное сопротивление при 10 Лк. Наверное, фонарик обладает большим уровнем освещённости, чем это значение. К сожалению, не имею возможности измерять его свет в Люксах, т. к. нет приборов. Раз тех. описание молчит по этому поводу, значит было бессмысленно делать теоретический расчёт. Как всегда, победила практика.
Явно видео, что теория редко совпадает с практикой. Все расчеты верны. Но у меня срабатывание от 350 идет.... Все зависит от качества и других физических параметров окр среды....