Pomoc s EEPROM

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Pomoc s EEPROM

Příspěvek od petan » 21 srp 2018, 19:16

Nahoře to je napsáno.
Vytvoř si sekundovou smyčku (viz můj příspěvek výše - delay) a do té vlož tento kód:

Kód: Vybrat vše

if(min % 5 == 0 && sec==0){
//toto se provede jednou za 5 minut, vždy nultou sekundu
}
To co je v podmínce, to se provede jednou za 5 minut. Je úplně zbytečný znovu počítat čas někde bokem. Stačí to pomocí této podmínky synchronizovat s hodinami. Pomocí takových podmínek si můžeš vytvořit třeba, že se ti nějaká část kódu pustí jednou za půl dne, každou hodinu, každou sudou minutu apod, jednou za týden, prvního v měsíci, ... a tak dále.

milda
Příspěvky: 8
Registrován: 16 kvě 2018, 20:17
Reputation: 0

Re: Pomoc s EEPROM

Příspěvek od milda » 22 srp 2018, 19:43

Trošku jsem si upravil zadání projektu a ze zápisu každých 5 minut jsem udělal zápis každé 3 minuty a taky jsem poměnil čas ukládání kvůli objemu dat z hodnot za poslední den/týden/měsíc na 15/30 min a pak jsem přidal průměrnou hodnotu za oba časy.

Kód: Vybrat vše

#include <DS3231.h>
DS3231  rtc(SDA, SCL);                // Inicializace portů

#include "DHT.h"
#define DHTPIN 2                               // PIN
#define DHTTYPE DHT22                          // DHTtyp
DHT dht(DHTPIN, DHTTYPE); 

      
#include <config.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

// *****************************************************************************************************

const int okamzita = 4;   
int buttonOkamzita =0;

const int ctvrt = 5;  
int buttonCtvrt =0;

const int pul = 6;   
int buttonPul =0;

const int prumctvrt = 8;   
int buttonPrumctvrt =0;

const int prumpul = 9;   
int buttonPrumpul =0;

int max15min[5]; // musím uložit do do EEPROM --> nevím jak
int min15min[5]; 
int max30min[10];
int min30min[10];

int mode = 0;

unsigned long lastTime1; 
unsigned long presentTime;  

void setup() {
  Serial.begin(9600);                          // Rychlost kominukace 
  dht.begin();
  
  lcd.begin(); //16 by 2 character display

  rtc.begin();                              // Nastavení  dnu, času, data
  rtc.setDOW(MONDAY);           // Den 
  rtc.setTime(17, 39, 00);     // Čas 12:00:00 (24h)
  rtc.setDate(14, 10,2018);   // Datum den/měsíc/rok

  pinMode(ctvrt, INPUT);
  pinMode(pul, INPUT);

 lastTime1 = millis(); //ulož čas provedení podprogramu 1 

}

void loop() {


  float h = dht.readHumidity();                // Čtení Vlhkosti
  float t = dht.readTemperature();             // Čtení teploty

  if(digitalRead(ctvrt)) mode = 0;
  if(digitalRead(pul)) mode = 1;
  if(digitalRead(okamzita)) mode = 2;
  if(digitalRead(prumctvrt)) mode = 3;
  if(digitalRead(prumpul)) mode = 4;

 presentTime = millis(); //uložení aktuálního času do proměnné
 if (presentTime - lastTime1 >= 180000) { 
  //pokud je čas od poslední změny větší, nebo roven 1000 ms, proveď příkazy 
  lastTime1 = presentTime; //ulož čas provedení podprogramu 1 
  Podprogram1(); //spusť funkci Podprogram1 
 } 
 
  switch (mode) {

  case 0:
    //aktuální teplota

    break;
  case 1:
    //15 minut čtení max a min hodnot z datového pole


    break;
  case 2:
    //30 minut čtení max a min hodnot z datového pole


    break;
  case 3:
    //prumer 15 minut


    break;
  case 4:
    //prumer 30 minut


    break;
}


}

void Podprogram1() { 
 // zápis naměřených hodnot a času do datových polí   
} 
Teď potřebuju už jenom abych ukládal buďto jednotlivé hodnoty na jednotlivé adresy do EEPROM a nebo abych uložil celé pole, nevím co z toho bude lepší. pak potřebuju jenom přečíst z toho pole (nebo porovnat ty hodnoty) a vypsat max/min hodnotu.
Do toho pod programu ještě potřebuju zadat automatické ukládání buďto do konkrétní adresy a nebo do toho pole s tím, že by se v poli přepisovaly "neplatná" data např u 15 minut mám 5 hodnot(každé 3 minutu jednu) že by se to z "0" zápisu posunulo na "1" a z "2" na "3" až po "4" a pak zase k číslu "0" zpět.

milda
Příspěvky: 8
Registrován: 16 kvě 2018, 20:17
Reputation: 0

Re: Pomoc s EEPROM

Příspěvek od milda » 22 srp 2018, 19:48

OMYLEM SE MĚ TO POSLALO 2X OBA PŘÍSPĚVKY JSOU ÚPLNĚ STEJNÉ


Trošku jsem si upravil zadání projektu a ze zápisu každých 5 minut jsem udělal zápis každé 3 minuty a taky jsem poměnil čas ukládání kvůli objemu dat z hodnot za poslední den/týden/měsíc na 15/30 min a pak jsem přidal průměrnou hodnotu za oba časy.

Kód: Vybrat vše

#include <DS3231.h>
DS3231  rtc(SDA, SCL);                // Inicializace portů

#include "DHT.h"
#define DHTPIN 2                               // PIN
#define DHTTYPE DHT22                          // DHTtyp
DHT dht(DHTPIN, DHTTYPE); 

      
#include <config.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

// *****************************************************************************************************

const int okamzita = 4;   
int buttonOkamzita =0;

const int ctvrt = 5;  
int buttonCtvrt =0;

const int pul = 6;   
int buttonPul =0;

const int prumctvrt = 8;   
int buttonPrumctvrt =0;

const int prumpul = 9;   
int buttonPrumpul =0;

int max15min[5]; // musím uložit do do EEPROM --> nevím jak
int min15min[5]; 
int max30min[10];
int min30min[10];

int mode = 0;

unsigned long lastTime1; 
unsigned long presentTime;  

void setup() {
  Serial.begin(9600);                          // Rychlost kominukace 
  dht.begin();
  
  lcd.begin(); //16 by 2 character display

  rtc.begin();                              // Nastavení  dnu, času, data
  rtc.setDOW(MONDAY);           // Den 
  rtc.setTime(17, 39, 00);     // Čas 12:00:00 (24h)
  rtc.setDate(14, 10,2018);   // Datum den/měsíc/rok

  pinMode(ctvrt, INPUT);
  pinMode(pul, INPUT);

 lastTime1 = millis(); //ulož čas provedení podprogramu 1 

}

void loop() {


  float h = dht.readHumidity();                // Čtení Vlhkosti
  float t = dht.readTemperature();             // Čtení teploty

  if(digitalRead(ctvrt)) mode = 0;
  if(digitalRead(pul)) mode = 1;
  if(digitalRead(okamzita)) mode = 2;
  if(digitalRead(prumctvrt)) mode = 3;
  if(digitalRead(prumpul)) mode = 4;

 presentTime = millis(); //uložení aktuálního času do proměnné
 if (presentTime - lastTime1 >= 180000) { 
  //pokud je čas od poslední změny větší, nebo roven 1000 ms, proveď příkazy 
  lastTime1 = presentTime; //ulož čas provedení podprogramu 1 
  Podprogram1(); //spusť funkci Podprogram1 
 } 
 
  switch (mode) {

  case 0:
    //aktuální teplota

    break;
  case 1:
    //15 minut čtení max a min hodnot z datového pole


    break;
  case 2:
    //30 minut čtení max a min hodnot z datového pole


    break;
  case 3:
    //prumer 15 minut


    break;
  case 4:
    //prumer 30 minut


    break;
}


}

void Podprogram1() { 
 // zápis naměřených hodnot a času do datových polí   
} 
Teď potřebuju už jenom abych ukládal buďto jednotlivé hodnoty na jednotlivé adresy do EEPROM a nebo abych uložil celé pole, nevím co z toho bude lepší. pak potřebuju jenom přečíst z toho pole (nebo porovnat ty hodnoty) a vypsat max/min hodnotu.
Do toho pod programu ještě potřebuju zadat automatické ukládání buďto do konkrétní adresy a nebo do toho pole s tím, že by se v poli přepisovaly "neplatná" data např u 15 minut mám 5 hodnot(každé 3 minutu jednu) že by se to z "0" zápisu posunulo na "1" a z "2" na "3" až po "4" a pak zase k číslu "0" zpět.

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Pomoc s EEPROM

Příspěvek od petan » 23 srp 2018, 15:52

No, to si zas tak o moc nepokročil.
Úplně ti tam chybí načítání času, zobrazování na displeji. V podstatě úplně vše.

Jediný co to dělá je, že to (přibližně) jednou za 18000 ms spustí funkci "Podporogram1". Místo třech minut to stáhni na jednu sekundu (1000 ms) a tam čti aktuální čas a datum a ulož si to do proměnných.

Vytvoř si nějakou funkci, která ti bude vykreslovat na displej aktuální teplotu a čas. Tím se dostaneš alespoň o krok dál. Budeš vidět, že ti to funguje, případně přepíná mezi módy.
Do té jednosekundové smyčky dej podmínku, která se bude spouštět PODLE AKTUÁLNÍHO ČASU jednou za ty tři minuty, viz dělitelnost třemi, třeba na wiki. Nebo si to dělej podle těch 18000 ms, ale nebude to přesný...

Ale že já tu pořád píšu, vždyť jsem to už psal předtím.

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: Pomoc s EEPROM

Příspěvek od rejze69 » 24 srp 2018, 10:50

Navíc tam máš nějaký zmatek v deklaraci těch pul prumpul atd. testuješ pak místo stavu tlačíka buttonpul hodnotu uloženou jako const int pul.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host