Sbírání dat

GreatPsycho
Příspěvky: 66
Registrován: 03 bře 2017, 03:21

Sbírání dat

Příspěvek od GreatPsycho »

Ahoj, udělal jsem si tento menší projekt běžící na arduinu mega, kde vypisuji teplotu a vlhkost z dht11 modulu a čas a datum z ds1302 na display keypad shieldu. Nyní bych ale rád připojil na piny 42,44,46,48,50,52 microsd card modul a zapisoval do souboru jednou za 5 minut datum,čas,teplotu a vlhkost. Problém je,že teď nevím, jak se vyhýbat prodlevě pro displej, aby se displej dál regeneroval jednou za vteřinu.

Kód: Vybrat vše

#include <SD.h>
#include <SPI.h>
#include <dht.h>
#include <DS1302.h>
#include <Wire.h>
DS1302 rtc(29, 31, 33);
#define DS1302_GND_PIN 35
#define DS1302_VCC_PIN 37
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
dht DHT;
#define DHT11_PIN 49
int pinCS = 53;

byte tmpr[8] = {
  B00100,
  B01010,
  B01010,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};
byte hmdt[8] = {
  B00100,
  B00100,
  B01010,
  B01010,
  B10001,
  B10001,
  B10001,
  B01110,
};

void setup(){
  lcd.createChar(0, tmpr);
  lcd.createChar(1, hmdt);
 
  digitalWrite(DS1302_GND_PIN, LOW);
  pinMode(DS1302_GND_PIN, OUTPUT);

  digitalWrite(DS1302_VCC_PIN, HIGH);
  pinMode(DS1302_VCC_PIN, OUTPUT);
   rtc.halt(false);
  rtc.writeProtect(false);
  
//rtc.setDOW(MONDAY);
//rtc.setTime(8, 48, 0);
//rtc.setDate(13, 3, 2017);
  
  lcd.begin(16, 2);
}

void loop()
{
  int chk = DHT.read11(DHT11_PIN);
  lcd.setCursor(0, 0);
  lcd.print(rtc.getTimeStr());
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDateStr());
  lcd.setCursor(10,0);
  lcd.write(byte(0)); 
  lcd.print(DHT.temperature);
  lcd.print("C  ");
  lcd.setCursor(10,1); 
  lcd.write(byte(1));
  lcd.print(DHT.humidity);
  delay(1000);
  lcd.clear();
}
Edit: používám klasické SD.h a SPI.h knihovny.

Edit2: btw nemůže mi ty vteřiny zasekávat příkaz rtc.halt(false)?
GreatPsycho
Příspěvky: 66
Registrován: 03 bře 2017, 03:21

Re: Sbírání dat

Příspěvek od GreatPsycho »

Ještě mě napadlo, zda by to nešlo řešit příkazem while a sledovat elapsedmillis.Ale s tím moc zkušenosti nemám, maximálně jsem zkoušel je vypisovat na displej. :(
hubacekp
Příspěvky: 259
Registrován: 24 úno 2013, 13:40

Re: Sbírání dat

Příspěvek od hubacekp »

Ahoj,
jen pozn:
- u DHT nemá smysl číst častěji něž 1 sec, protože senzoru trvá 700ms vygenerovat hodnoty
- co děláš s hodnotou chk?

píši ideu jak rozsekat tvůj kód na samostatné části, se kterými si pak můžeš dělat co chceš:

Kód: Vybrat vše

int chk = 0;
float lastDHT  = 0;
float lastLCD  = 0;
float lastSD  = 0;

void loop()
{
 readDHT();
 setLCD();
 writeSD();
}

void readDHT()
{
 if( millis() - lastDHT > 1000 ){
  chk = DHT.read11(DHT11_PIN);
  lastDHT = millis();
 }
}

void setLCD()
{
 if( millis() - lastLCD > 1000 ){
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(rtc.getTimeStr());
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDateStr());
  lcd.setCursor(10,0);
  lcd.write(byte(0)); 
  lcd.print(DHT.temperature);
  lcd.print("C  ");
  lcd.setCursor(10,1); 
  lcd.write(byte(1));
  lcd.print(DHT.humidity);
  lastLCD = millis();
 }
}


void writeSD()
{
 if( millis() - lastSD > 300000 ){

  // tady nějaký ten zápis na SD ?

  lastSD = millis();
 }
}
GreatPsycho
Příspěvky: 66
Registrován: 03 bře 2017, 03:21

Re: Sbírání dat

Příspěvek od GreatPsycho »

Super, to vypadá parádně, vyzkouším a dám hned vědět. Omlouvám, je mi jasný, že to je docela primitivní, ale arduina mám asi 2 měsíce cca, tak jsem ještě lamička. :D Každopádně tohle hodně pomůže do budoucna. Takový kód vidím poprvý, ale pomůže mi vypořádat se právě s těma prodlevama.

EDIT: Kód hotov, obvod zapojen, uvidíme za pár minut, jak bude vypadat soubor, každopádně díky, zatím vše šlape jak má. :D A ještě jednou se omlouvám za lamí dotaz. :roll: :lol:
GreatPsycho
Příspěvky: 66
Registrován: 03 bře 2017, 03:21

Re: Sbírání dat

Příspěvek od GreatPsycho »

Nádhera, funguje naprosto parádně, vzorně zapisuje, vzorně obnovuje displej. Moc díky. :)
GreatPsycho
Příspěvky: 66
Registrován: 03 bře 2017, 03:21

Re: Sbírání dat

Příspěvek od GreatPsycho »

Ještě otázečka, rozbíhá se mi modul rtc, za den až o půl hodiny. čím to může být? Slabá baterie?
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Sbírání dat

Příspěvek od DavidO »

Ále, žiješ prostě moc rychle a hodiny nestíhaj :D

Ten kód by měl být

Kód: Vybrat vše

unsigned long actualMillis = millis();
if(actualMillis - lastDHT > 1000) {
  něco co chceš udělat každých 1000 ms
  lastDHT = lastDHT+1000;   (anebo čitelněji lastDHT += 1000;)
}
protože tím tvým původním dvojím čtením, if( millis() -... a pak lastDHT=millis() přijdeš o ten kousek času, co trvalo to něco co chceš udělat. A kdyby mezi poslení obrátkou a teď uteklo víc času než vteřina, tak to těch několik kroků co měly mezitím být provedeny přeskočí (což ale může i nemusí vadit).
A ještě upozorňuju na použití správných datových typů, millis vrací unsigned long a ne float! (a na to čeká ten čert co nikdy nespí a s radostí bude zaokrouhlovat a ořezávat, až se začne dít něco zajímavýho)
To sice nesouvisí s rozbíhavýma hodinama, ale správně to není.

Tak a teď k těm hodinám: výrobce pro DS1302 deklaruje, že jeho přesnost závisí na přesnosti připojeného krystalu, spárování obvodu oscilátoru s výbrusem krystalu a na teplotě (se kterou ujíždí ten krystal). Půl hoďky denně jsou 2%, běžné součástky mají nějaké tolerance a jestli navíc na tom modulu s Dallasem není krystal ale rezonátor, tak je dílo dokonáno ... (nepíšeš o tom modulu nic konkrétního, takže jen hádám)

Mimochodem, ohledně časování tu před nedávnem proběhla ukrutná diskuse: viewtopic.php?f=13&t=663
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
GreatPsycho
Příspěvky: 66
Registrován: 03 bře 2017, 03:21

Re: Sbírání dat

Příspěvek od GreatPsycho »

Jde o tadytoho mrňouse: https://www.postavrobota.cz/RTC-modul-r ... e-d124.htm

Jinak mám ještě k dispozici tenhle modul, jestli bude nějaký znatellný rozdíl: https://www.postavrobota.cz/RTC-modul-r ... e-d123.htm

A moc to nechápu s těma vteřinama. O co tedy jde? Každou vteřin co překresluji displej, načítám data ze senzoru a každých 5 minut co zapisuji mi to sežere nějaké milisekundy času? Znamená to, že arduino ovlivňuje běh modulu, když je v zátěži? Nevím jestli tomu dobře rozumím...
aladin
Příspěvky: 337
Registrován: 12 kvě 2013, 06:43

Re: Sbírání dat a RTC

Příspěvek od aladin »

Mimochodem, ohledně časování tu před nedávnem proběhla ukrutná diskuse: viewtopic.php?f=13&t=663
Diskuse proběhla, ale odpověď, jak na přesné RTC, BFU nedostal :-(
Poradí někdo, kde získat nebo jak postavit hodiny přesného času aspoň jako jsou v PC nebo v levných digitálkách?
Kdysi jsem uvažoval i o obyč. digitálkách, u kterých bych zapnul pípnutí každou hodinu a synchronizoval bych RTC dalas.

Teď jsem ještě našel http://www.banggood.com/DS3231-AT24C32- ... 81066.html.
Je opravdu přesný? Jak moc?
fischertip.cz, Stavebnice.com, MerkurRobot.cz, KlubTechniku.cz
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Sbírání dat

Příspěvek od jova »

Já ty obvody běžně používám a přesnost je dost dobrá. Ve venkovním prostředí v řádu sekund za měsíc.
https://arduino.cz/tutorial-uzivani-hod ... -arduinem/
Odpovědět