• 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
Jak zrealizować zapamiętanie wartości parametru
#1
W czasie nauki Arduino zaciąłem się na pewnym zadaniu.

Jak zapamiętać wartość ciągle zmieniającego się parametru aby wyświetlać jego stan w chwili naciśnięcia przycisku??


AKTUALNE - ma się zmieniać odliczając w dół co 1
ZAPAMIETANE - w chwili naciśnięcia przycisku na pin 5 ma zapamiętać to co było wyświetlane jako "Aktualne" i wyświetlać jako "Zapamiętane", przy ponownym naciśnięciu przycisku wyświetlana wartość "Zapamiętana" ma być nadpisywana na nową.

Poniżej kod treningowy.
Kod:
#include <SoftwareSerial.h>
int inPin = 5;


SoftwareSerial mySerial(10, 11); // RX, TX

int zmienna1 = 1000;
int zmienna2;

void setup()
{
 Serial.begin(9600);
 pinMode(inPin, INPUT);  
}
void loop() {
 
 zmienna2 = zmienna1--;
 
while (inPin = LOW);
{
Serial.print("AKTUALNE     ");
Serial.println(zmienna1);
Serial.print("ZAPAMIETANE  ");
Serial.println(zmienna2);
Serial.println("---------------------");
}
delay(500);

}
 
#2
Wprowadź nową zmienną o nazwie zapamietane:
Kod:
int pamiec;

void setup(){}

void loop(){}
Potem, w momencie wciśnięcia przycisku... przy okazji, jeśli dla przycisku stosujesz pętle while, wtedy kod w pętli będzie wykonywał się przez cały czas, jeśli przycisk będzie wciśnięty przez dłuższy czas. Zamiast tego proponuję warunek if. Druga rzecz, że jeden znak równości oznacza przypisanie, natomiast podwójny - porównanie. Poniżej cały kod, poprawiony już:
Kod:
#include <SoftwareSerial.h>

int inPin = 5;
int licznik = 1000;
int pamiec=licznik;

SoftwareSerial mySerial(10, 11); // RX, TX

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

void loop()
{
licznik--;
if (digitalRead(inPin) == LOW)
{
Serial.print("AKTUALNE     ");
Serial.println(licznik);
Serial.print("ZAPAMIETANE  ");
Serial.println(pamiec);
Serial.println("---------------------");
pamiec=licznik;
while(digitalRead(intPin)==LOW){}
}
delay(500);
}

Zrobiłeś mnóstwo błędów. To w ogóle działało? Smile Kompilować, to się kompiluje. Przy okazji, podepnij przycisk do masy, ale chyba to już zrobiłeś, skoro przyrównujesz wartość LOW.
 
#3
Wiem że popełniam błędy, każdy mi mówi czego nie robićSmile jak u EdisonaBig Grin
krn78 bardzo dziękuje za podpowiedź i kod, jednak muszę przyznać że nie do końca o to chodziłoSad

Chciałbym otrzymać coś takiego, wyświetlanego stale:
"AKTUALNE     999
ZAPAMIETANE  wartosc zapamietana - wyswietlana caly czas, ta sama do czasu kolejnego nacisniecia przycisku
---------------------
AKTUALNE     998
ZAPAMIETANE  wartosc zapamietana - wyswietlana caly czas, ta sama do czasu kolejnego nacisniecia przycisku
---------------------
i tak dalej.
Kod który Napisałeś wyświetla to o co mi chodzi, ale tylko w chwili gdy trzymam przycisk, co zrobić żeby zapamiętana wartość , wyświetlała się cały czas??

Na zasadzie:

Aktualne- 1000
Zapamiętane - brak
Aktualne- 999
Zapamiętane - brak
=> naciskam i puszczam przycisk i od tej pory aż do czasu ponownego naciśnięcia:
Aktualne- 998
Zapamiętane - 999
Aktualne- 997
Zapamiętane - 999
=> ponownie naciskam przycisk
Aktualne- 996
Zapamiętane - 997
Aktualne- 995
Zapamiętane - 997
Aktualne- 994
Zapamiętane - 997
Aktualne- 993
Zapamiętane - 997
itd

Tak jakby były dwie pętle, jedna cały czas odlicza i pokazuje wartość,  a druga zwalniana przyciskiem pokazuje cały czas wartość z chwili naciśnięcia przycisku.

Coś w stylu:

Kod:
#include <SoftwareSerial.h>

int inPin = 5;
int licznik = 1000;
int pamiec=licznik;

SoftwareSerial mySerial(10, 11); // RX, TX

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

void loop()
{
licznik--;
delay(500);
if (digitalRead(inPin) == LOW)                  
 {
 Serial.print("AKTUALNE     ");
 Serial.println(licznik);
 Serial.print("ZAPAMIETANE  ");
 Serial.println(pamiec);
 Serial.println("---------------------");
 }

else (digitalRead(inPin) == HIGH);
 {
 Serial.print("AKTUALNE     ");
 Serial.println(licznik);
 Serial.print("ZAPAMIETANE  ");
 Serial.println("wartosc zapamietana - wyswietlana caly czas, ta sama do czasu kolejnego nacisniecia przycisku");       // wartosc niezmienna z pamieci
 Serial.println("---------------------");
 }
pamiec=licznik;
while(digitalRead(inPin)==LOW){}
}
 
#4
(27-11-2017, 17:33)jack1987 napisał(a): Kod który Napisałeś wyświetla to o co mi chodzi, ale tylko w chwili gdy trzymam przycisk, co zrobić żeby zapamiętana wartość , wyświetlała się cały czas??
Musisz po prostu przenieść elementy wyświetlające poza warunek naciśnięcia przycisku Smile
Kod:
#include <SoftwareSerial.h>

int inPin = 5;
int licznik = 1000;
int pamiec=1001;

SoftwareSerial mySerial(10, 11); // RX, TX

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

void loop()
{
Serial.print("AKTUALNE     ");
Serial.println(licznik);
Serial.print("ZAPAMIETANE  ");
if(pamiec>1000){
Serial.println("---");
} else {
Serial.println(pamiec);}
Serial.println("---------------------");

if (digitalRead(inPin) == LOW)
{
pamiec=licznik;
while(digitalRead(intPin)==LOW){}
}
delay(500);
licznik--;
}

Tak to chyba zadziała. Piszę cały czas z pamięci, więc mogą być jakieś błędy składniowe.
 
#5
heh proste i działająceSmile a ja już zaczynałem kombinować z eeprom.
dzięki
 
  


Skocz do:


Przeglądający: 1 gości