Arduino Polska Forum

Pełna wersja: Jak zrealizować zapamiętanie wartości parametru
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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);

}
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.
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){}
}
(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.
heh proste i działająceSmile a ja już zaczynałem kombinować z eeprom.
dzięki