Amit korábban írtam, datastring-es megoldást, azt is sokkal egyszerűbbé lehetne tenni, de megnézem hogyan. remélem sikerül. az is elvisz sok memóriát feleslegesen, de akkor még nem tudtam, hogy ilyen problémák lehetnek.
Itt is ha jól látom akkor definiálod a változókat a loop-on belül.
3.kör:
Sok include-od van! Vagy vegyél ki belőle, nézd meg mi mihez kell, vagy írj kisebbet a gyárinál, mert lehet abban sok minden van,amire neked itt nincs szükséged. Nem fordulhat olyan elő, hogy két különbözőt használsz, de egy is elég lenne? one wire, wire például
DS3231: SDA pin -> Arduino Digital 20 (SDA) or the dedicated SDA1 (Digital 70) pin // SCL pin -> Arduino Digital 21 (SCL) or the dedicated SCL1 (Digital 71) pin
Miért kell ez neked? Nem látom át sajnos. Biztos valamit még külön meghajtasz, de a nano-n van ilyen láb, miért kell ez oda?
4.kör:
Nem kell annyi változó, ha csak számolsz és kiíratsz dolgokat.
azt kellene, hogy csak a megadott helyeken kiíratod számolsz vele stb, de nem a változókkal, hanem a sensors.getTempC(pufferlent)- segítségével. (sok ilyen van a kódodban, ami nem baj, csak látod kicsi a memória.)
5.kör:
Nem tudom pontosan, de a kommentek is elvihetnek sok bájtot, de ha jól gondolom akkor azok nem fordulnak bele a kódba! (vb6 ban belementek azok is!)
// Arduino Nano // ---------------------- // DS3231: SDA pin -> Arduino Analog 4 or the dedicated SDA pin // SCL pin -> Arduino Analog 5 or the dedicated SCL pin // // Arduino Due: // ---------------------- // DS3231: SDA pin -> Arduino Digital 20 (SDA) or the dedicated SDA1 (Digital 70) pin // SCL pin -> Arduino Digital 21 (SCL) or the dedicated SCL1 (Digital 71) pin //
/* Arduino Nano, ATmega328 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 2): (with 3.3K to 4.7K resistor to +5 or 3.3 ) - zöld = +5 or +3.3 V */ #include <DS3231.h> #include <SPI.h> #include <SD.h> #include <avr/wdt.h> #include <OneWire.h> #include <DallasTemperature.h> #include <DS1624.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <MAX6675.h> DS1624 temperature1(0x48); DS1624 temperature2(0x4E); DS1624 temperature3(0x4D); /*-----( 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 LAKAS1 5 // relay2 #define PUFFER 4 // relay3 #define SZV2START 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
// 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
wdt_disable(); lcd.init(); // initialize the lcd lcd.backlight(); Serial.begin(9600); rtc.begin();
// The following lines can be uncommented to set the date and time //rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY //rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format) //rtc.setDate(1, 1, 2016); // Set the date to January 1st, 2016
//------- Initialize the Temperature measurement library-------------- sensors.begin(); // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster) sensors.setResolution(pufferfent, 10); //T1 sensors.setResolution(puffer1_3, 10); //T2 sensors.setResolution(puffer2_3, 10); //T3 sensors.setResolution(pufferlent, 10); //T4 temperature1.start(); temperature2.start(); temperature3.start(); pinMode(LED1, OUTPUT); pinMode(SZV1START, OUTPUT); pinMode(LAKAS1, OUTPUT); pinMode(PUFFER, OUTPUT); pinMode(SZV2START,OUTPUT); pinMode(LAKAS2,OUTPUT); pinMode(BYPASS,OUTPUT); digitalWrite(SZV1START, HIGH); // szv1 áll digitalWrite(LAKAS1, HIGH); digitalWrite(PUFFER, HIGH); // pufferre állítja az irányváltó1-et digitalWrite(SZV2START,HIGH); // szv2 áll digitalWrite(LAKAS2, HIGH); digitalWrite(BYPASS,HIGH); // bypassra állítja irányváltó2-őt pinMode(A0, OUTPUT); wdt_enable(WDTO_8S); }//--(end setup )--- void loop() /****** LOOP: RUNS CONSTANTLY ******/ { // Send Day-of-Week Serial.print(rtc.getDOWStr()); Serial.print(" ");
// Send date Serial.print(rtc.getDateStr()); Serial.print(" -- ");
// Send time Serial.println(rtc.getTimeStr());
digitalWrite(LED1, HIGH); // turn the LED on (HIGH is the voltage level) delay(100); // wait for a second digitalWrite(LED1, LOW); // turn the LED off by making the voltage LOW delay(100); // wait for a second SD.begin(A0); // Lakástermosztát fűtésre kapcsol= A3=5V int sensorValue = analogRead(A3); float LAKASFUTES = sensorValue * (5.0 / 1023.0); delay(100); sensors.requestTemperatures(); // Send the command to get temperatures // Kiolvassuk Ds18B20 szenzorokat. temppufferfent = sensors.getTempC(pufferfent); temppuffer1_3 = sensors.getTempC(puffer1_3); temppuffer2_3 = sensors.getTempC(puffer2_3); temppufferlent = sensors.getTempC(pufferlent); float T1 = sensors.getTempC(pufferfent); float T2 = sensors.getTempC(puffer1_3); float T3 = sensors.getTempC(puffer2_3); float T4 = sensors.getTempC(pufferlent); float kW1 = ((T1+T2+T2+T3+T3+T4)/6)-37 ; float kW = kW1*1.2771 ; float szazalek = kW/64*100; delay(400);
// Read the temp from the MAX6675 fusthofok = temp.read_temp();
// if the file is available, write to it: if (dataFile) { dataFile.println(dataString); dataFile.close(); } // if the file isn't open, pop up an error: else { Serial.println("error opening datalog.txt"); } delay (100);
Tovább írtam a termokontroll kódot nanora, gond van:
Sketch uses 28 800 bytes (93%) of program storage space. Maximum is 30 720 bytes. Global variables use 1 629 bytes (79%) of dynamic memory, leaving 419 bytes for local variables. Maximum is 2 048 bytes. Low memory available, stability problems may occur.
Mivel csökkenne a memória foglalás a fenti kódnál?
általában egy igéről elnevezett metódus az csinál valamit. ReadAxis az kiolvassa. Ha úgy hívnák hogy getAxisReader, akkor esélyes hogy egy kiolvasó objektumot vagy rutint adna vissza, amivel tényleg tudnál olvasni.
a magnetométert egyszer olvasod ki, és utánna a ciklusod beírja az értéket a tömb minden elemébe. ha a ciklisban olvasnád ki az eszközt, akkor a tömb elemeibe mindbe külön mérés eredménye kerülne.
Szuper jó ötlet és tényleg jóval egyszerűbb, mint amit kiokoskodtam. Azért írtam így, mert most tanulom a for-t meg a switch-t :). Nem loop-ban lesz, külön hivatkozás lesz. A "De minek" rész tetszik legjobban, ki is próbáltam gyorsan, de sajnos így is ugyanaz történik a scaled.XAxis értéke 5* ugyanaz és csak a következő ciklusban lesz új érték(cikluson belül valamiért nem olvas új értéket):
int x=0; int y=0; for(int i=0;i<5;i++){ a=scaled.XAxis; x+=a; delay(100); Serial.print(a); Serial.print(" "); Serial.print(x); Serial.print(" ");
Kezdőként próbálkozom magnetométer (HMC5883L) kiolvasásával, működik is a dolog. Viszont arra gondoltam, hogy tömbbe olvasom ki többször és a kapott értékeket átlagolom, na így már nem okés. Hiba az, hogy kiolvas EGY értéket és azzal feltölti a tömb összes elemét.
Ezt várnám tőle: 9, 10, 9, 11 Ezt kapom: 10, 10, 10, 10
Tudnátok segíteni, hogy lehet kijavítani?
Előre is köszönet.
Kód:
MagnetometerRaw raw = compass.ReadRawAxis(); MagnetometerScaled scaled = compass.ReadScaledAxis(); for(int i=0;i<5;i++){ switch(i) { case 0: sXTomb[0] = scaled.XAxis; break; case 1: sXTomb[1] = scaled.XAxis; break; case 2: sXTomb[2] = scaled.XAxis; break; case 3: sXTomb[3] = scaled.XAxis; break; case 4: sXTomb[4] = scaled.XAxis; break; } delay(100); }
// if the file is available, write to it: if (dataFile) { dataFile.println(dataString); dataFile.close(); } // if the file isn't open, pop up an error: else { Serial.println("error opening datalog.txt"); }