Neo_fox
Vytvořené odpovědi
-
AutorPříspěvky
-
Zbyšek Voda
ÚčastníkDobrý den, asi úplně nejjednodušší cesta je použít nějaký oddělovač, který vložíte vždy mezi dvě čísla – třeba byte s hodnotou 255 (0b11111111), popřípadě možná vhodnější 0. Vždycky čekáte, dokud nepřečtete znak s hodnotou 0 a potom přečtete dva byty.
Tato metoda má své mouchy – třeba si musíte ošetřit situaci, kdy i datový být má hodnotu oddělovače (0, popř. 255). Napadá mě třeba k byte před odesláním vždy přičíst 1 – potom se byte s hodnotou 0 v datových bytech nemůže vyskytnout. Po přijetí 1 zase odečtete. Tam je ale zase problém s přetečením.
Dalším způsobem by mohlo být použít redundanci – prostě byte dat pošlete vždycky dvakrát za sebou (například).
Nebo zkusit použít nějaký standardizovaný formát dat – JSON, CSV apod… To už je ale trochu „s kanonem na vrabce“ (viz http://www.zive.cz/clanky/pojdme-programovat-elektroniku-jak-to-ze-je-prumerna-webova-stranka-stejne-velka-jako-doom/sc-3-a-185860/default.aspx).
Výběr vhodného protokolu řeší například zde: http://forum.arduino.cc/index.php?topic=195224.0.
mitgan
ÚčastníkDěkuji. To mi pomohlo.
M.
posjirka
Účastníknemáš vůbec zač, každopádně bych ten odpor zvětšil alespoň na 1k ideálně 10k.
Bude to jistější.hcdady
ÚčastníkDobrý den, děkuji za pomoc a užitečné rady posjirkovi, chyba byla ve mě. Měl jsem špatně definované piny na tranzistoru. Jinak u toho obvodu jsem odpor R1 úplně zrušil a R2 jsem nechal 100, protože když jsem tam dat 100K tak tranzistor nespínal.
Každopádně ještě jednou děkuji Davidrehot79
Úč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ší.
posjirka
Úč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 ….
rehot79
Úč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); }
rehot79
ÚčastníkEšte foto dyspleja prikladám
rehot79
Úč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 .
rades
ÚčastníkVyřešil jsem to pomocí SW seriovky na analog. portech díky 🙂
rehot79
Úč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(); }
rehot79
Úč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.
posjirka
Úč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álrehot79
Úč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); }
rehot79
Úč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ť
BlindP
Úč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.Mirda0124
ÚčastníkPokud ještě sháníte napište na Mirda2@email.cz
Vojtěch Vosáhlo
ÚčastníkPokud chcete něco co bude po vybalení fungovat tak vyplatí, pokud si chcete pohrát a trochu ušetřit, asi nevyplatí. Postavit se to dá určitě a řekl bych že bez větších problémů. Bezdrátová komunikace by asi byla přes ESP předpokládám. Co vše to má umět? Záleží taky na tom jak se na to cítíte vy. 😉
Miroslava
ÚčastníkĎakujem za odpoveď 🙂 áno s napájaním sa budem musieť potrápiť ešte pretože budem ovládať aj krokové motory a viem že takéto napájanie mi určite stačiť nebude.
Zbyšek Voda
ÚčastníkDobrý den, program nemůže nalézt knihovnu GLIBC_2.11 (viz error).
Zde řeší podobný problém pro Ubuntu: http://askubuntu.com/questions/421642/libc-so-6-version-glibc-2-14-not-found
Mělo by stačit updatovat požadovanou knihovnu.
Zbyšek Voda
ÚčastníkDobrý den,
s tím shieldem se vám to bude jenom jednodušeji zapojovat. Jinak je to jedno 🙂Jen si dejte pozor na to, abyste měla dostatečné napájení. Na stránce píší, že pracovní proud je 400mA, což by Arduino z jeho 5V pinu nemuselo zvládnout.
posjirka
Účastníkto vypadá, že FET odešel do věčných lovišť a je uvnitř zkratovaný. Určitě použít 100kOhm.
to ArduXPP: díval jsem se do špatného katalogu (ges tam má 2 a já otevřel zrovan ten špatný). Max. porud je 100nA viz příloha
Attachments:
hcdady
ÚčastníkA po připojení 3,3V u optočlenu na pozici 1 se objeví na pozici 4 10V za par vteřin spadne na 5V, ale mezi r2 ,r3 a Q pořád nic není
hcdady
Účastníktak jsem to přeměřil na pinu S1-3 jsou 3V na optočlenu 1) 1,1V, 2) gnd 4) 0,8 V, 5) 24V a mezi R2, R3, Q je 0V, já si myslím že ten optočlen vůbec nespíná. A ještě teda k tomu R2 tak myslíte že má být 100K
ArduXPP
ÚčastníkDotaz, na gme.cz jsem koukal do pdf o IRF540, a nemohu najít informaci, že má u GATE 1mA . Pod čem se tato hodnota hledá ?
posjirka
Účastníkto hcdady:
ledka je opravdu součásti optočlenu. to schéma jsem si nevymyslel a je pouze zkopírované z webu. Když na ně koukám, tak tam není nic co by nemělo fungovat. Otázka spíš zní, jeslti si neodpálil FET. Je citlivý na statiku. Napětí 1,1V i přijde hraničně málo. Změř si jaký napětí máš na GATE FETu (uzel mezi R2, R3 a Q1) když přivedeš 3,3V na ledku otočlenu a kolik tam je když to npětí na optočlen nepřivedeš.to vojtech:
na tom zapojení není na pohled nic nefunkčního. Tranzistor je součástka, která se dá zapojit různými způsoby. To co poisuješ je zapojení jako zesilovač třídy A nebo spínač. Tady je to velmi podobné, jen FET má trochu jiné podmínky. Odpor R3 přizemňuje GATE aby se FET sám neotevřel a po ztrátě napětí na GATE rychle zavřel. Přes tranzistor optočlenu se přivede ovl.napětí na GATE, které tranzistor sepne.
Výhoda tohoto zapojení je. že se neneguje signál, takže když přivedeš napětí na LEDku optočlenu, tak se přivede napětí i GATE FETu.
Právě v zapojení optočlenu proti zemi by se tahle funkce obrátila. Dokud bys nepřivedl napětí na ledu optočlenu, tak by byl FET otevřen.teď mě zarazil ten odpor R2. 100R je pro 24V strašně málo. Ve výsledku má IRF540 max. mezní proud pro GATE 1mA. Takže na tom odporu je ztráta 0,1V. Takže z 24V moc neubere a pere plný napětí do GATE. To by FET odpálilo. Měl by tam být odpor tak 47k – 100k.
Vojtěch Vosáhlo
ÚčastníkOtázka spíš na jirku a Zbyška. Když kouknu do schématu, tranzistor v optočlenu je NPN že? Ono se dá NPN tranzistorem spínat tímto způsobem? Celou dobu žiju v tom že musí být na emitoru hlavní zdroj, tzn. VCC nebo GND a na kolektoru je zátěž, to co spínám. Také jsem si myslel že NPN mi povede jen „zemi“ pokud se sepne (je na bázi VCC), a ne VCC. Asi bych tu vůbec neměl být když tohle nevím ale rád se dozvím jak to je.
hcdady
ÚčastníkTak jsem to sletoval a kupodivu nefunguje, jen takový technický dotaz u toho optočlenu jak je v něm kreslená ta světelná dioda to je asi součást toho optočlenu, že ? To jsem asi naletoval zbytečně. No nic vyměnil jsem ho za jiný, ale stejně nic. Jen se chci zeptat když je v cestě ten 470 rezistor tak mi to ovládací napětí srazí u optočlenu z 3,3V na 1,1V to stačí na sepnutí? A ještě jeden dotaz X1-1 a X2-1 jsou vlastně přes to VPP propojeni jestli to dobře chápu.
Za odpověď děkuji.ArduXPP
ÚčastníkTak opravím přechozí příspěvek, jde to buď přes TX a RX a kdyby byly tyto porty KO, tak jde využít ještě ISP6.Myslím tím pro nahrání kodu do arduina, jinak pak jde využít pro komunikaci mezi arduina SoftwareSerial nebo funkční TX a RX .
Zbyšek Voda
ÚčastníkNajděte si složku, kde máte staženou knihovnu Exosite a v ní si otevřete soubor Exosite.h v nějakém textovém editoru. Hned na začátku programu najděte řádek
#include <WiFi.h>
a zakomentujte ho.Nejsem si jistý, jestli takto bude program fungovat, ale kód se zkompiluje bez chybových hlášek. Zkuste to a uvidíme 🙂
-
AutorPříspěvky