как оптимизировать ?

kiselev
Offline
Зарегистрирован: 02.07.2016
 int a0 = analogRead(A0)/4;// читаю число 
  
  float y = 0.05076142*a0; // считаю сколько светодиодов из 10 должно гореть 
  float v =y;          приравниваю 
  delay(150);
  a0 = analogRead(A0)/4;  \\беру новое значение 
  y = 0.05076142*a0;   // считаю сколько светодиодов из 10 должно гореть
  if (v<=y) {                       \\ по циклу каждый раз включаю и выключаю 
  for (int i = 1; i<=v; i++){
    digitalWrite(i, HIGH);
  }
  }else{
  for (int i = (int) v; i>=y; i--){
  digitalWrite(i, LOW);
  }

что за устройство ? Идея в том ,что я меняю сопротивление на ризисторе, ардуин высчитывает это и выдает значения на светодиодной шкале от 1 до 10.Сталкнулся с тако проблеммой что если к этой программе еще что -то дописывать, то она жудко лагать начинает,думаю это из за того ,что цикл долго выполнеться.

Помогите оптимизировать .Зарание спасибо .

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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

1- делаете то что не надо делать.

2- не делаете того что надо делать.

3 - вообще даже не с того конца зашли.

Вот вариант,но там на 74HC595

/*
#1 переменый резистор +5V -> +5V
                        R1-> A0     (R1_pin)
                      GND -> GND
#2    DATA  ->8  (Data_pin)
       CLK  ->7  (CLK_pin)
     LATCH  ->4  (LATCH_pin) 
 D0->Led1;D1->Led2;D3->Led3;D4->Led4;D5->Led5;D6->Led6;D7->Led7;D8->Led8;
GND -> GND  1 горит / 0 нет
*/
//#1
const int R1_pin = A0;
uint16_t R1_value = 0;
//#2
const int Latch_pin=4;
const int CLK_pin  =7;
const int Data_pin =8;
const int Value_Step =1023/9; // норми коэф мах уровень на 9 состояний (ничего не горит и горят все 8)
// матрица уровней .... .... , .... ...0, -, 0000 0000
const byte LEVEL_MAP[] = {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};
// вывод на светодиоды 
void WriteLevel(int Value){
  digitalWrite(Latch_pin,0); 
  shiftOut(Data_pin, CLK_pin, MSBFIRST, LEVEL_MAP[Value/Value_Step]);
  digitalWrite(Latch_pin,1);    
}
void setup() {
 //#1
 //#2
  pinMode(Latch_pin,OUTPUT);
  pinMode(CLK_pin,OUTPUT);
  pinMode(Data_pin,OUTPUT);
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 непрерывно сьем уровня с потенциометра
  R1_value = analogRead(R1_pin);
  //#2 раз в 0,100 сек выдача уровня на светодиоды
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2) {
    future2 = MILLIS + 100 ;
    WriteLevel(R1_value);
  }
}

ПС: в вашем случае еще проще.

/*
#1 переменый резистор +5V -> +5V
                        R1-> A0     (R1_pin) 0...1023
                      GND -> GND
#2 светодиоды led1-10  ->2,3,4,5,6,7,8,9,10,11   горит 0/ не горит 1
    второй вывод через R=1кОм-> Ucc
*/
//#1
const int R1_pin = A0;
uint16_t R1_value = 0;
//#2
const byte Led_pin[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; // пины светодиодов
const int quantity_led = 9; // количество светодиодов начиная с нуля 0...9
uint8_t i, level; // счетчик цикла и сколько светодиодов надо зажечь
const uint16_t normalization = 1024 / 10; // нормирование максимум отображение на кол-во светодиодов
void setup() {
  //#1
  //#2
  for ( i = 0; i <= quantity_led; i++) { // инициализировать и погасить светодиоды
    pinMode(Led_pin[i], OUTPUT);
    digitalWrite(Led_pin[i], 1);
  }
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1 непрерывно сьем уровня с потенциометра
  R1_value = analogRead(R1_pin);
  //#2 раз в 0,100 сек выдача уровня на светодиоды
  static uint32_t future2 = 0 ;
  if (MILLIS >= future2) {
    future2 = MILLIS + 100 ;
    level = R1_value / normalization;
    for ( i = 0; i <= quantity_led; i++) digitalWrite(Led_pin[i], (i >= level));
  }
}

 

kiselev
Offline
Зарегистрирован: 02.07.2016

74HC595 имеет всего 8 пинов на выход,есть что то похожее но на 10 пинов ?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

kiselev пишет:

74HC595 имеет всего 8 пинов на выход,есть что то похожее но на 10 пинов ?

Возмите две 74HC595 и ног будет 16. http://meandr.org/archives/5107

или так https://goo.gl/Mw2pLh

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

функцией map не получится?