Ograniczenia funkcji counter - mavi - 13-04-2016
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.
RE: Ograniczenia funkcji counter - JasQ - 14-04-2016
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 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);
}
RE: Ograniczenia funkcji counter - mavi - 15-04-2016
Dzięki za pomoc
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.
RE: Ograniczenia funkcji counter - JasQ - 15-04-2016
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);
}
RE: Ograniczenia funkcji counter - mavi - 17-04-2016
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);
}
RE: Ograniczenia funkcji counter - JasQ - 17-04-2016
Kompletnie nie zrozumiałem o co biega . 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;
}
|