динамическая индикация

pet_andrey
Offline
Зарегистрирован: 20.10.2017
Уважаемое сообщество кто подскажет как переделать функцию Showdigits с использованием millis а не delay.
byte digits[10]={
  B01111110,//* 0
  B00110000,//* 1
  B01101101,//* 2
  B01111001,//* 3
  B00110011,//* 4
  B01011011,//* 5
  B01011111,//* 6
  B01110000,//* 7
  B01111111,//* 8
  B01111011,//* 9
};
int pins[7]={8,7,6,5,4,3,2};//*{2,3,4,5,6,7,8};
int dig[2]={11,12};


void setup() {

for(int i=0;i<7;i++)
pinMode(pins[i],OUTPUT);
for(int i=0;i<2;i++)
{pinMode(dig[i],OUTPUT);
digitalWrite(dig[i],LOW);
}

}

void loop() {

showdigits(32);

}

void showdigits(int val){
int d0 = val%10;
int d1 = val/10;

digitalWrite(dig[0],HIGH);
for (int i=0; i<7;i++){
if(bitRead(digits[d0],i)==LOW) // зажечь сегмент
digitalWrite(pins[i],HIGH);
else // потушить сегмент
digitalWrite(pins[i],LOW);
}
delay(15);
digitalWrite(dig[0],LOW);

digitalWrite(dig[1],HIGH);
for (int i=0; i<7;i++){
if(bitRead(digits[d1],i)==LOW) // зажечь сегмент
digitalWrite(pins[i],HIGH);
else // потушить сегмент
digitalWrite(pins[i],LOW);
}
delay(15);
digitalWrite(dig[1],LOW);

}

 

b707
Offline
Зарегистрирован: 26.05.2017

показали первую цифру - вышли из функции на 15мс, потом снова зашли и показали вторую цифру...

и так по кругу

pet_andrey
Offline
Зарегистрирован: 20.10.2017

как организовать выход из функции, я еще этого не знаю

b707
Offline
Зарегистрирован: 26.05.2017

pet_andrey пишет:

как организовать выход из функции, я еще этого не знаю

выход происходит либо когда функция достигла последнего оператора, либо по оператору return

В вашем случае можно написать и так и эдак

bwn
Offline
Зарегистрирован: 25.08.2014

Аха, следующий вопрос - а как узнать, что прошло 15мС?))))

pet_andrey
Offline
Зарегистрирован: 20.10.2017

вопросы вы интересные задаете, да только ответов нет. Переделал тут чутка может теперь кто подскажет как заменить на миллис? Познания в ардуино 2 дня просьба сильно не пинать.

void loop() {
int d0 = val%10;
int d1 = val/10;

showdigits(d0,0);
delay(15);
showdigits(d1,1);
delay(15);
}

void showdigits(int d,int n){

for (int i=0;i<2;i++){
digitalWrite(dig[i],LOW);  
}
for (int i=0; i<7;i++){
if(bitRead(digits[d],i)==LOW) // зажечь сегмент
digitalWrite(pins[i],HIGH);
else // потушить сегмент
digitalWrite(pins[i],LOW);
}
digitalWrite(dig[n],HIGH);


}

 

b707
Offline
Зарегистрирован: 26.05.2017

неправильно переделали, так работать не будет

pet_andrey
Offline
Зарегистрирован: 20.10.2017

вы не поверите но работает.Подскажите как убрать теперь delay.

b707
Offline
Зарегистрирован: 26.05.2017

pet_andrey пишет:

вы не поверите но работает.

да, согласен, посмотрел невнимательно

pet_andrey пишет:

Подскажите как убрать теперь delay.

посмотрите пример "блинк без делай"

pet_andrey
Offline
Зарегистрирован: 20.10.2017

вы имеете ввиду сделать так

if (millis()-last_time>5){
  last_time=millis();
  showdigits(d0,0);
}
if (millis()-last_time>5){
  last_time=millis();
  showdigits(d1,1);

 

bwn
Offline
Зарегистрирован: 25.08.2014

По устоявшейся традиции, от себя, Лешака порекомендую.

b707
Offline
Зарегистрирован: 26.05.2017

pet_andrey пишет:

вы имеете ввиду сделать так

if (millis()-last_time>5){
  last_time=millis();
  showdigits(d0,0);
}
if (millis()-last_time>5){
  last_time=millis();
  showdigits(d1,1);

 

нет, в таком случае у вас условие в строке 5 не сработает никогда

Я бы сделал только одно условие с миллис. а уже в нем запускал то одну цифру. то другу.

pet_andrey
Offline
Зарегистрирован: 20.10.2017

все закипел. ни хрена не понял. есть условие миллис подождали 5 мс и высветили одну цифру, как мне опять подождать еще 5 мс и высветить вторую

pet_andrey
Offline
Зарегистрирован: 20.10.2017

есть еще одна извращенская комбинация, но както не изящно

if (round(millis()/5)%2==0)
  showdigits(d0,0);
//*delay(15);
if (round(millis()/10)%2==0)
showdigits(d1,1);
//*delay(15);

 

pet_andrey
Offline
Зарегистрирован: 20.10.2017

b707 пишет:

pet_andrey пишет:

вы имеете ввиду сделать так

if (millis()-last_time>5){
  last_time=millis();
  showdigits(d0,0);
}
if (millis()-last_time>5){
  last_time=millis();
  showdigits(d1,1);

 

нет, в таком случае у вас условие в строке 5 не сработает никогда

Я бы сделал только одно условие с миллис. а уже в нем запускал то одну цифру. то другу.

кстати так работает я фиг знает по чему, но сильно видно мерцание

b707
Offline
Зарегистрирован: 26.05.2017

вот так попробуйте

bool flag ;

if (millis()-last_time>5){
  last_time=millis();
 if (flag) showdigits(d0,0);
 else  showdigits(d1,1);
 flag = ! flag;
}

flag должен быть глобальной или статик переменной

pet_andrey
Offline
Зарегистрирован: 20.10.2017

b707 пишет:

вот так попробуйте

bool flag ;

if (millis()-last_time>5){
  last_time=millis();
 if (flag) showdigits(d0,0);
 else  showdigits(d1,1);
 flag = ! flag;
}

flag должен быть глобальной или статик переменной

таким образом отражаются кракозяблы на индикаторах

b707
Offline
Зарегистрирован: 26.05.2017

pet_andrey пишет:

таким образом отражаются кракозяблы на индикаторах

что-то тут не так, если работал код #5. то и этот должен

Весь код покажите

pet_andrey
Offline
Зарегистрирован: 20.10.2017

Спасибо большое все работает это два проводка отошло. Индикация работает теперь пойду разбираться с нтс. Если бы еще Гуру ткнули носом где почитать про 2 кнопки к одному аналоговому входу почитать как это обрабатывать, было бы супер.

bwn
Offline
Зарегистрирован: 25.08.2014

В теме - работа с кнопками. Ток не постите туда ничего, усе равно потру.