Az 1.6.4v tölti fel az üzemelő vezérlőre a RAM vizsgálatát nem tartalmazó kódot, az I2C LCD csak azzal jeleníti meg helyesen a karaktereket.
[code] //Sketch uses 26 502 bytes (86%) of program storage space. Maximum is 30 720 bytes. //Global variables use 1 528 bytes (74%) of dynamic memory, leaving 520 bytes for local variables. Maximum is 2 048 bytes.
/*Arduino Uno, ATmega328 Multiple DS18B20 Temperature Sensors DS18B20 Pinout (Left to Right, pins down, flat side toward you) - fekete = Ground - sárga = Signal (Pin 2): (with 3.3K to 4.7K resistor to +5 or 3.3 ) - zöld = +5 or +3.3 Displayed on 4x20 character LCD display DS3231 RTC MAX6675 + K' thermocouple DS1624 Temperature Sensors */ #include <SPI.h> #include <SD.h> #include <OneWire.h> #include <DallasTemperature.h> #include <DS1624.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include "MAX6675.h" #include "Timer.h" DS1624 temperature1(0x48); DS1624 temperature2(0x4E); DS1624 temperature3(0x4D); DS1624 temperature4(0x4F); #define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); } /*-----( Declare Constants and Pin Numbers )-----*/ // Data wire is plugged into port 2 on the Arduino (can be changed) #define ONE_WIRE_BUS 2 // NOTE: No ";" on #define #define SZV1START 3 // relay1 #define SZV2START 4 // relay2 #define PUFFER 5 // relay3 #define LAKAS1 6 // relay4 #define BYPASS 7 // relay5 #define LAKAS2 8 // relay6 /*-----( 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 = 10; // CS pin on MAX6675 int SO = 11; // SO pin of MAX6675 int SCLK = 9; // SCLK pin of MAX6675 int units = 1; // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F) float fusthofok = 0.0; // Temperature output variable float lakaskW = 0.0; float kazankW = 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
Sketch uses 30 296 bytes (93%) of program storage space. Maximum is 32 256 bytes. Global variables use 1 530 bytes (74%) of dynamic memory, leaving 518 bytes for local variables. Maximum is 2 048 bytes.
Sketch uses 27080 bytes (83%) of program storage space. Maximum is 32256 bytes. Global variables use 1540 bytes (75%) of dynamic memory, leaving 508 bytes for local variables. Maximum is 2048 bytes. Low memory available, stability problems may occur.
Sketch uses 26730 bytes (82%) of program storage space. Maximum is 32256 bytes. Global variables use 1530 bytes (74%) of dynamic memory, leaving 518 bytes for local variables. Maximum is 2048 bytes.
Viszont különbözik a méret az verziótól függően is, a fenti IDE 1.8.0v, az előbbi IDE 1.6.4v volt.
Viszont csak IDE 1.6.4v-val jeleníti meg helyesen a 4x20 soros I2C lcd a karaktereket.
Sketch uses 29 816 bytes (92%) of program storage space. Maximum is 32 256 bytes. Global variables use 1 520 bytes (74%) of dynamic memory, leaving 528 bytes for local variables. Maximum is 2 048 bytes.
Át kellett írni a kódot, az SD kártyára nem írt ki adatot:
Ez alapjan kotottem ossze a mega-t es az uno-t. 2:12-nel van az, amikor inditja a bootloader feltoltest, nekem akkor hibat ir ki, amire ezt talaltam itt: "2. When getting this error: avrdude: stk500_getsync(): not in sync: resp=0x00 You did not put an 100nF capacitor between +5v and RESET pin on the Arduino Mega 2560". Szo szerint nem ez a hibauzenet amit kapok, de ugyaningy kezdodik. Szoval a jovo heten vmikor kiprobalom 100n-s kondit a +5 es a reset koze, ahogy irjak.
Ezt en sem ertem, azert (is) vettem nano/uno/megat, hogy valamelyiken csak jo lesz, de nem. A masik ok pedig az, hogy igy egyikkel tudjam a masikon frissiteni a bootloadert.
A bootloader-t verziojat ki lehet valahogyan olvasni, vagy pl. ezzel a wdt-s teszttel lehet tudni hogy nem a legutolso verzio?
Alapvetően az a véleményem, hogy az MCU státuszregiszterei vannak némileg elbarmolva (ez nem a te hibád, de csak te tudod rendbeszedni őket). Javaslom még azt, hogy a wdt_enable() mellett a wdt_reset() is legyen meghívva még a setup vége felé.
eddig barmivel probaltam, mindig az volt a vegeredmeny, hogy latszolag probal ujraindulni, de ott mindig lefagy.
Most ezzel probalom.
A setup-ban eloszor letiltom, utana varok 1000ms-ot, a led-et kikapcsolom, utana engedelyezem ujra a wdt-t.
Az indulaskor meg is csinalja szepen, 3x gyorsan villogtatja a ledet, majd kb. meg 2x 1mp-es kesleltetessel, utana indulna ujra, de mar a led-et sem tudja lekapcsolni, odaig sem jut el.
Probaltam ugy is, hogy az ujraindulaskori led kikapcsolast tettem rogton a setup elso soraba, de ugyanez tortent akkor is.
===
#include <Arduino.h> #include<avr/wdt.h> const int onboardLED = 13;
void setup() { wdt_disable();
digitalWrite(onboardLED, LOW); delay(1000); wdt_enable (WDTO_4S); pinMode(onboardLED, OUTPUT); int k; pinMode(13,OUTPUT); pinMode(onboardLED, OUTPUT); for (k = 1; k <= 3; k = k + 1) { digitalWrite(onboardLED, HIGH); delay(250L); digitalWrite(onboardLED, LOW); delay(250L); } }
A felállást úgy kell érteni, hogy hogyan van a projektbe építve a watchdog. Milyen időközönként avatkozik be, mennyi ideig vár ki stb.
Ezzel a kóddal valószínűleg mindenen meg fog állni induláskor. A korábban általad küldött mintában elég egyértelműen le van írva pár szabály, amit érdemes betartani:
-- setup alatt ki kell kapcsolni (ha a void setup nem fut le, ott azért súlyos bajok vannak),
-- kivárás az élesítés előtt (wathdog, hogy ne forduljon végtelen reset-körbe a kártya és kelljen bootloadertől újra húzni),
-- megfelelő időközönként nullázni kell a watchdogot.
Igen, erre gondoltam, hogy mit csinálsz éppen a kontrollerrel.
Ami a kódot illeti. A loop-on belüli while(1) nem tudom, honnan jött, de teljesen felesleges. A loop() az Arduino keretrendszerben while(1)-ként funkcionál. A kódnak kb. 8 mp-ig kellene futnia, utána reset. Én elvetném egyelőre a Serial.print-et, és helyette a ledet villogtatnám (mint a példaprogramban). Ahogy azt nálam hozzáértőbbek néhányszor már alaposan kitárgyalták a Serial (így a Serial Monitor megnyitása) nem várt hatásokhoz vezethet.
E mellett még megpróbálnám a példaprogramban írt megoldást (wdt_disable(); a setup-ban), illetve ha már ragaszkodsz hozzá, több és informatívabb kiírást (Serial.print) mindenféle helyeken, különös tekintettel az időre ( millis() ). Ha reset után történik a baleset, tisztázni kellene, hogy mikor és mi történik, valóban van-e reset (tehát elindul újra a program a setup-tól vagy sem).