Arduino + SDkarta+LCD

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Používateľov profilový obrázok
andyn
Stály člen
Stály člen
Príspevky: 250
Dátum registrácie: 02 Máj 2007, 00:00
Bydlisko: Myjava
Vek: 41
Kontaktovať používateľa:

Arduino + SDkarta+LCD

Príspevok od používateľa andyn » 08 Aug 2016, 07:43

Nazdar chcalani chcem sa vás slušne opýtať či by ste mi niečo neporadili.Mám tu na stole Arduino Uno a hrám sa z SD kartou,RTC modulom,LCD displejom a 18B20 snímačom.Chcem si urobiť to aby mi na tú SD kartu zapisovalo teplotu napr. pol minútu ale aby mi aj zároveň na LCD-čku zobrazovalo aktuálny čas a teplotu.Dá sa to niako urobiť?tu dole je kód čo som urobil ale akosi mi to nechce fungovať tak ako si to ja predstavujem.Neviem kde robím chybu.ďakujem za rady

Kód: Vybrať všetko

#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <DS1307.h>
#include <SD.h>
#include <SPI.h>
#include <DallasTemperature.h>
#include <OneWire.h>

byte znak[8] = {0xa,0x4,0xe,0x10,0x10,0x11,0xe,0x0};// znak č pre slovo čas
LiquidCrystal_I2C lcd(0x20,20,4);// nastavenie lcd dipleja

#define ONE_WIRE_BUS 9// definicia pripojenia teplotného čidla
OneWire oneWire(ONE_WIRE_BUS);//
DallasTemperature sensors(&oneWire);//

char cas[9];  // pole znaků pro čas
 char datum[11];// připraví pole znaků pro datum
 
int rtc[7]; // vytvoří pole čísel do kterých se bude ukládat čas

const int chipSelect = 4;// CS pro četčku karet na pinu 4(pro Arduino UNO a Ethernet Shield)
 
void setup()
{    
lcd.init();// inicializuje displej
lcd.backlight(); // zapne podsvětleni
lcd.createChar(0,znak);// vytvorí znak č do premenej 0
lcd.setCursor(0,0);//nastaví kurzor na pozici 1 stlpec a 1 riadok
lcd.write(byte(0));//vypíše znak č
lcd.setCursor(1,0);//nastaví kurzor na pozici 2 stlpec a 1 riadok
lcd.print("as:");//vypíše text
lcd.setCursor(0,1); // nastaví kurzor na pozici 1 stlpec a 3 riadok
lcd.print("Teplota:"); // vypíše text

Serial.begin(9600);// nastaví seriovou komunakaci na 9600
Serial.print("Inicializace SD karty...");//vypís na seriový port
pinMode(4,OUTPUT);//
  if (!SD.begin(chipSelect)) {
    Serial.println("/nKarta nenalezena...");
    return;
  }
  Serial.println("/n Karta inicializovana...");
 sensors.begin();
}


void loop()
{ 
 sensors.requestTemperatures();
  
 RTC.get(rtc,true);  
 sprintf(datum,"%02d:%02d:%02d", rtc[4],rtc[5],rtc[6]);// zapíše do pole znaků datum hodnoty z rtc
 sprintf(cas,"%02d:%02d:%02d", rtc[2],rtc[1],rtc[0]); // zapíše do pole znaků cas hodnoty z rtc 
 
 
  
  zapisovanieTeplotySDKarta();//zapisovanie dát na SD kartu
  
  zobrazenieCasu();  // zobrazenie času na LCD
  
  zobrazenieTeploty();  // zobrazenie teploty na LCD
 }
 
 
 void zobrazenieCasu()  // zobrazení na LCD
{
lcd.setCursor(4,0); //první řádek
lcd.print(cas);      //vypíše čas
}
  
  
  
    
void zobrazenieTeploty()//
{
lcd.setCursor(8,1); //první řádek
lcd.print(sensors.getTempCByIndex(0)); //vypíše teplotu 
}





void zapisovanieTeplotySDKarta()///
{
  String dataString = ""; // inicializuje proměnou pro data
  dataString = datum; //
  dataString = dataString + ";"; // vhodný oddělovač
  dataString+= cas; // čas do proměné data
  dataString = dataString + ";"; // vhodný oddělovač
  dataString = dataString + String(sensors.getTempCByIndex(0));
 
    // otevře soubor data.csv
   File dataFile = SD.open("Adko.txt", FILE_WRITE);
 
  // když soubor existuje zapíše do něj
  if (dataFile) {
    // samotný zápis - zapíše a skočí na nový řádek
    dataFile.println(dataString);
    dataFile.close();
    Serial.print("Zapisuji do souboru data - ");
    Serial.println(dataString);
  }  
  // při chybě vypíše hlášku
  else {
    Serial.println("Chyba - nemohu otevřít soubor !!!");
  }
  
  
 
}
    

Ak tam dole pridám ešte aj delay tak mi to zapisuje tak ako si nadstavím čas.Ale zároveň sa zmení aj to zobrazovanie času a teploty na LCD.A to ja potrebujem niako oddeliť.Ale ako?
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1375
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Arduino + SDkarta+LCD

Príspevok od používateľa TomasNM » 08 Aug 2016, 08:27

Sprav to takto:

Kód: Vybrať všetko

unsigned long teraz,predtym1,predtym2;
unsigned long interval=30000; //30s

void loop()
{
  teraz=millis();
  if(teraz-predtym1>=1000) { predtym1=teraz;zobrazCas();zobrazTeplotu();} //kazdu sekundu zobraz na display
  if(teraz-predtym2>=interval) { predtym2=teraz;zapisData();} //kazdym intervalom zapis na SD
}
Ked pouzijes delay,tak ti to zabrzdi cely program na danu dobu,cize na tento ucel nevhodne;
0
Naposledy upravil/-a TomasNM v 08 Aug 2016, 10:29, upravené celkom 1 krát.

Používateľov profilový obrázok
budvar10
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1050
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Arduino + SDkarta+LCD

Príspevok od používateľa budvar10 » 08 Aug 2016, 08:41

Áno dá sa to "nejako". V prvom rade je potrebné si uvedomiť fakty. Aký je rýchly procesor a koľkokrát asi sa môže taká funkcia loop() vykonať behom jedinej sekundy? Potrebujem vypisovať na LCD toľkokrát za sekundu a bude to LCD vôbec stíhať?.....
Použitie delay v tomto prípade nie je najvhodnejšie riešenie. Ak by si tam dal test na čas, napr. existuje millis(), a robil to len keď to je potrebné, už by to bol pokrok. Problém je ale, že millis je odvodené od frekvencie procesora a nie je previazané s RTC: rýchlosť hodín, zmena sekundy. Ak by si to robil takouto cestou, testovať millis na inkrement 1000, výpis času na LCD by tiež nebol úplne dokonalý. Aby to nebolo postrehnuteľné, muselo by to byť menej ako 0,15s. RTC je ale schopné (predpokladám DS3231 alebo DS1307) generovať napr. 1Hz signál. Pripojiť toto na prerušenie a každú sekundu vypísať čas na LCD. Pridať nejaké počítadlo a keď napočíta do 30, zápis na SD.... Riešení je veľa. Len treba porozmýšľať a nejaké vybrať.

EDIT: Tomáš ma predbehol. :) Jeho riešenie má ale problém, ktorý spomínam a myslím, že delay na 1s to bude fungovať podobne.
0

Používateľov profilový obrázok
andyn
Stály člen
Stály člen
Príspevky: 250
Dátum registrácie: 02 Máj 2007, 00:00
Bydlisko: Myjava
Vek: 41
Kontaktovať používateľa:

Re: Arduino + SDkarta+LCD

Príspevok od používateľa andyn » 08 Aug 2016, 10:21

ďakujem za rady ale podľa toho Tomašovho návrhu mi to nefunguje.Stále si to zapisuje po 1 sekunde ako aj pred tým ako keby sa nič nezmenilo.Neviem prečo.Ja nie som moc programátorsky typ.Ja sa s tým len trochu hrám a chcem sa niečomu novému priučiť.
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1375
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Arduino + SDkarta+LCD

Príspevok od používateľa TomasNM » 08 Aug 2016, 10:23

Si si isty,ze si to opisal korektne?
Musis pouzit 2 nezavisle ulong hodnoty predtym1 a predtym2,ohranicenie blokov programu { } ? Si to skontroluj.
Ono to funguje,mam to tak spravene v dataloggeri,ktory je v stave konstrukcie.

Este tu je takato moznost:

Kód: Vybrať všetko

unsigned long teraz,predtym;
int cyklus=0;

void loop()
{
  teraz=millis();
  if(teraz-predtym>=1000) 
  {
    predtym=teraz;
    zobrazCas();zobrazTeplotu();//kazdu sekundu zobraz na display
    cyklus++;if(cyklus==30) { cyklus=0;zapisData();}//po 30 sekundach zapis
  } 
}
0
Naposledy upravil/-a TomasNM v 08 Aug 2016, 10:36, upravené celkom 1 krát.

Používateľov profilový obrázok
andyn
Stály člen
Stály člen
Príspevky: 250
Dátum registrácie: 02 Máj 2007, 00:00
Bydlisko: Myjava
Vek: 41
Kontaktovať používateľa:

Re: Arduino + SDkarta+LCD

Príspevok od používateľa andyn » 08 Aug 2016, 10:34

Ja som to presne skopíroval ako si to tu dal.skúsim ešte to čo si tu dal teraz.tú druhú možnosť. Vďaka za trpezlivosť.RTC mám stále pripojené.4i náhodou aj to nerobím chybu
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1375
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Arduino + SDkarta+LCD

Príspevok od používateľa TomasNM » 08 Aug 2016, 10:41

Hod sem ten nefunkcny kod,skusime to rozobrat a najst kde je chyba.
0

Používateľov profilový obrázok
andyn
Stály člen
Stály člen
Príspevky: 250
Dátum registrácie: 02 Máj 2007, 00:00
Bydlisko: Myjava
Vek: 41
Kontaktovať používateľa:

Re: Arduino + SDkarta+LCD

Príspevok od používateľa andyn » 08 Aug 2016, 11:25

tu je celý môj kód

Kód: Vybrať všetko

#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <DS1307.h>
#include <SD.h>
#include <SPI.h>
#include <DallasTemperature.h>
#include <OneWire.h>

byte znak[8] = {0xa,0x4,0xe,0x10,0x10,0x11,0xe,0x0};// znak č pre slovo čas
LiquidCrystal_I2C lcd(0x20,20,4);// nastavenie lcd dipleja

#define ONE_WIRE_BUS 9// definicia pripojenia teplotného čidla
OneWire oneWire(ONE_WIRE_BUS);//
DallasTemperature sensors(&oneWire);//



char cas[9];  // pole znaků pro čas
char datum[11];// připraví pole znaků pro datum
 
int rtc[7]; // vytvoří pole čísel do kterých se bude ukládat čas

const int chipSelect = 4;// CS pro četčku karet na pinu 4(pro Arduino UNO a Ethernet Shield)
 
 unsigned long teraz,predtym;
int cyklus=0;
 
void setup()
{    
lcd.init();// inicializuje displej
lcd.backlight(); // zapne podsvětleni
lcd.createChar(0,znak);// vytvorí znak č do premenej 0
lcd.setCursor(0,0);//nastaví kurzor na pozici 1 stlpec a 1 riadok
lcd.write(byte(0));//vypíše znak č
lcd.setCursor(1,0);//nastaví kurzor na pozici 2 stlpec a 1 riadok
lcd.print("as:");//vypíše text
lcd.setCursor(0,1); // nastaví kurzor na pozici 1 stlpec a 3 riadok
lcd.print("Teplota:"); // vypíše text

Serial.begin(9600);// nastaví seriovou komunakaci na 9600
Serial.print("Inicializace SD karty...");//vypís na seriový port
pinMode(4,OUTPUT);//
  if (!SD.begin(chipSelect)) {
    Serial.println("/nKarta nenalezena...");
    return;
  }
  Serial.println("/n Karta inicializovana...");
 sensors.begin();
}


void loop()
{ 
 teraz=millis();
  if(teraz-predtym>=1000)
  {
    predtym=teraz;
    zobrazenieCasu();zobrazenieTeploty();//kazdu sekundu zobraz na display
    cyklus++;if(cyklus==10) { cyklus=0;zapisData();}//po 10 sekundach zapis
  } 
  
 sensors.requestTemperatures();
  
 RTC.get(rtc,true);  
 sprintf(datum,"%02d:%02d:%02d", rtc[4],rtc[5],rtc[6]);// zapíše do pole znaků datum hodnoty z rtc
 sprintf(cas,"%02d:%02d:%02d", rtc[2],rtc[1],rtc[0]); // zapíše do pole znaků cas hodnoty z rtc 
 
 {
  
}
 
  
  zapisData();//zapisovanie dát na SD kartu
  
  zobrazenieCasu();  // zobrazenie času na LCD
  
  zobrazenieTeploty();  // zobrazenie teploty na LCD
 }
 
 
 void zobrazenieCasu()  // zobrazení na LCD
{
lcd.setCursor(4,0); //první řádek
lcd.print(cas);      //vypíše čas
}
  
  
  
    
void zobrazenieTeploty()//
{
lcd.setCursor(8,1); //první řádek
lcd.print(sensors.getTempCByIndex(0)); //vypíše teplotu 
}





void zapisData()///
{
  String dataString = ""; // inicializuje proměnou pro data
  dataString = datum; //
  dataString = dataString + ";"; // vhodný oddělovač
  dataString+= cas; // čas do proměné data
  dataString = dataString + ";"; // vhodný oddělovač
  dataString = dataString + String(sensors.getTempCByIndex(0));
 
    // otevře soubor data.csv
   File dataFile = SD.open("Adko.txt", FILE_WRITE);
 
  // když soubor existuje zapíše do něj
  if (dataFile) {
    // samotný zápis - zapíše a skočí na nový řádek
    dataFile.println(dataString);
    dataFile.close();
    Serial.print("Zapisuji do souboru data - ");
    Serial.println(dataString);
  }  
  // při chybě vypíše hlášku
  else {
    Serial.println("Chyba - nemohu otevřít soubor !!!");
  }
  
  
 
}
    
len som to zmenila aby to nezapisovalo po 30 ale po desiatich.
0

TomasNM
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1375
Dátum registrácie: 22 Jan 2012, 19:24
Bydlisko: Nové Mesto nad Váhom
Vek: 43

Re: Arduino + SDkarta+LCD

Príspevok od používateľa TomasNM » 08 Aug 2016, 11:34

Tieto veci v loop-e su akosi zbytocne a hlavne kontraproduktivne,pretoze sa vykonavaju kazdym cyklom bezodkladne:
- zbytocne su tam prazdne {},budiz,ale akurat to myli
- tie 3 prikazy na konci

{
}
zapisData();//zapisovanie dát na SD kartu
zobrazenieCasu(); // zobrazenie času na LCD
zobrazenieTeploty(); // zobrazenie teploty na LCD

Dalsia vec,je zbytocne zatazovat procesor,RTC a snimanie teploty neustalou kontrolou a formatovanim,ked to staci raz za sekundu.

Upraveny loop:

Kód: Vybrať všetko

    void loop()
    {
    teraz=millis();
      if(teraz-predtym>=1000)
      {
        predtym=teraz;
        zobrazenieCasu();zobrazenieTeploty();//kazdu sekundu zobraz na display
        
        sensors.requestTemperatures();
        RTC.get(rtc,true); 
        sprintf(datum,"%02d:%02d:%02d", rtc[4],rtc[5],rtc[6]);// zapíše do pole znaků datum hodnoty z rtc
        sprintf(cas,"%02d:%02d:%02d", rtc[2],rtc[1],rtc[0]); // zapíše do pole znaků cas hodnoty z rtc

        cyklus++;if(cyklus==10) { cyklus=0;zapisData();}//po 10 sekundach zapis
      }
    }
0

Používateľov profilový obrázok
andyn
Stály člen
Stály člen
Príspevky: 250
Dátum registrácie: 02 Máj 2007, 00:00
Bydlisko: Myjava
Vek: 41
Kontaktovať používateľa:

Re: Arduino + SDkarta+LCD

Príspevok od používateľa andyn » 08 Aug 2016, 12:36

aha tak to som nevedel že to tam netreba.jasne tie zátvorky sú tam úplne zbytočne to som si až teraz všimol.ďakujem veľmi pekne za rady aspoň som sa poučil čo tam je treba a čo nie.Už mi to funguje tak ako ja chcem.Ešte raz ďakujem veľmi pekne.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok