• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Ograniczenia funkcji counter
#1
Witam
Proszę o informację jak można zawęzić funkcje counter.

Napisałem sobie programik, gdzie dwoma przyciskami funkcja counter zlicza sobie ilość wciśnięć. Przy czym jeden przycisk dodaje impulsy, a drugi odejmuje. Dodatkowo każdemu kolejnemu impulsowi przypisałem diodę LED.
I teraz opis problemu. Podglądając port serial widzę, że licznik impulsów może przyjąć postać liczby ujemnej jak i zero.
Ja bym chciał by mój licznik chodził w przedziale od 1 do 9.
Chciałbym by w przypadku gdy licznik pokazuje pierwszy impuls i naciska się przycisk zmniejszający ilość impulsów, liczba impulsów nie zmniejszała się do zera i następnie liczb ujemnych.
Podobnie w kwestii impulsu nr 9. Gdy będzie się naciskać przycisk zwiększający impulsy. Liczba nie może się już więcej zwiększać i pozostać na nr 9.

Wizualnie obsługa przycisków i zapalających diod Led łudząco ma wyglądać jak obsługa potencjometru elektronicznego.
 
Odpowiedź
#2
Taka linijka załatwi ci sprawę

Kod:
if ( counter < 1 )counter = 1 ;
if ( counter > 9 )counter = 9 ;

No dobra 2 linijki

A niech ci będzie masz gotowca  Wink przyciski pin 3 i 4 do masy .

Kod:
byte state3 = HIGH ;
byte state4 = HIGH ;

int counter = 1 ;

void setup() {
 
 Serial.begin(9600);
 pinMode(3,INPUT_PULLUP);
 pinMode(4,INPUT_PULLUP);
 
}

void loop() {
 
if ( digitalRead(3) == LOW and state3 == HIGH){
 counter = counter + 1 ;state3 = LOW ;}

if ( digitalRead(4) == LOW and state4 == HIGH){
 counter = counter - 1 ;state4 = LOW ;}

if ( digitalRead(3) == HIGH )state3 = HIGH;
if ( digitalRead(4) == HIGH )state4 = HIGH;

if ( counter > 9 )counter = 9;
if ( counter < 1 )counter = 1;

Serial.println(counter);
 
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#3
Dzięki za pomoc Smile

Co prawda dałem sobie wcześniej sam radę dodając taki kawałek kodu:
 if(counter != 15){

 counter = counter + 1;



Teraz mam inne pytanie co do obsługi przycisków w programie:

Kod:
 if (val1 == LOW && val2 == HIGH) {
 digitalWrite(ledPin1, LOW);
 currentState = 1;
 }
 else if (val1 == HIGH && val2 == LOW) {
 digitalWrite(ledPin2, LOW);
 currentState = 2;
 }
 else {
 digitalWrite(ledPin1, HIGH);
 digitalWrite(ledPin2, HIGH); // turn LED off
 currentState = 0;
 }
 
chciałbym by w programie była taka opcja, że zamiast naciskając np 6 razy przycisk, mógłbym nacisnąć i przytrzymać ten przycisk, a program w tym czasie programowo będzie udawał wciśniecie przyciku np co pół sekundy. I będzie tak udawał póki trzymam ten przycisk.
 
Odpowiedź
#4
To będzie troszkę inaczej , będę przy kompie to ci podam bo sam korzystam z takiego rozwiązania

Proszę bardzo

Kod:
int czas = 400; // czas w milisekundach co ile ma ponownie załączyć
long Pm = 0 ;
int counter = 1 ;

void setup() {

Serial.begin(9600);
pinMode(3,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);

}

void loop() {
  
  unsigned long Cm = millis();
  
if ( digitalRead(3) == LOW ){

if (Cm - Pm > czas ){counter = counter + 1 ;Pm = Cm;}}

if ( digitalRead(4) == LOW ){

if (Cm - Pm > czas ){counter = counter - 1 ;Pm = Cm;}}

if ( counter > 9 )counter = 9;
if ( counter < 1 )counter = 1;

Serial.println(counter);

}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#5
Coś mi działa ten kod i nie wiem czy go jakoś źle nie zaimplementowałem...



Poniżej wklejam swój kod i proszę o sugestię co w nim dopisać by działało jak trzeba. Dodam, że program steruje poprzez dwa przyciski 9 diodami i naciskanie jednego przycisku powoduje sekwencyjne włączanie diód.



Kod:
int ledPin1 = 4;
int ledPin2 = 5;
int ledPin3 = 13;
int ledPin4 = 12;
int ledPin5 = 11;
int ledPin6 = 10;
int ledPin7 = 9;
int ledPin8 = 8;
int ledPin9 = 7;
int ledPin10 = 6;
int switchPin1 =2;
int switchPin2 =3;
int counter = 1;
int val1 = 0;
int val2 = 0;
int currentState = 0;
int previousState = 0;
int count = 0;


void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin6, OUTPUT);
pinMode(ledPin7, OUTPUT);
pinMode(ledPin8, OUTPUT);
pinMode(ledPin9, OUTPUT);
pinMode(ledPin10, OUTPUT);
pinMode(switchPin1, INPUT);
pinMode(switchPin2, INPUT);
digitalWrite(switchPin1, HIGH);
digitalWrite(switchPin2, HIGH);
Serial.begin(9600);
}


void loop(){
val1 = digitalRead(switchPin1);
val2 = digitalRead(switchPin2);

if (val1 == LOW && val2 == HIGH) {
digitalWrite(ledPin1, LOW);
currentState = 1;
 }
 else if (val1 == HIGH && val2 == LOW) {
digitalWrite(ledPin2, LOW);
currentState = 2;
}
else {
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
currentState = 0;
}
if(currentState != previousState){
if(currentState == 1){
 if(counter != 15){
counter = counter + 1;
 
Serial.println(counter);
  if (counter == 1){                 //1
  digitalWrite(ledPin3, HIGH);
  }
  else{
  digitalWrite(ledPin3, LOW);
 
  if (counter == 2){                 //1,2
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, HIGH);
  }
  else{
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
 
  if (counter == 3){                 //2
  digitalWrite(ledPin4, HIGH);
  }
  else{
  digitalWrite(ledPin4, LOW);
 
  if (counter == 4){                 //2,3
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, HIGH);
  }  
  else{
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);
 
  if (counter == 5){                 //3
  digitalWrite(ledPin5, HIGH);
  }
  else{
  digitalWrite(ledPin5, LOW);
 
  if (counter == 6){                 //3,4
  digitalWrite(ledPin5, HIGH);
  digitalWrite(ledPin6, HIGH);
  }
  else{
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
 
  if (counter == 7){                 //4
  digitalWrite(ledPin6, HIGH);
  }
  else{
  digitalWrite(ledPin6, LOW);
 
  if (counter == 8){                 //4,5
  digitalWrite(ledPin6, HIGH);
  digitalWrite(ledPin7, HIGH);
  }
  else{
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
 
  if (counter == 9){                 //5
  digitalWrite(ledPin7, HIGH);
  }
  else{
  digitalWrite(ledPin7, LOW);
 
  if (counter == 10){                 //5,6
  digitalWrite(ledPin7, HIGH);
  digitalWrite(ledPin8, HIGH);
  }
  else{
  digitalWrite(ledPin7, LOW);
  digitalWrite(ledPin8, LOW);
 
  if (counter == 11){                 //6
  digitalWrite(ledPin8, HIGH);
  }
  else{
  digitalWrite(ledPin8, LOW);
 
  if (counter == 12){                 //6,7
  digitalWrite(ledPin8, HIGH);
  digitalWrite(ledPin9, HIGH);
  }
  else{
  digitalWrite(ledPin8, LOW);
  digitalWrite(ledPin9, LOW);
 
  if (counter == 13){                 //7
  digitalWrite(ledPin9, HIGH);
  }
  else{
  digitalWrite(ledPin9, LOW);
 
  if (counter == 14){                 //7,8
  digitalWrite(ledPin9, HIGH);
  digitalWrite(ledPin10, HIGH);
  }
  else{
  digitalWrite(ledPin9, LOW);
  digitalWrite(ledPin10, LOW);
 
  if (counter == 15){                 //8
  digitalWrite(ledPin10, HIGH);
  }
  else{
  digitalWrite(ledPin10, LOW);
 
  if (counter == 16){                 //8,9
  digitalWrite(ledPin10, HIGH);
  digitalWrite(ledPin1, HIGH);
  }
  else{
  digitalWrite(ledPin10, LOW);
  digitalWrite(ledPin1, LOW);
 
  if (counter == 17){                 //9
  digitalWrite(ledPin1, HIGH);
  }
  else{
  digitalWrite(ledPin1, LOW);
  }}}}}}}}}}}}}}}}}
 
  }}}

 
if(currentState != previousState){
if(currentState == 2){
 if(counter != 1){
counter = counter - 1;
Serial.println(counter);
 
  if (counter == 17){                 //9
  digitalWrite(ledPin1, HIGH);
  }
  else{
  digitalWrite(ledPin1, LOW);
 
  if (counter == 16){                 //8,9
  digitalWrite(ledPin10, HIGH);
  digitalWrite(ledPin1, HIGH);
  }
  else{
  digitalWrite(ledPin10, LOW);
  digitalWrite(ledPin1, LOW);
 
  if (counter == 15){                 //8
  digitalWrite(ledPin10, HIGH);
  }
  else{
  digitalWrite(ledPin10, LOW);
 
  if (counter == 14){                 //7,8
  digitalWrite(ledPin9, HIGH);
  digitalWrite(ledPin10, HIGH);
  }
  else{
  digitalWrite(ledPin9, LOW);
  digitalWrite(ledPin10, LOW);
 
  if (counter == 13){                 //7
  digitalWrite(ledPin9, HIGH);
  }
  else{
  digitalWrite(ledPin9, LOW);

  if (counter == 12){                 //6,7
  digitalWrite(ledPin8, HIGH);
  digitalWrite(ledPin9, HIGH);
  }
  else{
  digitalWrite(ledPin8, LOW);
  digitalWrite(ledPin9, LOW);

  if (counter == 11){                 //6
  digitalWrite(ledPin8, HIGH);
  }
  else{
  digitalWrite(ledPin8, LOW);

  if (counter == 10){                 //5,6
  digitalWrite(ledPin7, HIGH);
  digitalWrite(ledPin8, HIGH);
  }
  else{
  digitalWrite(ledPin7, LOW);
  digitalWrite(ledPin8, LOW);

  if (counter == 9){                 //5
  digitalWrite(ledPin7, HIGH);
  }
  else{
  digitalWrite(ledPin7, LOW);

  if (counter == 8){                 //4,5
  digitalWrite(ledPin6, HIGH);
  digitalWrite(ledPin7, HIGH);
  }
  else{
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);

  if (counter == 7){                 //4
  digitalWrite(ledPin6, HIGH);
  }
  else{
  digitalWrite(ledPin6, LOW);

  if (counter == 6){                 //3,4
  digitalWrite(ledPin5, HIGH);
  digitalWrite(ledPin6, HIGH);
  }
  else{
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
 
  if (counter == 5){                 //3
  digitalWrite(ledPin5, HIGH);
  }
  else{
  digitalWrite(ledPin5, LOW);

  if (counter == 4){                 //2,3
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, HIGH);
  }  
  else{
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);

  if (counter == 3){                 //2
  digitalWrite(ledPin4, HIGH);
  }
  else{
  digitalWrite(ledPin4, LOW);

  if (counter == 2){                 //1,2
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, HIGH);
  }
  else{
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
 
  if (counter == 1){                 //1
  digitalWrite(ledPin3, HIGH);
  }
  else{
  digitalWrite(ledPin3, LOW);
     
  }}}}}}}}}}}}}}}}}

  }}}



previousState = currentState;
delay(250);
}
 
Odpowiedź
#6
Kompletnie nie zrozumiałem o co biega  Big Grin . Zobacz czy kod poniżej to coś co chciałeś uzyskać

przyciski na 2 i 3 do masy diody od 4 do 13

Kod:
int czas = 200; // czas w milisekundach co ile ma ponownie załączyć
long Pm = 0 ;
int counter = 2 ;

int led[]=  {7,6,4,5,6,7,8,9,10,11,12,13,10,11};

void setup() {

Serial.begin(9600);

pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);

pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

}

void loop() {
 
 unsigned long Cm = millis();
 
digitalWrite(led[counter],HIGH);
 
 
if ( digitalRead(2) == LOW ){

if (Cm - Pm > czas ){counter = counter + 1 ;Pm = Cm;}}

if ( digitalRead(3) == LOW ){

if (Cm - Pm > czas ){counter = counter - 1 ;Pm = Cm;}}

digitalWrite(led[counter+2],LOW);
digitalWrite(led[counter-2],LOW);

Serial.print(led[counter]);
Serial.print(" / ");
Serial.println(counter);

if ( counter > 11 )counter = 11;
if ( counter < 2 )counter = 2;

}

a tu masz w kółko Macieja

Kod:
int czas = 100; // czas w milisekundach co ile ma ponownie załączyć
long Pm = 0 ;
int counter = 2 ;

int led[]=  {7,6,4,5,6,7,8,9,10,11,12,13,10,11};

void setup() {

Serial.begin(9600);

pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);

pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

}

void loop() {
  
  unsigned long Cm = millis();
  
digitalWrite(led[counter],HIGH);
  
  
if ( digitalRead(2) == LOW ){

if (Cm - Pm > czas ){counter = counter + 1 ;Pm = Cm;}}

if ( digitalRead(3) == LOW ){

if (Cm - Pm > czas ){counter = counter - 1 ;Pm = Cm;}}

digitalWrite(led[counter+2],LOW);
digitalWrite(led[counter-2],LOW);

if ( counter == 3 )digitalWrite(13,LOW);
if ( counter == 10 )digitalWrite(4,LOW);

Serial.print(led[counter]);
Serial.print(" / ");
Serial.println(counter);

if ( counter > 11 )counter = 2;
if ( counter < 2 )counter = 11;

}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości