Светодиоды, освещение, мигание от 0 до 100%

Plbk
Offline
Зарегистрирован: 01.12.2019

Задача заключается в том чтобы создать систему контроля освещенности: 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);    
       }
     }
}

Вроде как к моему заданию нужно применить порог яркости, но я не знаю как. 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Plbk пишет:

Я сумел сделать только что если яркость равна 0% то светодиоды должны мигать, нужна помощь с остальным.

Не, пока не сумели. Вашим светодиодам пофиг на яркость - они мигают всегда. Потому как значение переменной svet Вы только себе сообщаете, но нигде не используете. См. Оператор If..else

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А курсовая горит

Plbk
Offline
Зарегистрирован: 01.12.2019

DetSimen пишет:

А курсовая горит

Это не совсем курсовая, скорее учебная практика

Plbk
Offline
Зарегистрирован: 01.12.2019

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);    
       }
     }
   }
}  

Спасибо исправил, но я так и не понял что делать с остальным.

negavoid
Offline
Зарегистрирован: 09.07.2016

ну почти готово же уже :)

for ( int i = 0; i <= svet/100; i++ )
{
    digitalWrite( i, HIGH );
}

 

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

А зачем нужен цикл в строке 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(); 
      }
  }
}  

 

Plbk
Offline
Зарегистрирован: 01.12.2019

negavoid пишет:

ну почти готово же уже :)

for ( int i = 0; i <= svet/100; i++ )
{
    digitalWrite( i, HIGH );
}

 

Так, то есть надо добавить цикл с переменной i где она будет отвечать за светодиоды, но если с началом i проблем нету это 0 то вот конец вызывает вопросы, а если значение света 250 или 90 ? Это будет 90/100 это 0,9 или 250/100 это 25 и какой тогда будет гореть светодиод ?

 

Plbk
Offline
Зарегистрирован: 01.12.2019

anatoli_nik пишет:

А зачем нужен цикл в строке 20?

Так будет более привильно ИМХО:

Если использовать твой(ваш) код то гореть светодиоды будут только когда темно , а мне к этому надо еще чтобы каждый светодиод отображал определенный процент освещенности. То есть когда от 1 до 10% горит 1 светодиод от 11 до 20% второй и т.д. но все равно спасибо

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

На, разбирайся (загораются линейкой):

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);
	 }
   }

} 
   

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Возьмите микросхему LM3914N - это всё это уже готово. Пример с миганием есть в даташите. А ардуину для более полезных дел используете.

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Евгений, это ему задали в (вставить учебное заведение)....

Вот загораются по одному:

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);
	 }
   }

} 
   

 

negavoid
Offline
Зарегистрирован: 09.07.2016

250/100 = 2.5, то есть будут гореть 0, 1 и 2. Ну и погасить ненужные с предыдущего loop-a не забыть.