az a lényeg, hogy a led az nem tud high vagy low lenni, ezt el kell gyorsan felejteni. a led tud világítani meg nem világítani. akkor világít, ha feszültségkülönbség van rajta. ha az egyik fele a gnd-n van, a másik a kimeneten, akkor a high kimenetre világít. ha az egyik fele az 5V-n, a másik meg a kimeneten, akkor akkor világít ha a kimenet low.
> Villogtatva a lábak (digitalWrite HIGH-LOW): > 1-es láb (TX1) led HIGH utasításra LOW értéket vesz fel. És fordítva. > 0-ás láb (RX0) led HIGH utasításra LOW értéket vesz fel. És fordítva. > 13-as láb led HIGH utasításra HIGH értéket vesz fel.
Miből gondolod, hogy a kimenetek nem megfelelő értéken vannak? Megmérted őket?
a 13-on a led a föld fele van téve, ha 5V-ot küldesz ki akkor világít.
a 0/1-en a led az nem is a procin van, hanem az usb illeszton. a d0 nem is szokott sosem kimenet lenni, mert az ugye a receive, nem a proci hajtja a ledet hanem az usb illeszto. úgy tűnik sikerül megerőszakolnod, és kimenetnek használni mindkettőt. viszont itt a ledek a kimenet és az 5V közé vannak kötve, ezért ha 5V-t küldesz, akkor nem világít, ha 0V-t, akkor világít.
Kezdőként szeretném kérdezni, hogy az alábbi hibám tudjátok-e miért van?
Ha megcímezem a lábakat (pinMode(1, OUTPUT)): 1-es láb (TX1) led világít (HIGH). Ezt nem értem, hogy miért? 0-ás láb (RX0) led nem világít (LOW). 13-as láb led nem világít (LOW).
Villogtatva a lábak (digitalWrite HIGH-LOW): 1-es láb (TX1) led HIGH utasításra LOW értéket vesz fel. És fordítva. 0-ás láb (RX0) led HIGH utasításra LOW értéket vesz fel. És fordítva. 13-as láb led HIGH utasításra HIGH értéket vesz fel.
Na jó, ez még csak 5 könyvtár, de nem teljes a vezérlés, nincs PID-es mód. Azért alakulgat a fűtésvezérlés.
Sketch uses 10 820 bytes (35%) of program storage space. Maximum is 30 720 bytes. Global variables use 623 bytes (30%) of dynamic memory, leaving 1 425 bytes for local variables. Maximum is 2 048 bytes.
/* YourDuino.com Example: Multiple DS18B20 Temperature Sensors Displayed on 4x20 character LCD display
DS18B20 Pinout (Left to Right, pins down, flat side toward you) - fekete = Ground - sárga = Signal (Pin 10): (with 3.3K to 4.7K resistor to +5 or 3.3 ) - zöld = +5 or +3.3 V
//Get DallasTemperature Library here: http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library #include <DallasTemperature.h> // Wire (I2C) Library #include <Wire.h> // LCD Library //#include <LCD.h> #include <LiquidCrystal_I2C.h> // F Malpartida's NewLiquidCrystal library //Download: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads // Move original LiquidCrystal library elsewhere, copy this in it's place #include <MAX6675.h>
/*-----( Declare Constants and Pin Numbers )-----*/ // Data wire is plugged into port 10 on the Arduino (can be changed) #define ONE_WIRE_BUS 10 // NOTE: No ";" on #define #define HIDEGEBB 6 // relay1 #define MELEGEBB 7 // relay2 #define MOTORFUTASIDO 1000 #define CIKLUSIDOMP 30 /*-----( Declare objects )-----*/ // Setup a oneWire instance to communicate with any OneWire devices // (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS);
// Pass address of our oneWire instance to Dallas Temperature. DallasTemperature sensors(&oneWire);
// Start the LCD display library LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display int LED1 = 13; // Status LED Pin int CS = 4; // CS pin on MAX6675 int SO = 3; // SO pin of MAX6675 int SCLK = 5; // SCLK pin of MAX6675 int units = 1; // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F) float Celsius = 0.0; // Temperature output variable float hofok10 = 0.0;
// Initialize the MAX6675 Library for our chip MAX6675 temp(CS,SO,SCLK,units);
// Setup Serial output and LED Pin // MAX6675 Library already sets pin modes for MAX6675 chip! /*-----( Declare Variables )-----*/ // Assign the addresses of your 1-Wire temp sensors. // See the tutorial on how to obtain these addresses: // http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20#Read%20individual
//------- Initialize the Temperature measurement library-------------- sensors.begin(); // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster) sensors.setResolution(Probe01, 10); sensors.setResolution(Probe02, 10); sensors.setResolution(Probe03, 10); sensors.setResolution(Probe04, 10); lcd.init(); // initialize the lcd lcd.backlight(); Serial.begin(9600); pinMode(LED1, OUTPUT); pinMode(HIDEGEBB, OUTPUT); pinMode(MELEGEBB, OUTPUT);
}//--(end setup )---
void loop() /****** LOOP: RUNS CONSTANTLY ******/ { // Read the temp from the MAX6675 Celsius = temp.read_temp();
if(Celsius < 0) { // If there is an error with the TC, temperature will be < 0 Serial.print("Thermocouple Error on CS"); Serial.println( Celsius ); digitalWrite(LED1, HIGH); } else { Serial.print("Current Temperature: "); Serial.println( Celsius ); digitalWrite(LED1, LOW); } // Wait one second before reading again delay(1000);
int hofok10 = temp.read_temp()*10; if(hofok10 > 300) { digitalWrite(HIDEGEBB, LOW); } if(hofok10 < 290) { digitalWrite(MELEGEBB, LOW); } delay(MOTORFUTASIDO); digitalWrite(HIDEGEBB, HIGH); digitalWrite(MELEGEBB, HIGH); delay(CIKLUSIDOMP*100); { delay(100);} // clear the screen lcd.clear(); lcd.home(); lcd.backlight(); lcd.setCursor(0,0); lcd.print("temperature"); lcd.setCursor(0,1); lcd.print("C="); lcd.print(Celsius); {delay(3000);} sensors.requestTemperatures(); // Send the command to get temperatures lcd.clear(); // Reset the display lcd.home(); lcd.backlight(); //Backlight ON if under program control // Print our characters on the LCD // NOTE: Line number and character number start at 0 not 1
lcd.setCursor(0,0); //Start at character 0 on line 0 lcd.print("1: "); displayTemperature(Probe01);
lcd.setCursor(0,1); //Start at character 0 on line 1 lcd.print("2: "); displayTemperature(Probe02);
lcd.setCursor(0,2); //Start at character 0 on line 2 lcd.print("3: "); displayTemperature(Probe03);
lcd.setCursor(0,3); //Start at character 0 on line 3 lcd.print("4: "); displayTemperature(Probe04); {delay(2000);} }//--(end main loop )---
if (tempC == -127.00) // Measurement failed or no device found { lcd.print("Temperature Error"); } else { lcd.print("C="); lcd.print(tempC); lcd.print(" F="); lcd.print(DallasTemperature::toFahrenheit(tempC)); // Convert to F Serial.println("ds18b20"); Serial.println(tempC); } }// End printTemperature
Egy módosítás: a max6675 Vcc eddig nem a pro minire csatlakozott, most ezt korrigálva elfogadható pontossággal mér. Kialakítottam a ds18b20 1wire csatlakozót is, legközelebb annak a tesztelése következik. Lassan a program mérete kinövi a pro minit.
Jelenleg van a fenti kontroller K hőelemmel, aminek a vezetéke toldott kompenzációs vezetékkel, tehát az M-R1,R2 folytonossága, kémiai azonossága megoldott, R1,R2 azonos hőfokon van a mérőkörrel.
Van továbbá a fenti max6675 breakout K hőelemmel, amiben van 100 nF kondi is, ez kíván szoftveres hőfokkorrekciót, nem instabil, csak láthatóan eltérő hőfokot ad vissza pl szobahőfokon. A krimpelt érintkezőivel még bevisz némi eltérést, + a hőelem tokozás is befolyásolja a pontosságot és a mérés gyorsaságát.
Hegesztettem kompenzációs vezetékből érintkezők nélkül egy darabot, eddig az volt a leggyorsabb, pontosabb.
A breakouton belül nincs nagy távolság a max6675 és a referencia pontok között, a hőfokeltérés minimális lehet. Esetleg a tokozás saját hője befolyásolja a hőfokeltérést.
Ez jó leírás, ha ezt átolvasod rendesen képben leszel. Kiemelném ezt a bekezdést, mert erről beszéltem pont lentebb:
Reference junction compensation: The AD8495, which includes a temperature sensor to compensate for changes in ambient temperature, must be placed near the reference junction to maintain both at the same temperature for accurate reference-junction compensation.
tudni tudja, de ha nem érted hogy mi az, akkor nem azt fogod mérni mint hiszed.
a lényeg, hogy nem csak ott van termoelem ahol a szenzor van. hanem ott is ahol a szenzor vezetéke más anyagú vezetékkel összekapcsolódik. és ezeken a kötéseken is keletkezik termofeszültség, a hőmérséklettel arányosan. ha ennek a kötésnek a hőmérséklete ismert, akkor számolható a feszültség és lehet kompenzálni.
tehát alapból az kell, hogy a szenzor kábele nem lehet toldva, és direktbe kell menjen az ic-re, azaz hogy a kötés azonos hőmérsékleten legyen az ic-vel.