[ GolubBgd @ 03.12.2020. 13:51 ] @
Pozdrav svima, ako napisem da vec tri dana pokusavam da resim jedan problem bice vam jasno da nemam pojma... O cemu je rec, ne mogu da nateram da mi radi parce koda koje ce beleziti najmanju temperauru. Imam kod koji sa temp. senzora TMP36 iscitava temp i ispisuje je i to je ok, radi... Ono sto ja zelim jeste da i ispisuje / pamtiti najmanju temperauru tog dana/odnosno dok je upaljen.

Evo teksta / simulacije koji sam sebi napravio da bih skapirao problem ali mi ne ide a vama ce pojasniti sta zelim.

temp – Temperatura koju ocitava senzor
tempState – Trenutna ocitana temperatura
lasttempState = 99

tempState = temp; -------- Inicijalnoo citanje temperature npr. 24

if (lasttempState > tempState);-------- prvi krug - lasttempState je 99 a tepmeratura je 24 (99>=24)
lasttempState = tempState; ------------ uslov je ispunjen i lasttempState postaje 24
Serial.println("Min T: "); ----------------- ispisuje na displeju:
Serial.println(lasttempState); ----------- Min T: 24

if (lasttempState > tempState);-------- drugi krug - ocitavanja tepmeratura je i dalje 24 (24 = 24 )
lasttempState = tempState; ------------ lasttempState ostaje 24 jer uslov nije ispunjen
Serial.println("Min T: "); ----------------- ispisuje na displeju:
Serial.println(lasttempState); ----------- Min T: 24

if (lasttempState > tempState); --------- u trecem krugu ocitavanja - tepmeratura je porasla na 26
lasttempState = tempState;-------------- lasttempState ostaje 24 posto je 24 manje od 26 i uslov nije ispunjen
Serial.println("Min T: ");------------------ ispisuje na displeju:
Serial.println(lasttempState);------------ Min T: 24

if (lasttempState > tempState);-------- u cetvrti krugu ocitavanja - temperatura je pala i sada je 22 (24 > 22)
lasttempState = tempState;------------- uslov je ispunjen i lasttempState postaje 22
Serial.println("Min T: ");----------------- ispisuje na displeju:
Serial.println(lasttempState); ----------- Min T: 22
ITD....

Ma koliko ovo meni delovalo logicno i ok "Min T" je uvek jednaka trenutnoj i ja ne znam da resim ovo...
Evo i koda:

Code:

int sensePin = A0;  //This is the Arduino Pin that will read the sensor output
int sensorInput;    //The variable we will use to store the sensor input
double temp;        //The variable we will use to store temperature in degrees.

int lasttempState =0;
int tempState = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  
  sensorInput = analogRead(A0);    //read the analog sensor and store it
  temp = (double)sensorInput / 1024;       //find percentage of input reading
  temp = temp * 5;                 //multiply by 5V to get voltage
  temp = temp - 0.5;               //Subtract the offset
  temp = temp * 100;               //Convert to degrees

  Serial.print("Current Temperature: ");
  Serial.println(temp);

tempState = temp;

if (lasttempState > tempState);
 lasttempState = tempState; 
Serial.print("Min T: "); 
Serial.println(lasttempState);
  delay(1000);
}


Unapred se zahvaljujem svima na pomoci
[ djoka_l @ 03.12.2020. 14:03 ] @
Code:
if (lasttempState > tempState);
 lasttempState = tempState; 


Iza if si stavio ;
efektivno, rekao si "ako je lasttempState > tempState onda ništa"

treba
Code:
if (lasttempState > tempState)
 lasttempState = tempState; 
[ GolubBgd @ 03.12.2020. 14:28 ] @
Ali bukvalno tri dana zbog ; ali to je cena neznanja.... Radi sada kako sam zamislio, puno ti hvala!
[ djoka_l @ 03.12.2020. 15:15 ] @
Obrati pažnju da u C jeziku znak ";" ima istu funkciju kao tačka u prirodnom jeziku, odnosno on završava "misao".
Isto kao što se posle IF konstrukcije očekuje komanda ili blok, tako se i posle while, for i slično očekuje komanda, a ne kraj misli.
U nekim drugim jezicima čak bi se i podigla sintaksna greška kod suvišnog znaka ";"

Na primer, u PL/SQL sledeća konstrukcija bi javila grešku:
BEGIN;
END;

U tom jeziku, ako se baš želi da se stavi "prazna" komanda, mora to da se učini eksplicitno:
BEGIN
NULL;
END;

Drugim rečima, shvati da je u C "if" nešto kao početak bloka ({), a ; kao kraj bloka (}), pa je if(uslov); ekvivalentno sa {}, tj predstavlja "nemoj ništa da uradiš"
[ ZAS011 @ 03.12.2020. 17:29 ] @
Da bi ti bilo lakše, a možda i logičnije koristi vitičaste zagrade makar posle if imaš samo jednu funkciju (ko zna možda ti padne na pamet da dopišeš još koju):

Code:
if (lasttempState > tempState)
{
  lasttempState = tempState; 
}
[ Ivan 89 @ 09.01.2021. 19:12 ] @
Pozdrav svima, zapeo sam oko jednog arduino koda i treba mi pomoć da ga rešim.
Hteo bih da povežem sim800 i čitac sd kartice na arduino uno pa sam zapeo.
Moja zamisao je bila da palim i gasim relej putem sms poruka a sim kartica da belezi vreme kad se relej uključio ili isključio.
Medjutim kad učitam kod u arduino javi mi se problem to jest blokira mi sim800 i čitač sd kartice.
A kad kod razdvojim na dva dela i učitam jedan ili drugi deo tad i sim800 i čitač rade normalno.
Na kodu sam samo sad trenutno odvojio snimanje na sd kartici da beleži svaki minut datum i vreme samo radi probe radi lakšeg razdvajanja koda.

Kod sam koristio ovaj:
Code:
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3,2); 

RTC_DS1307 RTC;
File dataFile;
DateTime now;

const int chipSelect = 10; 

char incomingByte; 
String inputString;

int relay = 9; 

void setup() 
{
      pinMode(relay, OUTPUT);
      digitalWrite(relay, LOW); 
      Serial.begin(9600);
      mySerial.begin(9600); 

      Wire.begin();
      RTC.begin();
      if (! RTC.isrunning()) 
     {
      RTC.adjust(DateTime(__DATE__, __TIME__));
     }
      if (!SD.begin(chipSelect)) {
      return;
     }
      now = RTC.now();
      dataFile = SD.open("datalog.txt", FILE_WRITE);
      dataFile.println("  Vreme         Datum");
      dataFile.close();
      
     while(!mySerial.available()){
        mySerial.println("AT");
        delay(1000); 
        Serial.println("Connecting...");
        }
      Serial.println("Connected!");  
      mySerial.println("AT+CMGF=1");  
      delay(1000);  
      mySerial.println("AT+CNMI=1,2,0,0,0"); 
      delay(1000);
      mySerial.println("AT+CMGL=\"REC UNREAD\""); 
     }
     
void loop()
{  

  now = RTC.now();
      float sec = now.second();

  if(sec == 0){
           File dataFile = SD.open("datalog.txt", FILE_WRITE);
                dataFile.print(" ");
                dataFile.print(now.hour(),DEC);
                dataFile.print(":");
                dataFile.print(now.minute(),DEC);
                dataFile.print(":");
                dataFile.print(now.second(),DEC);
                dataFile.print("       ");
                dataFile.print(now.year(),DEC);
                dataFile.print('/');
                dataFile.print(now.month(),DEC);
                dataFile.print('/');
                dataFile.print(now.day(),DEC);
                dataFile.close();
                delay(1000);
        }       
  if(mySerial.available()){
      delay(100);

      while(mySerial.available()){
        incomingByte = mySerial.read();
        inputString += incomingByte; 
        }
        delay(10);      
        Serial.println(inputString);
        inputString.toUpperCase(); 

        //turn RELAY ON or OFF
        if (inputString.indexOf("ON") > -1){ 
          digitalWrite(relay, HIGH);
          }
         if (inputString.indexOf("OFF") > -1){     
          digitalWrite(relay, LOW);
          }          

        delay(50);

        if (inputString.indexOf("OK") == -1){     
        mySerial.println("AT+CMGDA=\"DEL ALL\"");

        delay(1000);}

        inputString = "";
  }


Kod verovatno ima grešaka koje nisam primetio.
[ ZAS011 @ 10.01.2021. 07:57 ] @
Zašto ti je promenljiva sec tipa float?
Pošto ona može da ima vrednost između 0 i 59, trebala bi da ti bude tipa byte.
[ Ivan 89 @ 10.01.2021. 17:45 ] @
To mi je promaklo kao i datafile.println pa da svaki put lepo piše u novi red a ne sve u jedan.
Ali problem nisam još rešio kao da su ta dva uredjaja u sukobu pa ili radi jedan ili drugi neće oba.
[ beogard @ 22.03.2021. 20:56 ] @
Poštovani prijatelji, kako da na dvorednom displayu napisem dve vrste podataka u istom redu.
Na primer imam varijablu:
String mojString = "Senzor cita: ";
i varijablu:
int vrednost;
Kada napisem:
lcd.print(vrednost);
on ispise vrednosti sa senzora u tom zadatom redu.
Kada napisem:
lcd.print(mojString);
on ispise; Senzor cita: u tom redu.
Ali kako da postavim da prvo ispise ovo Senzor cita: pa onda vrednost sa senzora?
Ja sam postavio ovako i neće da mi prikaže na displayu u istom redu i tekst i vrednost sa senzora a, ima mesta jer je 16 karaktera:

Serial.println(mojString),(vrednost); i NEĆE, prikazuje samo ovaj tekst prve varijable, odnosno u prvoj zagradi.
Probao sam i ovako: Serial.println(mojString, vrednost); Nisam uspeo! :(
Molim za pomoć?
[ djoka_l @ 22.03.2021. 21:03 ] @
https://www.arduino.cc/referen...tring/operators/concatenation/
https://www.arduino.cc/referen...ables/data-types/stringobject/

Serial.println(mojString + String(vrednost))

Uzgred, nikada nisam radio sa Arduinom, ovo je samo obično programiranje...
[ ZAS011 @ 22.03.2021. 22:49 ] @
Code:
Serial.print (mojString);
Sreial.println (vrednost, DEC);
[ beogard @ 23.03.2021. 10:07 ] @
#djoka_l
Dovoljno je bilo napisati ovako, * lcd.print(mojString+(vrednost)); * ne znam zašto ovo + string?* Serial.println(mojString + String(vrednost)) * ali, dobro. Proradilo je.
#ZAS011
Serial.print (mojString);
Serial.println (vrednost, DEC); -Šta znači ovo DEC? radi i ovo.
Hvala Svima!
[ djoka_l @ 23.03.2021. 10:25 ] @
Evo objasniću ti obe nedoumice:

mojString+(vrednost) i mojString + String(vrednost) :

Operacija sabiranja, odnosno operator "+" je u programskom jeziku C++ "preopterećen" (operator overloading). To znači da se isti operator koristi za "sabiranje" različitih tipova podataka.
Kada se napiše 1+2, rezultat je 3. Kada se napiše "1"+"2", rezultat je string "12"
Time što sam napisao String(vrednost) uradio sam EKSPLICITNU konverziju u tip String.
Na primer, recimo da je mojString dobio vrednost "1", a da je vrednost varijable vrednost=10.
Tada nije jasna naredba "1" + 10. Da li string jedan treba pretvoriti u broj jedan i dobiti rezultat 11, ili vrednost 10 pretvoriti u string "10" i dobiti rezultat "110".
Da bismo bili sigurni, UVEK je poželjno staviti EKSPLICITNU konverziju u željeni tip, a ne da kompajler pretpostavlja šta je programer želeo da kaže.

Serial.println (vrednost, DEC):

Parametar DEC kaže da se želi prikaz varijable vrednost u dekadnom brojnom sistemu. Recimo da je vrednost=10
tada bi prikaz komande Serial.println (vrednost, HEX) bio A (broj 10 u heksadekadnom brojnom sistemu), Serial.println (vrednost, DEC) bi dalo 10, a Serial.println (vrednost, BIN) bi dalo 1010 (broj 10 u binarnom brojnom sistemu).

Opet je stvar sa EKSPLICITNOM konverzijom. Binarni zapis broja 10 treba prikazati kao string, ali u kojoj brojnoj osnovi?
Možda će tekuća verzija kompajlera to shvatiti kao DEC, ali će sledeća verzija možda promeniti ponašanje na HEX.
Zato ne treba ostavljati neduomicu kompajleru.
[ Branimir Maksimovic @ 23.03.2021. 10:33 ] @
string + const char* ima overloadovano.
[ ZAS011 @ 23.03.2021. 11:22 ] @
Citat:
beogard:
#djoka_l
Dovoljno je bilo napisati ovako, * lcd.print(mojString+(vrednost)); * ne znam zašto ovo + string?* Serial.println(mojString + String(vrednost)) * ali, dobro. Proradilo je.
#ZAS011
Serial.print (mojString);
Serial.println (vrednost, DEC); -Šta znači ovo DEC? radi i ovo.
Hvala Svima!

Arduino IDE: Help/Reference
Tu sve možeš da nađeš i sve lepo piše. Tu ćeš saznati i šta znači to DEC.