Inkrementacja zmiennej

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
maver144
Młodszy majsterkowicz
Posty: 2
Rejestracja: 5 sie 2016, 15:51

Inkrementacja zmiennej

Post autor: maver144 » 5 sie 2016, 15:59

Mam pewien problem związany ze zmiennymi w arduino. Podczas trwania pętli loop w instrukcji warunkowej inkrementuje pewną zmienną. Natomiast po wyjściu z if'a wraca ona do wartości początkowej.

Kod: Zaznacz cały

	
	#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);

void setup(){
  Serial.begin(9600);
  while(!Serial);
  pinMode(A0,INPUT);
  lcd.begin(16,2);
  lcd.print("ABCDEFGHIJKLMNOP");
  lcd.setCursor(0,1);
  lcd.print("QRSTUVWXYZ");
  lcd.cursor();
  }

void loop(){
  float odczyt = analogRead(A0)/1024.00*5;
  float T1;
  float T2;
  int counterX = 0;
  int counterY = 0;

  
  
  T1=analogRead(A0)/1024.00*5;
  delay(500);
  T2=analogRead(A0)/1024.00*5;
  
  Serial.print(T1);
  Serial.print(" ");
  Serial.print(T2);
  Serial.print(" X_OUT:");
  Serial.println(counterX);
  
  if(T1-T2>0.1){
    Serial.print("INKREMENTACJA ");
    Serial.print("X_FOR: ");
    counterX++;
    Serial.println(counterX);
    lcd.setCursor(counterX,counterY);
    //if(counterX>=15)counterX=15;
    }
  
  
  }
	
Serial monitor:

Kod: Zaznacz cały

4.17 4.17 X_OUT:0
4.17 4.17 X_OUT:0
4.17 4.17 X_OUT:0
4.17 4.07 X_OUT:0
INKREMENTACJA X_FOR: 1 <-------- nastepuje inkrementacja od wartości 0 do 1
4.07 3.63 X_OUT:0 <---------------- po wyjściu z ifa wartośc zmiennej ponownie jest 0
INKREMENTACJA X_FOR: 1
3.63 3.41 X_OUT:0
INKREMENTACJA X_FOR: 1
3.41 3.22 X_OUT:0
INKREMENTACJA X_FOR: 1
3.23 3.09 X_OUT:0
INKREMENTACJA X_FOR: 1
3.09 3.01 X_OUT:0
3.01 3.01 X_OUT:0
3.01 3.01 X_OUT:0
3.01 3.01 X_OUT:0

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Monk
Młodszy majsterkowicz
Posty: 35
Rejestracja: 31 lip 2016, 23:02

Re: Inkrementacja zmiennej

Post autor: Monk » 5 sie 2016, 16:22

Tworzysz zmienną w pętli - na samym początku pętli przypisujesz dla int counterX wartość 0. Nie tyle po wyjściu z "ifa" wartość ulega wyzerowaniu, tylko po ponownym odtworzeniu głównej pętli.
Możesz to sprawdzić tak, że po ifie (ale przed końcem programu) dajesz znów Serial.println(counterX); i zobaczysz, że nadal ma ona przypisaną 1.

Jeżeli chcesz żeby counterX rosło dalej niż 1 i się nie zerowało, to musisz tą zmienną dać u góry programu - poza pętlą, po prostu ustawiasz ją raz z wartością 0 (ale nie w pętli głównej), a dalej leci - aż do jakiejś wartości np. 16 i dopiero ją sobie zerujesz w pętli po spełnieniu warunku (że np. wzrosło do 16).

Chyba o to Ci chodzi tak?
maver144
Młodszy majsterkowicz
Posty: 2
Rejestracja: 5 sie 2016, 15:51

Re: Inkrementacja zmiennej

Post autor: maver144 » 5 sie 2016, 17:02

Tak o to chodziło dziękuje ! Oczywiste ale jakoś mi umknęło :)
Monk
Młodszy majsterkowicz
Posty: 35
Rejestracja: 31 lip 2016, 23:02

Re: Inkrementacja zmiennej

Post autor: Monk » 5 sie 2016, 17:44

Czasem już tak bywa :)
hazi18
Młodszy majsterkowicz
Posty: 8
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 18 paź 2019, 20:39

Witam,
mam mały problem, nie umiem zaimplementować przycisku tak, aby inkrementował mi zmienną o 1.

Kod: Zaznacz cały

int i;
int j=0;
void setup() {
    Serial.begin(9600); //Begin serial communication
  pinMode(dioda, OUTPUT);        // Ustawienie pinu 8 jako wyjście
  pinMode(przycisk,INPUT_PULLUP);      // Ustawienie pinu 3 jako wejście

  if (digitalRead(przycisk) == LOW)
{
   int i=0;
}
while (digitalRead(przycisk) == HIGH);
{
  j=i++;
}

}

void loop() 
{


  Serial.print("liczba: "); 
    Serial.print(j);
    delay (1000);
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Inkrementacja zmiennej

Post autor: Marhef » 18 paź 2019, 23:29

Ale namieszałeś...
Od początku. Co wiesz na temat arduino?
hazi18
Młodszy majsterkowicz
Posty: 8
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 21 paź 2019, 17:40

Hej,
na temat arduino wiem bardzo mało. dopiero co zaczynam pisać projekty.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Inkrementacja zmiennej

Post autor: Marhef » 21 paź 2019, 19:24

Chcesz dostać gotowca, czy się czegoś nauczyć?
Przede wszystkim, opisz dokładnie, co chcesz osiągnąć.
hazi18
Młodszy majsterkowicz
Posty: 8
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 23 paź 2019, 18:04

gotowca projektu nie chce, bardziej potrzebuję kawałka kodu, który będzie działać tak jak chce.
Mój projekt to: przepływomierz wody z czujnikiem.
Projekt ma za zadania badać przepływ wody do karmików świń. Jeśli stały przepływ wody przekroczy 30l. przepływomierz ma odciąć dostęp do wody. Naprawiam awarię i chcę, aby woda ponownie zaczęła lecieć więc uruchamiam przepływkę z czujnikiem (program) przyciskiem (coś typu START). Problem mój jest taki, że nie potrafię w żaden sposób zatrzymać działania po osiągnięciu celu (30l.).
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Inkrementacja zmiennej

Post autor: Marhef » 23 paź 2019, 18:51

Może załóż nowy temat. Bo Ty nie masz problemu z inkrementacją zmiennej.
Moim zdaniem, w Twoim przypadku najłatwiej będzie zrobić maszynę stanu. Ale to rozwiniemy w Twoim temacie :) opisz tam dokładnie, jak ma to działać.
hazi18
Młodszy majsterkowicz
Posty: 8
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 24 paź 2019, 06:29

O kurde, napisałem problem nie w tym temacie przepraszam :)
Jeśli chodzi o inkrementację to chce zrobić program sterujący pracą wentylatora. Ogólnie program mam i działa jak chcę, że po osiągnięciu 25 stopni ma się wentylator włączać a poniżej nie, ale gdybym chciał zmienić tą wartość (stałą) z 25 stopni na 23 to nie chce wgrywać programu tylko ustawić to za pomocą inkrementacji i dekrementacji.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Inkrementacja zmiennej

Post autor: Marhef » 25 paź 2019, 15:12

No cóż. Może zacznij od przykładów z arduino ide?
Tam jest taki przykład w "Digital", który nazywa się "Debounce".

A w ogóle, pokaż cały swój kod. Bo z tego, co widzę, chcesz zrobić najprostszy termostat. Ciekaw jestem, jak Ci to wyszło.

A odnosząc się do tego fragmentu kodu, który tu wrzuciłeś: przycisk sprawdzasz tylko jeden raz, zaraz po podaniu zasilania. Później tylko wyświetlasz wartość zmiennej, która będzie stała i wynosiła 1.

Jeśli chcesz, mogę pomóc napisać ten program w całości. Ale tylko pomóc :)
hazi18
Młodszy majsterkowicz
Posty: 8
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 28 paź 2019, 19:30

tutaj jest działający inkubator. Narazie na tym kodzie chcę przetestować to zatrzymywanie się programu i uruchamianie z przycisku ponieważ mam podzespoły z których złoże całość i wytestuję.

Kod: Zaznacz cały

//Include libraries
//#include <OneWire.h>
//#include <DallasTemperature.h>
int przekaznik=7;
#include "DHT.h"
#include <TM1637Display.h>

#define DHTPIN 2     // what pin we're connected to
// Data wire is plugged into pin A0 on the Arduino
//#define ONE_WIRE_BUS A0
#define DHTTYPE DHT22   // DHT 22  (AM2302)
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
//OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
//DallasTemperature sensors(&oneWire);
DHT dht(DHTPIN, DHTTYPE);
const int CLK = 4; //Set the CLK pin connection to the display
const int DIO = 3; //Set the DIO pin connection to the display
int NumStep = 0;  //Variable to interate
TM1637Display display(CLK, DIO);  //set up the 4-Digit Display.
int resetPin = 12;
void setup(void)
{
    digitalWrite(resetPin, HIGH);
  delay(1000);
   digitalWrite(resetPin, LOW);
  pinMode(przekaznik,OUTPUT);  // ustawienie pinu jako wyjście
  digitalWrite(przekaznik,LOW); // ustawienie na nim stanu niskiego
  display.setBrightness(0x0a);  //set the diplay to maximum brightness
  Serial.begin(9600); //Begin serial communication
 // Serial.println("Arduino Digital Temperature // Serial Monitor Version"); //Print a message
  //sensors.begin();
  dht.begin();
}

void loop(void)
{ 
  
 unsigned char i, j ;   
  // Send the command to get temperatures
//  sensors.requestTemperatures();  
 // Serial.print("Temperature is: ");
 // Serial.println(sensors.getTempCByIndex(0)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  //Update value every 0,5 sec.
 // delay(100);
   float h = dht.readHumidity();
  float t = dht.readTemperature();
if (dht.readTemperature()>=37.88)  // wywołanie funkcji warunkowej
{
     digitalWrite(przekaznik,HIGH);  // włączenie przekaźnika   
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
     delay(10000);
}

  else  // wywołanie funkcji warunkowej
  {
   digitalWrite(przekaznik,LOW);  // wyłączenie przekaźnika

    display.showNumberDec(h); //Display the Variable value;

  delay(100);     
  
  } 
  
}


Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Inkrementacja zmiennej

Post autor: Marhef » 29 paź 2019, 13:36

Ale namieszałeś... to chyba zostało złożone z kilku przykładów z internetu?
Możemy poprawiać to, co tu wstawiłeś. Albo napisać od początku. I nie, nie podam gotowego rozwiązania. Możemy napisać razem od początku. Albo razem poprawiać.

A zaczniemy od... wypisz to listę elementów, których chcesz użyć. I napisz, albo najlepiej narysuj schemat połączenia
hazi18
Młodszy majsterkowicz
Posty: 8
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 29 paź 2019, 19:20

w tym projekcie używam grzałki na przekaźniku, czujnika DTH22, i 3 wyświetlaczy do wyświetlania temperatury, wilgotności a trzeci do liczenia czasu (sekundomierz) bo zwiesił mi sie program i jajka się zesmażyły. Więc jak widzę ze on stoi to umiem zareagować i wyciągnąć z prądu a tak bez tego ie wiedziałem czy program wisi czy nie.
Ten program to sklejka kilku elementów z neta.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Inkrementacja zmiennej

Post autor: Marhef » 30 paź 2019, 15:02

Wyświetlacze na sterowniku TM163?
Napisz jeszcze, co działa
hazi18
Młodszy majsterkowicz
Posty: 8
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 30 paź 2019, 18:34

Tak wyswietlacze są TM1637. działa wiatrak ale on jest włączony ciagle bo ma rozprowadzać powietrze po inkubatorze. Na dole zapomniałem dodać kod odpowiedzialny za wyswietlanie sie danych na wyswietlaczu :) ale to nie istotne :)
Awatar użytkownika
Marhef
Złota rączka
Posty: 1157
Rejestracja: 18 lis 2011, 02:18

Re: Inkrementacja zmiennej

Post autor: Marhef » 31 paź 2019, 00:24

Wszystkie wyświetlacze masz podłączone do tych samych pinów?!
Wstaw cały kod, tak to jest tylko próba zgadnięcia co i jak działa
hazi18
Młodszy majsterkowicz
Posty: 8
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 5 lis 2019, 18:32

Kod: Zaznacz cały

int przekaznik=7;
#include "DHT.h"
#include <TM1637Display.h>

#define DHTPIN 2     // what pin we're connected to

#define DHTTYPE DHT22   // DHT 22  (AM2302)

DHT dht(DHTPIN, DHTTYPE);
const int CLK = 4; //Set the CLK pin connection to the display
const int DIO = 3; //Set the DIO pin connection to the display
const int CLK1 = 6; //Set the CLK pin connection to the display
const int DIO1 = 5; //Set the DIO pin connection to the display
const int CLK2 = 9; //Set the CLK pin connection to the display
const int DIO2 = 8; //Set the DIO pin connection to the display
int NumStep = 0;  //Variable to interate
TM1637Display tm1637a(CLK, DIO);  //set up the 4-Digit Display.
TM1637Display tm1637b(CLK1, DIO1);  //set up the 4-Digit Display.
TM1637Display tm1637c(CLK2, DIO2);  //set up the 4-Digit Display.
int resetPin = 12;
void setup(void)
{
    digitalWrite(resetPin, HIGH);
  delay(1000);
   digitalWrite(resetPin, LOW);
  pinMode(przekaznik,OUTPUT);  // ustawienie pinu jako wyjście
  digitalWrite(przekaznik,LOW); // ustawienie na nim stanu niskiego
  tm1637a.setBrightness(0x0a);  //set the diplay to maximum brightness
  tm1637b.setBrightness(0x0a);  //set the diplay to maximum brightness
  tm1637c.setBrightness(0x0a);  //set the diplay to maximum brightness
  Serial.begin(9600); //Begin serial communication

  dht.begin();
}

void loop(void)
{ 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  int i=0;
if (dht.readTemperature()>=36.5)  // wywołanie funkcji warunkowej
{
     digitalWrite(przekaznik,HIGH);  // włączenie przekaźnika   
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");

}

  else  // wywołanie funkcji warunkowej
  {
   digitalWrite(przekaznik,LOW);  // wyłączenie przekaźnika
   Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");  
  } 
      tm1637a.showNumberDec(h); //Display the Variable value;
      tm1637b.showNumberDec(t); //Display the Variable value;
      
      
    for (i; i <= 10; i++) {
     tm1637c.showNumberDec(i); //Display the Variable value;  
    delay(1000);
    }  
  
}


ODPOWIEDZ

Strony partnerskie: