Close

Max6675

  • Toto téma obsahuje celkem 12 odpovědí. Do diskuze (4 diskutující) se naposledy zapojil uživatel Profilový obrázekrh a poslední změna proběhla před 2 roky, 1 měsícem.
Aktuálně je na stránce zobrazeno 13 příspěvků - 1. až 13. (celkem z 13)
  • Autor
    Příspěvky
  • #10436
    Profilový obrázekrehot79
    Účastník

    Prosím Vás O radu mám senzor modul max6675 na meranie teploty A potreboval by som pomôcť naprogramovať arduino aby my V závislosti od namerané teploty pohybovalo malé servo. Výpis na seriál linku my ide len to neviem Z toho max6675 previesť na pohyb serva. Už dva dni behám po nete A nič. Ďakujem za každú radu

    #10437
    BlindPBlindP
    Účastník

    Ahoj, funkce map dělá to co hledáš.. uhel_pro_servo = map(namerena_teplota, 10, 60, 0, 180);
    https://www.arduino.cc/en/Tutorial/Knob BP.

    #10438
    Profilový obrázekrehot79
    Účastník

    Ďakujem za reakciu na moju tému, túto možnosť som už pozeral aj ju chapem že si číta Z analógového vstupu hodnotu ktorú prepošle na servo, len môj problém je že mám max6675 ktorý nieje napojený na analog ale používa neaky thermocoupule.read() čo neviem ako poslať na servo. Ďakujem za odpoveď A ďalší nápad, idem skúšať

    #10439
    Profilový obrázekrehot79
    Účastník

    Tak som tu zas. Po tvojej rade som skúšal a vyzerá že to funguje.Ešte raz ďakujem a prikladám aj code ak by sa niekomu hodil ,ja s tým chcem ovládať polohu komínovej klapky na kotli na koľko max6675 je až do 1024 stupňov Celzia .Časom pribudne aj oled a wifi na sledovanie kotla na dialku napr. v mobile.

    
    
    //[email protected]
    
    //Nacitanie knihovni
    #include "max6675.h"
    #include <Servo.h>
    
    Servo myservo;
    
    //Definicia pin
    
    int thermoSO = 6;   
    int thermoCS = 5;   
    int thermoSCK = 4;  
    MAX6675 thermocouple(thermoSCK, thermoCS, thermoSO);
    int vccPin = 3; //Napajanie + pre max6675 modul z digitalneho pinu
    int gndPin = 2; //Napajanie - pre max6675 modul z digitalneho pinu
    int val;
      
    void setup() {
      
      Serial.begin(9600);
      // definicia napajacich pinou 
      pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
      pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);   
      Serial.println("MAX6675 test");
      // cakanie na stabylizaciu max6675 cipu
      delay(500);
    
      myservo.attach(9);
    
    }
    
    void loop() {
      // basic readout test, just print the current temp
      
       Serial.print("C = "); 
       Serial.println(thermocouple.readCelsius());
       
       val = thermocouple.readCelsius();
       val = map(val, 10, 800, 0, 180);     
       myservo.write(val);                  
       delay(15);            
       delay(1000);
    }
    
    #10440
    Profilový obrázekposjirka
    Účastník

    díky za kod určitě se bude někomu hodit.
    jen pár poznámek ke kodu:
    – u knihoven si do kodu napiš kde jsi tu knihovnu vzal
    – zkus pracovat trochu syststematicky, tady změříš teplotu, pošleš na seriiovou linku, pak změříš znovu, je to zbytečné zdržování a vtěžování procesoru. Změřit, poslat, přepočítat
    – dvojitý delay na konci je absolutně zbytečný.
    – Servo bych aktualizoval jen při změně. takto jej každou sekundu přepisuješ, takže nuluješ čítač, nasavýš tu samou hodnotu znovu spuštíš …

    neber to prosím jako pohrdavý pohled, jen v čas určitě většinu těch připomínek oceníš.
    Za snahu dávám palec nahoru … jen tak dál

    #10441
    Profilový obrázekrehot79
    Účastník

    Ďakujem za rady. S arduinom pracujem cca asi mesiac s prestávkami A toto je môj prvý vlastný projekt ktorý sám programujem. Určite poupravujem podľa tvojich rád, ešte raz ďakujem. Ps už mám tam aj oled i2c 128×32 ..istotne ešte budem sem zdieľať code Z projektu.

    #10442
    Profilový obrázekrehot79
    Účastník

    Som tu znova s novými úpravami kódu kde pribudol oled Display. Este raz podotykam ze toto je môj prvý projekt. Ak vydite nejake chyby tak kľudne do mňa . Zatiaľ to funguje.

    
    //[email protected]
    
    //Vsetky kniznice nacitane v arduinoIDE spravca kniznic ///// 
    #include "max6675.h"
    //Servo
    #include <Servo.h>
    Servo myservo;
    //Oled ///////////////////
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    #if (SSD1306_LCDHEIGHT != 32)
    #error("Height incorrect, please fix Adafruit_SSD1306.h!");
    #endif
    /////////////
    
    //Definicia pin
    
    int thermoSO = 6;   
    int thermoCS = 5;   
    int thermoSCK = 4;  
    MAX6675 thermocouple(thermoSCK, thermoCS, thermoSO);
    int vccPin = 3; //Napajanie + pre max6675 modul z digitalneho pinu
    int gndPin = 2; //Napajanie - pre max6675 modul z digitalneho pinu
    int val;
    int poloha;  
    void setup() {
      
      
      // definicia napajacich pinou 
      pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
      pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);   
      ////definicia servo pinu
      myservo.attach(9);
     
      //////////////////////Oled////////////
      // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
      // init done
      
      
      // Vycisti logo
      display.clearDisplay();
    }
    void loop() {
    // basic readout test, just print the current temp
      
       val = thermocouple.readCelsius()-2;
       val = map(val, 0, 300, 0, 180);     
       myservo.write(val);                      
       poloha = map(val, 0, 180, 0, 100);
        // text display text
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Teplota       Poloha%_____________________");   
      display.display();
      display.setTextSize(2);
      display.setCursor(0,17);
      display.println(thermocouple.readCelsius()-2);   
      display.display();
      display.setTextSize(2);
      display.setCursor(85,17);
      display.println(poloha);   
      display.display();
      delay(3000);
      display.clearDisplay();
    
    }
    
    #10446
    Profilový obrázekrehot79
    Účastník

    Tak prikladám znova s úpravami kode.

    
    
    //[email protected]
    
    //Vsetky kniznice nacitane v arduinoIDE spravca kniznic ///// 
    #include "max6675.h"
    //Servo
    #include <Servo.h>
    Servo myservo;
    //Oled ///////////////////
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    #if (SSD1306_LCDHEIGHT != 32)
    #error("Height incorrect, please fix Adafruit_SSD1306.h!");
    #endif
    /////////////
    
    //Definicia pin
    
    int thermoSO = 6;   
    int thermoCS = 5;   
    int thermoSCK = 4;  
    MAX6675 thermocouple(thermoSCK, thermoCS, thermoSO);
    int vccPin = 3; //Napajanie + pre max6675 modul z digitalneho pinu
    int gndPin = 2; //Napajanie - pre max6675 modul z digitalneho pinu
    int val;
    int poloha;  
    void setup() {
      
      
      // definicia napajacich pinou 
      pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
      pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);   
      ////definicia servo pinu
      myservo.attach(9);
     
      //////////////////////Oled////////////
      // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
      // init done
      // Vycisti logo
      display.clearDisplay();
      //uvod email
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(10,0);
      display.println("[email protected]");   
      display.display();
      delay(5000);
      display.clearDisplay();
    }
    
    void loop() {
         // Nacitanie teploty
         val = thermocouple.readCelsius()-2;
           
        // text display text
      display.drawLine(0, 13, 0, display.height()-1, WHITE);
      display.drawLine(300, 32, 0, display.height()-1, WHITE);
      display.drawLine(300, 13, 0, display.height()-20, WHITE);
      display.drawLine(127, 13, 127, display.height() -1, WHITE);
      display.drawLine(62, 13, 62, display.height() -1, WHITE);
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(3,2);
      display.println("Teplota    Poloha%");   
      display.setTextSize(2);
      display.setCursor(10,16);
      display.println(val);   
      
       val = map(val, 0, 600, 0, 180);     
       myservo.write(val);                      
       poloha = myservo.read();
       poloha= map(poloha, 0, 180, 0, 100); 
      
               display.setTextSize(2);
               display.setCursor(70,16);
               display.println(poloha);   
               display.display();
               delay(5000);
               display.clearDisplay();
    
    }
    

    Tu už vypisuje aj polohu serva na Display .

    #10448
    Profilový obrázekrehot79
    Účastník

    Ešte foto dyspleja prikladám

    #10456
    Profilový obrázekrehot79
    Účastník

    Netuším v čom to je ale asi že mám po dlhej dobe volný víkend , prikladám code už aj s PID reguláciou a nastavením Set-point pomocou potenciometru .

    
    ////Vsetky kniznice nacitane cez ArduinoIDE spravca kniznic.
    #include <PID_v1.h>
    #include "max6675.h"
    #include <Servo.h>
    Servo myservo;
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    #if (SSD1306_LCDHEIGHT != 32)
    #error("Height incorrect, please fix Adafruit_SSD1306.h!");
    #endif
    
    //Definicia pin
    
    int thermoSO = 6;   
    int thermoCS = 5;   
    int thermoSCK = 4;  
    MAX6675 thermocouple(thermoSCK, thermoCS, thermoSO);
    int vccPin = 3; //Napajanie + pre max6675 modul z digitalneho pinu
    int gndPin = 2; //Napajanie - pre max6675 modul z digitalneho pinu
    int val;
    int poloha;  
    const int pot = A0;
    //Define Variables we'll be connecting to
    
    //Define Variables we'll be connecting to
    double Setpoint, Input, Output;
    
    //Define the aggressive and conservative Tuning Parameters
    double aggKp=5, aggKi=0.7, aggKd=1;
    double consKp=1, consKi=0.1, consKd=0.5;
    
    //Specify the links and initial tuning parameters
    PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
    
    void setup()
    {
        
      // definicia napajacich pinou 
      pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
      pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);   
      
      ////definicia servo pinu
      myservo.attach(9);
      
      //initialize the variables we're linked to
      Input = thermocouple.readCelsius();
      Setpoint = map(analogRead(pot), 0, 1024, 0, 500);
    
      //turn the PID on
      myPID.SetMode(AUTOMATIC);
    
    //////////////////////Oled////////////
      // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
      // init done
      // Vycisti logo
      display.clearDisplay();
      //uvod email
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(10,0);
      display.println("[email protected]");   
      display.display();
      delay(5000);
      display.clearDisplay();
    
    }
    
    void loop()
    {
      Setpoint = map(analogRead(pot), 0, 1024, 0, 500); ;
      Input = thermocouple.readCelsius(); 
      double gap = abs(Setpoint-Input); //distance away from setpoint
      if(gap<20)
      {  //we're close to setpoint, use conservative tuning parameters
            myPID.SetTunings(consKp, consKi, consKd);
      }
      else
      {
         //we're far from setpoint, use aggressive tuning parameters
         myPID.SetTunings(aggKp, aggKi, aggKd);
      }
    
      myPID.Compute();
      Output = map(Output, 0, 255, 0, 170);
      myservo.write(Output);
      poloha = myservo.read();
      poloha= map(poloha, 0, 180, 0, 100); 
               
                val = Input;
                // text display text
               display.drawLine(0, 13, 0, display.height()-1, WHITE);
               display.drawLine(300, 32, 0, display.height()-1, WHITE);
               display.drawLine(300, 13, 0, display.height()-20, WHITE);
               display.drawLine(127, 13, 127, display.height() -1, WHITE);
               display.drawLine(42, 13, 42, display.height() -1, WHITE);
               display.drawLine(84, 13, 84, display.height() -1, WHITE);
               display.setTextSize(1);
               display.setTextColor(WHITE);
               display.setCursor(6,2);
               display.println("Tep.   Poz.%   Set.");   
               display.setTextSize(2);
               display.setCursor(4,16);
               display.println(val);   
               display.setTextSize(2);
               display.setCursor(47,16);
               display.println(poloha);   
               display.setTextSize(2);
               display.setCursor(89,16);
               display.println(Setpoint); 
               display.display();
               display.clearDisplay();
    delay(5000);  
    
    }
    #10457
    Profilový obrázekposjirka
    Účastník

    ty ses teda rozjel :) . Tomu říkám progress. Jen se ti začal ztrácet přehled o knihovnách. tak jak to máš, jeto dále nešířitelné. Nikdo neví v jaké verzi Arduina jsi to ladil, odkud máš knihovny (MAX6675, nebo Adafruit_SSD1306 rozhodně nejsou standardní vybavení Arduino IDE. Problém je v tom, že si lidi můžou stáhnout tyto knihnvny z různých zdrojů a pak mohou mít různé syntaxe nebo funkce. Výsledkem je pak to, že to nerozchodí. A to ani v některých případech nemusí Adruino vyhlásit chybu. Nejsem si jist, zda není třeba vložit knihovnou MATH pro přepočet PID regulace (možná už je v knihovně PID ale nevím, viděl jsem 3 a 2 jí měli 1 né …) . jinak jsem rád, když lidi mají cíl a snahu ho dosáhnout. Nezřídka se tu člově setka s lidmi , kterým se nechce přemýšlet, nebo se něco učit a v podstatě to chtěji napsat od tebe. Jsi vzácná vyjímka ….

    #10458
    Profilový obrázekrehot79
    Účastník

    Knihovne som sťahoval V správe knižníc som napísal vo vyhladavaci max6675 našlo knihovnu A len som klik instal. ArduinoIDE používam 1.8.1 A hlavne veľa čítal vseliake example A kde tu čo sa my hodilo som vybral A skúsil zakomponovať do svojho kódu s neakov drobnou úpravou aby vyhovovalo mne. Prakticky to všetko je len zlepenec napr. Oled som orezal Z demo orginal knižnice urobil neake rámčeky okolo čísel atď. Pid zase vybral z example na arduino.cc len som pridal analogread potenciometer na nastavenie set point. A tak sa to Neako zlepilo dokopy. Ak tam vydis niečo na zlepšenie tak kľudne do mňa. …Ďakujem hlavne bez prvej reakcie na môj príspevok by tento code nevznikol. Všetko si skúšam na stole s pt100, malí oled A malé servo. Ešte raz ďakujem tomuto fóru za príjemne zabitý deň hihihi A zas som O čosi múdrejší.

    #13611
    Profilový obrázekrh
    Účastník

    Zdravim, akurat planujem regulovat kotol na drevo cez Arduino. To regulujes iba kominovu klapku? Co som cital, kominova klapka ma vyznam az v druhej polke horenia priskrtit a uplne zavriet az ked su v peci iba zerave uhliky. A teplota sa ma primartne regulovat dusivkou. Ja chcem aj dusivku, oznamovat do domu potrebu prilozenia a neskro aj sekundarny vzduch a ekvitermicku regulaciu, cez lambda sondu regulovat vzduch a nie naopak atd…
    Osobne mam obavu zo zamrznutia kodu a mozneho znicenia prehriatia, pripadne vyhasnutia/dechtovania. Chcem pouzit uz radsej ESP8266 a pre stabilitu radsej LAN cez Ethernet, ako WiFi. Mozno po roku mas uz aj nieco viac, alebo ine skusenosti. Mozes poslat fotku/nakres, typ serva, atd. ake si pouzil?

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