Max6675
Úvodní stránka › Fórum › Vaše projekty › Arduino › Max6675
- Toto téma obsahuje celkem 12 odpovědí. Do diskuze (4 diskutující) se naposledy zapojil uživatel rh a poslední změna proběhla před 6 roky a 8 měsíci.
-
AutorPříspěvky
-
11.2.2017 v 1:04 #10436rehot79Úč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
11.2.2017 v 14:16 #10437BlindPÚčastníkAhoj, 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.11.2.2017 v 15:37 #10438rehot79Úč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ť
11.2.2017 v 17:06 #10439rehot79ÚčastníkTak 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.
//M.jakab29@gmail.com //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); }
11.2.2017 v 22:02 #10440posjirkaÚčastníkdí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ál11.2.2017 v 23:25 #10441rehot79Úč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.
12.2.2017 v 14:00 #10442rehot79ÚčastníkSom 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.
//M.jakab29@gmail.com //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(); }
12.2.2017 v 16:47 #10446rehot79ÚčastníkTak prikladám znova s úpravami kode.
//M.jakab29@gmail.com //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("M.Jakab29@Gmail.com"); 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 .
12.2.2017 v 17:14 #10448rehot79ÚčastníkEšte foto dyspleja prikladám
12.2.2017 v 22:17 #10456rehot79ÚčastníkNetuší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("M.Jakab29@Gmail.com"); 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); }
12.2.2017 v 22:51 #10457posjirkaÚčastníkty 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 ….
12.2.2017 v 23:10 #10458rehot79ÚčastníkKnihovne 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ší.
12.4.2018 v 10:00 #13611rhÚčastníkZdravim, 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? -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.