Close

Hodinový displej TM1637

Úvodní stránka Fórum Vaše projekty Arduino Hodinový displej TM1637

  • Toto téma obsahuje celkem 7 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 7 roky a 8 měsíci.
Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (celkem z 8)
  • Autor
    Příspěvky
  • #10277
    Oldast
    Účastník

    Zdravím a prosím o radu.Ve svých 58 letech mě zaujalo Arduino a snažím se něco naučit.Tak jsem narazil na displej TM1637 a přidal čidlo DALLAS a mám otázku proč mi nejdou zobrazit mínusové teploty a nemůžu zaboha dostat do Vypis[3] desetinu jednotky.Posílám kód a děkuji za radu.

    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Arduino.h>
    #include <TM1637Display.h>

    #define CLK 2
    #define DIO 3
    TM1637Display displej(CLK,DIO);

    const int pinCidlaDS = 4; // nastavení čísla vstupního pinu
    OneWire oneWireDS(pinCidlaDS);
    DallasTemperature senzoryDS(&oneWireDS);
    byte teplota=0;
    int rele=8;

    void setup() {
    pinMode(rele,OUTPUT);
    Serial.begin(9600);

    senzoryDS.begin();
    {
    displej.setBrightness(8);//jas displeje 8-15
    }

    }
    void loop() {

    senzoryDS.requestTemperatures();
    teplota=senzoryDS.getTempCByIndex(0);

    Serial.print(„Teplota cidla DS18B20: „);
    Serial.print(senzoryDS.getTempCByIndex(0));
    Serial.println(“ stupnu Celsia“);
    // pauza pro přehlednější výpis
    delay(1000);
    if(teplota>25){
    digitalWrite(rele,LOW);//sepne rele
    }
    else {
    digitalWrite(rele,HIGH);//rozepne rele
    }
    {
    uint8_t vypis[] = { 0, 0, 0, 0 };//nastavení displeje na zobrazení teploty

    vypis[0]=displej.encodeDigit((teplota/10)/10);//teplota stovky
    vypis[1]=displej.encodeDigit((teplota/10)%10);//teplota desítky
    vypis[2]=displej.encodeDigit((teplota%10)%10);//teplota jednotky
    vypis[3]=displej.encodeDigit((teplota%10)-100);//?teplota desetina jednotky
    if(teplota<1){
    vypis[0]=(SEG_G);
    }
    displej.setSegments(vypis);
    }}

    #10279
    Vojtěch Vosáhlo
    Účastník

    Dobrý večer,
    problém bude nejspíše v tom že máte proměnou teplota inicializovanou jako byte. Vámi použitá knihovna s byty asi neumí pracovat. Zkuste jí změnit na float místo byte. Možná my to nedocvaklo ale nejde vám to vypsat na displeji nebo sériový port a nebo nefunguje ani jedno?

    #10284
    Oldast
    Účastník

    Dobrý večer
    na seriovém portu to funguje normálně tak jak má,ale displej ukazuje jen hodnoty od 0 nahoru.A zkusím změnit proměnou.Dík.

    #10332
    posjirka
    Účastník

    protoze display ukazuje pouze cisla jako jednotky tudiz neumi zobrazit desetina mista. dokonce ani nema jak protoze destinna tecka tam tusim neni pouze dvojtecka. je tu varianta zobrazit 10 nasobek teploty a tim bude videt i jedno des. misto. zobrazovat ale des. mista u cidla s presnost 1 st.c je holy nesmysl ktery delaji i zkusenejsi programstori (bez urazky). minus tam tusim jde zobrazit jako znak. ja to resil tak ze zprava mam „C“ pa jednotky desitkya posledni stovky nebo minus. stejne cidla ds18xxx umi min -55st.

    #10335
    Oldast
    Účastník

    Zdravím a děkuji za vysvětlení,po klesnutí teploty pod 0st.mi zobrazí mínus,ale na displeji jsou nuly nebo F,C a nevím proč mi nezobrazuje teplotu(čísla),když čidlo ds18xxx by mělo ukazovat až -55st.Na serivém portu ukazuje i mínusové teploty a rele spíná tak jak má ale na displeji nic.nevím kde dělám chybu?

    #10349
    posjirka
    Účastník

    to je vcelku jasné. bavíme se o proměnné typu byte která nabývá hodnot 0-255.
    Když dělíš -5 st. c tak ti vyjde 255-5 = 250 což je v hex. kodovani rovno „FA“.
    zkus toto:

    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Arduino.h>
    #include <TM1637Display.h>
    
    #define CLK 2
    #define DIO 3
    TM1637Display displej(CLK,DIO);
    
    const int pinCidlaDS = 4; // nastavení čísla vstupního pinu
    OneWire oneWireDS(pinCidlaDS);
    DallasTemperature senzoryDS(&oneWireDS);
    byte teplota=0;
    int rele=8;
    
    void setup() {
      pinMode(rele,OUTPUT);
      Serial.begin(9600);
      senzoryDS.begin();
      displej.setBrightness(8);//jas displeje 8-15
    }
    void loop() {
      senzoryDS.requestTemperatures();
      teplota=senzoryDS.getTempCByIndex(0);
      Serial.print("Teplota cidla DS18B20: ");
      Serial.print(senzoryDS.getTempCByIndex(0));
      Serial.println(" stupnu Celsia");
      // pauza pro přehlednější výpis
      delay(1000);
      if(teplota>25){
        digitalWrite(rele,LOW);//sepne rele
      } else {
        digitalWrite(rele,HIGH);//rozepne rele
      }
      uint8_t vypis[] = { 0, 0, 0, 0 };//nastavení displeje na zobrazení teploty
      if(teplota<1){
        vypis[0]=(SEG_G);
      }
      teplota = abs(teplota); // prepocet na absolutni hodnotu 
      vypis[1]=displej.encodeDigit((teplota/10)/10);//teplota stovky
      vypis[2]=displej.encodeDigit((teplota/10)%10);//teplota desítky
      vypis[3]=displej.encodeDigit((teplota%10)%10);//teplota jednotky
      displej.setSegments(vypis);
    }

    jinak pro vkladani kodu používej párové značky CODE. Je to to tlačítko v horni části odpovědi s nápisem CODE. jinak se ti špatně vloží text a není pak čitelný

    #10358
    Oldast
    Účastník

    Displej začal fungovat,ale zobrazil číslo 255 a při minusových teplotách odečítal 255-teplotu čídla(-1=254).Tak jsem se podíval do příručky a změnil byte na int a už to jede tak jak má.Díky za vysvětlení a jdu pokračovat!

    #10361
    posjirka
    Účastník

    rád jsem pomohl 🙂

Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (celkem z 8)
  • Pro reakci na toto téma se musíte přihlásit.