Arduino schéma - arduino.sk

DS18B20 bez delay

Programovanie arduina
Príspevky: 33
Registrovaný: Pia 26. Jún 2015 21:17:41

DS18B20 bez delay

Poslaťod barado » Ned 28. Jún 2015 22:34:54

Ahojte.
Len nedavno som zacal s Arduinom UNO R3 a je zaujimave s nim pracovat.
Prosim o pomoc pri citani cidiel teplot z cidiel DS18B20, kde potrebujem nacitavanie cidiel bez zastavenia programu. Kod sa mi dostal do fazy, kde je vyrazne neprehladny a prosim znalych o pomoc pri jeho prepise na jednoduchsiu variantu.
Asi idealne by bolo pouzit tasker.h lenze to sa mi bije s kniznicou na zobrazenie menu (nie je tu cely kod "projektu")
Kod nizsie zabera dost vela miesta, co je neziaduce (uz dochadza miesto pre dalsie potrebne funkcie)
Tektiez mam zatial problem pochopit to nacitavanie teplot z examplu pre cidla teplot. Teda ako to tam nacitavaju podla toho indexu. Preto tam mam zatial natvrdo zadane adresy cidiel.
Dakujem za akukolvek pomoc
Kod:
Kód: Vybrať všetko
#include <OneWire.h>
#include <DallasTemperature.h>

unsigned long startTimeDallas=0;                   //zaciatok nacitavania, kontroluje sa s millis
unsigned int  intervalDallas=9000;                 //posli poziadavku na nacitanie teploty kazdych xx sekund
unsigned long startTimeDallasWait=0;               //zaciatok konverzie teploty v senzoroch
unsigned int  intervalDallasWait=800;              //citaj teplotu z cidiel az po uplynuti 800ms
unsigned long startTimeDallasWaitSensor=0;         //zaciatok konverzie teploty po 1 senzore koli kmitaniu serva
unsigned int  intervalDallasWaitSensor=200;        //citaj teplotu z cidiel az po uplynuti 200ms
byte sensorReads=1;                                //cislo nacitania senzora. Zatial 4 senzory.
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 11


OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);


// DeviceAddress vonkTeplota, primTeplota, spiaTeplota, sek1Teplota, sek2Teplota ;
uint8_t addrPrizTeplota[] = { 0x28, 0x30, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0x8E };
uint8_t addrPrimTeplota[] = { 0x28, 0x31, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0xB9 };
uint8_t addrSpiaTeplota[] = { 0x28, 0x32, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0xE0 };
uint8_t addrSek1Teplota[] = { 0x28, 0x33, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0xD7 };
uint8_t addrSek2Teplota[] = { 0x28, 0x34, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0x52 };

float prizTeplota, primTeplota, spiaTeplota, sek1Teplota, sek2Teplota;          // premenne pre ulozenie teplot z cidiel


// funkcia na precitanie teplot z cidiel DS18B20
float getTemp(DeviceAddress deviceAddress)
{
    float tempC = sensors.getTempC(deviceAddress);
    return tempC;
}

// funkcia na osetrenie casoveho nacitavania senzorov ako aj error hodnoty -127
void readTemp(void)
{
  if( (long)( millis() - startTimeDallas ) >= 0)
  {
    static float teplota;                                                //lokalna premenna na ulozenie prave nacitanej teploty
    static boolean requested_1, requested_2;                             //uz bol poslany request na nacitanie teploty
    if (!requested_1)                                                    //neposielaj request ak som uz poslal
    {                                           
      startTimeDallasWait = millis() + intervalDallasWait;               //ulozenie millis
      sensors.requestTemperatures();                                     //odosli request teplot zo senzorov DS18B20
      requested_1=true;                                                  //request odoslany
      Serial.println("Poziadavka poslana");                              //vypis na serial
    }
    if( (long)( millis() - startTimeDallasWait ) >= 0)                   //test na dosiahnutie casu citania
    {
      if (!requested_2)                                                  //cakaj prvych 800ms
      {
        startTimeDallasWaitSensor = millis() + intervalDallasWaitSensor; //kazdy senzor citam az po uplynuti 200ms
        requested_2=true;
      }
      if( (long)(millis() - startTimeDallasWaitSensor) >= 0)              //test na prejdenie 200ms
      switch (sensorReads)                                                //test na citanie senzorov
      {
        case 1:                                                           
          startTimeDallasWaitSensor = millis() + intervalDallasWaitSensor; //dalsi senzor citam az po uplynuti dalsich 200 ms
          teplota=getTemp(addrPrimTeplota);                                //nacitanie teploty
          if (teplota!=-127)                                               //test na spravnu hodnotu
          {
            primTeplota=teplota;
          }
          Serial.println("Senzor 1 precitany");                            //debug
          sensorReads++;                                                   //citaj dalsi senzor
          break;
        case 2:
          startTimeDallasWaitSensor = millis() + intervalDallasWaitSensor;
          teplota=getTemp(addrSpiaTeplota);
          if (teplota!=-127)
          {
            spiaTeplota=teplota;
          }
          Serial.println("Senzor 2 precitany");         
          sensorReads++;
          break;
        case 3:
          startTimeDallasWaitSensor = millis() + intervalDallasWaitSensor;
          teplota=getTemp(addrSek1Teplota);
          if (teplota!=-127)
          {
            sek1Teplota=teplota;
          }
          Serial.println("Senzor 3 precitany");         
          sensorReads++;
          break;
        case 4:
          startTimeDallasWaitSensor = millis() + intervalDallasWaitSensor;       
          teplota=getTemp(addrPrizTeplota);
          if (teplota!=-127) 
          {
            prizTeplota=teplota;
          }
          sensorReads=1;
          requested_2=false;
          requested_1=false;
          startTimeDallas = millis() + intervalDallas;  // do it again 1 second later
          Serial.println("Senzor 4 precitany");
          break;
      }
    }     
  }
  else
  {

  }
}



void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);                      /* start serial */

  // Start up the library
  sensors.begin();
 
  startTimeDallas = millis() + intervalDallas;                     // ulozenie startovacej pozicie casu + interval
  sensors.setResolution(addrPrizTeplota, TEMPERATURE_PRECISION);   //nastavenie rozlisenia teplot
  sensors.setResolution(addrPrimTeplota, TEMPERATURE_PRECISION);
  sensors.setResolution(addrSpiaTeplota, TEMPERATURE_PRECISION); 
  sensors.setResolution(addrSek1Teplota, TEMPERATURE_PRECISION);
  sensors.setResolution(addrSek2Teplota, TEMPERATURE_PRECISION);

  sensors.setWaitForConversion(false);                     //necakaj na konverziu teploty v cidle


}

void loop() {
  // put your main code here, to run repeatedly:

  readTemp();    //spust citanie teplot

}

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: DS18B20 bez delay

Poslaťod posjirka » Pon 29. Jún 2015 20:38:24

Muzes pocitat pocet smycek loop. 200 ms je na ds18b20 malo. Pokud pouzijes parazitni rezim potrebuje cca 750 ms. Index cidla je vlastne poradi v jakem ty cidla najde. Nejak dela ze je najde pokazde ve stejnem poradi. Pak si muzes priradit ktere cidlo je ktere a program si muze ulozit adresu cidla. Ja to resim tak se adresu si zjistim jinde napr. Na jinem arduinu a pomoci menu si ji vlozim do pameti. Je to zdlouhavejsi ale zase man vse pod kontrolou.

Príspevky: 33
Registrovaný: Pia 26. Jún 2015 21:17:41

Re: DS18B20 bez delay

Poslaťod barado » Pon 29. Jún 2015 21:48:13

posjirka píše:Muzes pocitat pocet smycek loop. 200 ms je na ds18b20 malo. Pokud pouzijes parazitni rezim potrebuje cca 750 ms. Index cidla je vlastne poradi v jakem ty cidla najde. Nejak dela ze je najde pokazde ve stejnem poradi. Pak si muzes priradit ktere cidlo je ktere a program si muze ulozit adresu cidla. Ja to resim tak se adresu si zjistim jinde napr. Na jinem arduinu a pomoci menu si ji vlozim do pameti. Je to zdlouhavejsi ale zase man vse pod kontrolou.


Parazitny rezim neuvazujem pouzit.
Ten kod funguje priblizne takto
cakam 9000ms
poslem request
cakam 800 ms // ale ma byt skor 550ms
cakam prvych 200 ms //co mi da 1000 ms od requestu resp 750 ms od requestu
citam prvy senzor
cakam druhych 200 ms
citam druhy senzor
cakam tretich 200 ms
citam treti senzor
cakam stvrtych 200 ms
citam stvrty senzor

Ked tak na to pozeram, tak zamer bol povodne posielat request kazdych cca 10 sekund, takze tych 9000 ms mierne upravim. Ale nie je to kriticke.
Mam otazocku. Je mozne citat tie senzory "naraz" vsetky hned po uplynuti tych 750 ms?
Mozes prosim trosku viac naznacit ako to myslis s tym pocitanim sluciek loop? Lebo skusil som to prepisat podla ratania sluciek a skoncil som na takmer totoznom kode. Tzn, ze by som mohol zvysovat kazdych povedzme 100 ms counter a v zodpovedajucom case cez switch robit citanie teplot. Lenze to chce opat osetrovat v kode...

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: DS18B20 bez delay

Poslaťod budvar10 » Uto 30. Jún 2015 7:55:13

Mam otazocku. Je mozne citat tie senzory "naraz" vsetky hned po uplynuti tych 750 ms?

Áno, je to možné (samozrejme nie celkom naraz ale postupne). Ak sa pošle všetkým senzorom príkaz na meranie, cca po 750ms (pri najväčšej presnosti) je možné prečítať postupne všetky senzory bez delayov. Hodnota sa už stejne nebude meniť.

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: DS18B20 bez delay

Poslaťod budvar10 » Uto 30. Jún 2015 8:00:24

posjirka píše: Index cidla je vlastne poradi v jakem ty cidla najde. Nejak dela ze je najde pokazde ve stejnem poradi.

Robí to tak, že postupne hľadá adresy senzorov na drôte bit po bite, ak nie je 0, skúsi 1, atď. Adresy sú fixné. Rovnakým postupom dôjde k rovnakému výsledku.

Príspevky: 33
Registrovaný: Pia 26. Jún 2015 21:17:41

Re: DS18B20 bez delay

Poslaťod barado » Uto 30. Jún 2015 8:32:05

budvar10 píše:
Mam otazocku. Je mozne citat tie senzory "naraz" vsetky hned po uplynuti tych 750 ms?

Áno, je to možné (samozrejme nie celkom naraz ale postupne). Ak sa pošle všetkým senzorom príkaz na meranie, cca po 750ms (pri najväčšej presnosti) je možné prečítať postupne všetky senzory bez delayov. Hodnota sa už stejne nebude meniť.

Vyborne, takze by som mohol ten case 1: az 4: vyhodit z kodu uplne a teoreticky test na spravnu hodnotu (tu upravim kod tak, aby test spravnej hodnoty bol funkciou) by mal stacit na to "postupne" nacitanie hodnot zo senzorov?

Obrázok užívateľa
Príspevky: 133
Registrovaný: Štv 06. Nov 2014 12:06:09

Re: DS18B20 bez delay

Poslaťod budvar10 » Uto 30. Jún 2015 9:06:53

Áno. Len doplním, že 1-Wire zariadenia sa dajú aktivovať všetky naraz, alebo len konkrétne. Je dobré si preštudovať datasheet, ak sa tomu človek chce viac venovať a zistiť všetky možnosti týchto zariadení.

Príspevky: 33
Registrovaný: Pia 26. Jún 2015 21:17:41

Re: DS18B20 bez delay

Poslaťod barado » Uto 30. Jún 2015 10:26:16

budvar10 píše:Áno. Len doplním, že 1-Wire zariadenia sa dajú aktivovať všetky naraz, alebo len konkrétne. Je dobré si preštudovať datasheet, ak sa tomu človek chce viac venovať a zistiť všetky možnosti týchto zariadení.

Aha jasnee. Kedze na 1-Wire mozu by navesane typovo a funkcne rozne zariadenia, aby nedoslo k nezelanemu chovaniu.

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: DS18B20 bez delay

Poslaťod posjirka » Uto 30. Jún 2015 20:32:43

hlavně si při tom pohlídej abys pokaždé načetl 4 čidla. jinak se ti můžou teploty pomíchat ....

Späť na Software