Светодиоды, освещение, мигание от 0 до 100%
- Войдите на сайт для отправки комментариев
Вс, 01/12/2019 - 12:11
Задача заключается в том чтобы создать систему контроля освещенности: 10 светодиодов и каждый отображает пропорциональное значение освещения от 0 до 100% ( я так полагаю что каждый светодиод должен отображать по 10% освещения ?) плюс если яркость равна 0% светодиоды должны мигать.
Я сумел сделать только что если яркость равна 0% то светодиоды должны мигать, нужна помощь с остальным.
int first=2;
int last=11;
int svet;
int pin;
void setup()
{
Serial.begin(9600);
for(pin = first; pin <=last; ++pin)
{
pinMode (pin, OUTPUT);
}
pinMode (A0, INPUT);
}
void loop()
{
svet = analogRead (A0);
Serial.println(svet);
for(int i=0;i<5;i++)
{
for(pin = first; pin <=last; ++pin)
{
digitalWrite (pin,1);
delay(500);
digitalWrite (pin,0);
delay(500);
}
}
}
Вроде как к моему заданию нужно применить порог яркости, но я не знаю как.
Я сумел сделать только что если яркость равна 0% то светодиоды должны мигать, нужна помощь с остальным.
Не, пока не сумели. Вашим светодиодам пофиг на яркость - они мигают всегда. Потому как значение переменной svet Вы только себе сообщаете, но нигде не используете. См. Оператор If..else
А курсовая горит
А курсовая горит
Это не совсем курсовая, скорее учебная практика
int first=2; int last=11; int svet; int pin; void setup() { Serial.begin(9600); for(pin = first; pin <=last; ++pin) { pinMode (pin, OUTPUT); } pinMode (A0, INPUT); } void loop() { svet = analogRead (A0); Serial.println(svet); if (svet>150) { for(int i=0;i<5;i++) { for(pin = first; pin <=last; ++pin) { digitalWrite (pin,1); delay(50); digitalWrite (pin,0); delay(50); } } } }Спасибо исправил, но я так и не понял что делать с остальным.
ну почти готово же уже :)
for ( int i = 0; i <= svet/100; i++ ) { digitalWrite( i, HIGH ); }А зачем нужен цикл в строке 20?
Так будет более привильно ИМХО:
int first=2; int last=11; int svet; int pin; void setup() { Serial.begin(9600); for(pin = first; pin <=last; ++pin) { pinMode (pin, OUTPUT); } pinMode (A0, INPUT); } void loop() { svet = analogRead (A0); static unsigned long serialMillis=millis(); if ((millis()-serialMillis)>=1000){ Serial.println(svet); serialMillis=millis(); } if (svet>150){ static unsigned long oldMillis=millis(); static boolean pinState=0; if (((millis()-oldMillis)>=200)&&(!pinState)){ for(pin = first; pin <=last; ++pin) { digitalWrite (pin,HIGH); } pinState=HIGH; oldMillis = millis(); } if (((millis()-oldMillis)>=200)&&(pinState)){ for(pin = first; pin <=last; ++pin) { digitalWrite (pin,LOW); } pinState=LOW; oldMillis = millis(); } } }ну почти готово же уже :)
for ( int i = 0; i <= svet/100; i++ ) { digitalWrite( i, HIGH ); }Так, то есть надо добавить цикл с переменной i где она будет отвечать за светодиоды, но если с началом i проблем нету это 0 то вот конец вызывает вопросы, а если значение света 250 или 90 ? Это будет 90/100 это 0,9 или 250/100 это 25 и какой тогда будет гореть светодиод ?
А зачем нужен цикл в строке 20?
Так будет более привильно ИМХО:
Если использовать твой(ваш) код то гореть светодиоды будут только когда темно , а мне к этому надо еще чтобы каждый светодиод отображал определенный процент освещенности. То есть когда от 1 до 10% горит 1 светодиод от 11 до 20% второй и т.д. но все равно спасибо
На, разбирайся (загораются линейкой):
UPD убрал костыль
int first=2; int last=11; int svet; int pin; boolean pinState=0; int svetPorog[10] = {100,200,300,400,500,600,700,800,900,1000}; void setup() { Serial.begin(9600); for(pin = first; pin <=last; ++pin) { pinMode (pin, OUTPUT); } pinMode (A0, INPUT); } void loop() { svet = analogRead (A0); static unsigned long serialMillis=millis(); if ((millis()-serialMillis)>=1000){ Serial.println(svet); serialMillis=millis(); } if (svet<svetPorog[0]){ static unsigned long oldMillis=millis(); if (((millis()-oldMillis)>=200)&&(!pinState)){ for(pin = first; pin <=last; ++pin) { digitalWrite (pin,HIGH); } pinState=HIGH; oldMillis = millis(); } if (((millis()-oldMillis)>=200)&&(pinState)){ for(pin = first; pin <=last; ++pin) { digitalWrite (pin,LOW); } pinState=LOW; oldMillis = millis(); } } else{ for(pin = first; pin <=last; ++pin) { if(svet>=svetPorog[pin-first]) digitalWrite(pin,HIGH); else digitalWrite(pin,LOW); } } }Возьмите микросхему LM3914N - это всё это уже готово. Пример с миганием есть в даташите. А ардуину для более полезных дел используете.
Евгений, это ему задали в (вставить учебное заведение)....
Вот загораются по одному:
UPD убрал костыль.
int first=2; int last=11; int svet; int pin; boolean pinState=0; int svetPorog[11] = {100,200,300,400,500,600,700,800,900,1000, 1024}; void setup() { Serial.begin(9600); for(pin = first; pin <=last; ++pin) { pinMode (pin, OUTPUT); } pinMode (A0, INPUT); } void loop() { svet = analogRead (A0); static unsigned long serialMillis=millis(); if ((millis()-serialMillis)>=1000){ Serial.println(svet); serialMillis=millis(); } if (svet<svetPorog[0]){ static unsigned long oldMillis=millis(); if (((millis()-oldMillis)>=200)&&(!pinState)){ for(pin = first; pin <=last; ++pin) { digitalWrite (pin,HIGH); } pinState=HIGH; oldMillis = millis(); } if (((millis()-oldMillis)>=200)&&(pinState)){ for(pin = first; pin <=last; ++pin) { digitalWrite (pin,LOW); } pinState=LOW; oldMillis = millis(); } } else{ for(pin = first; pin <=last; ++pin) { if((svet>=svetPorog[pin-first])&&(svet<=svetPorog[pin-first+1])) digitalWrite(pin,HIGH); else digitalWrite(pin,LOW); } } }250/100 = 2.5, то есть будут гореть 0, 1 и 2. Ну и погасить ненужные с предыдущего loop-a не забыть.