Keresés

Részletes keresés

Prof Creative Commons License 2017.01.22 0 0 2772

Szia!

Try-and-error...

http://forum.arduino.cc/index.php?topic=176329.0

És innen hivatkozva:

http://www.fiz-ix.com/2012/11/low-power-arduino-using-the-watchdog-timer/

 

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é.

Előzmény: 323i (2771)
323i Creative Commons License 2017.01.22 0 0 2771

Szia,

 

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);
  }
}

void loop(){
  delay(1000);
  digitalWrite(onboardLED, HIGH);
  delay(1000);
  digitalWrite(onboardLED, LOW);
}

===

 

Az elozo kodot (while(1)) amit kuldtem, az in-en talaltam, azert probaltam ki azt is, mert amit eredetileg probaltam es kuldtem, azzal sem mukodott.

A serial.print azert kerult bele az egyik peldaba, hogy lassam meddig jut el a wdt utan.

 

Itt talaltam egy reset teszet: https://github.com/Optiboot/optiboot/tree/master/optiboot/examples/test_reset -et, aminek van egy ilyen resze:

 

===

 if (resetFlags != 0x00)
  {
    // It should never enter here
    Serial.print(" Unknown");
  }

===

 

nalam persze rafut ide es ki is irja a serial.monitoron. Szoval nem vagyok meg elobbre.

 

Valamiert azt gondolom (ill. inkabb csak megerzes), hogy az optiboot-os bootloader update oldana meg a problemamat...

 

Zaraskent kiprobaltam meg millis-sel:

 

===

#include <Arduino.h>
#include<avr/wdt.h>
const int onboardLED = 13;

void setup() {
  wdt_disable();
  Serial.begin(9600);
  digitalWrite(onboardLED, LOW);
  delay(1000);
  wdt_enable (WDTO_8S);
  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);
  }
}

void loop(){
  unsigned long Time1 = 0;
  unsigned long Time2 = 0;

  Time1 = millis();
  delay(500);
  Time2 = millis();
  Serial.print(Time1);
  Serial.print("       ");
  Serial.println(Time2);
  delay(100);
 
  delay(1000);
  digitalWrite(onboardLED, HIGH);
  delay(1000);
  digitalWrite(onboardLED, LOW);
}

===

 

7700 es 8200-ig jut el az egyik es a masik szamlalo, akkor jon(ne) a reset es onnaltol semmi sem tortenik.

Előzmény: Prof (2770)
Prof Creative Commons License 2017.01.21 0 0 2770

Szia!

 

Igen, szoftver.

 

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).

 

Az eredeti példaprogram működik?

Előzmény: 323i (2769)
323i Creative Commons License 2017.01.20 0 0 2769

Szia,

 

hogy a kerdeseidre valaszoljak:

- gondolom szoftver

- ezt a kerdest nem ertem

- ezzel a koddal Unon ugyanugy megall ujraindulaskor:

- milyen hw-es kornyezetre gondolsz? Nincs semmi az Unon.

 

Nalad milyen koddal mukodik?

 

===

#include<avr/wdt.h>
int i=0;

void setup() {
pinMode(13,OUTPUT);
Serial.begin(9600);
wdt_enable (WDTO_8S);
}

void loop(){
while(1){
i++;
delay(500);
Serial.println(i);
}
}

===

Előzmény: Prof (2706)
Vargham Creative Commons License 2017.01.20 0 0 2768

Szerintem ennél többet távgyógyításban nehéz mondani.

 

Kimérheted még multiméterrel:

  • rx-tx láb között nincs-e zárlat
  • rx, tx és GND, Vcc között nincs-e zárlat
  • CH340 rx, tx lába és az AVR rx, tx lába között nincs-e szakadás

 

+1 ötlet:

Próbáld meg másik gépen, amin nem XP van. (Az XP-t amúgy is érdemes lecserélni.)

Előzmény: szla0056 (2767)
szla0056 Creative Commons License 2017.01.20 0 0 2767

Rendben, akkor "ezzel" nem foglalkozom.

De azt azért továbbra is jó lenne tudni, hogy miért nem megy.

Előzmény: Vargham (2766)
Vargham Creative Commons License 2017.01.20 0 0 2766

> Gondolom a BN-re is illene valamit kapnia, ezt már a kontrollertől, igaz?

Nem, az marad unknown. Ne foglalkozz vele. Mondtam már, hogy nem jelent semmit.

Előzmény: szla0056 (2765)
szla0056 Creative Commons License 2017.01.20 0 0 2765

Igazad van, gugliban tényleg megtaláltam a VID/PID-et.

Gondolom a BN-re is illene valamit kapnia, ezt már a kontrollertől, igaz?

 

A reset-nyomós indítást is próbáltam már, eredmény ugyanaz.

 

Előzmény: Vargham (2764)
Vargham Creative Commons License 2017.01.20 0 0 2764

> Bocs az értetlenkedésért, de ezek szerint ez a kommunikáció csak az illesztővel történt eddig?

Igen

 

> És mit takar a VID, a PID és a BN?

Google? (USB hardver azonosító: Vendor ID és Product ID. A BN-t pedig Arduino Board Namenek tippelem.)

 

> A bekapcsolás után folyamatosan villogó L led azt jelzi hogy fut egy bootloader?

Azt hiszem, de most nem találom az információ forrását.

 

> És a hibaüzenet szerint a kontroller nem válaszol?

Pontosan

 

Tartsd lenyomva a reset gombot, és csak akkor engedd el, amikor kiírja, hogy "Uploading..."

Előzmény: szla0056 (2763)
szla0056 Creative Commons License 2017.01.20 0 0 2763

Bocs az értetlenkedésért, de ezek szerint ez a kommunikáció csak az illesztővel történt eddig?

És mit takar a VID, a PID és a BN?

A bekapcsolás után folyamatosan villogó L led azt jelzi hogy fut egy bootloader?

És a hibaüzenet szerint a kontroller nem válaszol?

Előzmény: Vargham (2762)
Vargham Creative Commons License 2017.01.20 0 0 2762

> Az jó, ha most nem számít. De mit is jelent? És ezt a Nanoból kapta vissza? Akkor valami kommunikáció már van, vagy ez még nem jelenti azt?

A nano, mint minden Arduino, két fő részből áll. A cél mikrokontrollerből, ami itt ATmega 328P-PU, és a soros USB illesztő mikrokontrollerből, ami itt CH340. Tehát ez az információ semmi mást nem jelent, mint azt, hogy sikeresen lekérdezte USB kapcsolaton az illesztő VID/PID párosát.

Előzmény: szla0056 (2761)
szla0056 Creative Commons License 2017.01.20 0 0 2761

Az jó, ha most nem számít. De mit is jelent? És ezt a Nanoból kapta vissza? Akkor valami kommunikáció már van, vagy ez még nem jelenti azt?

Előzmény: Vargham (2760)
Vargham Creative Commons License 2017.01.20 0 0 2760

"BN: Unknown board
VID: 1A86
PID: 7523"

 

Jelen esetben ez nem számít semmit.

Előzmény: szla0056 (2758)
szla0056 Creative Commons License 2017.01.19 0 0 2759

Próbáld meg teljesen másik USB portról!

Úgy érted, hogy dugjam át a PC-n egy másik USB portra? Megtettem. A COM port száma más lett, (erre átírtam,) de az eredmény nem változott.

Előzmény: Prof (2757)
szla0056 Creative Commons License 2017.01.19 0 0 2758

1. Az L LED villog, ez nem azt jelenti, hogy van bootloader? Ha mégsincs rajta, hogy tudok tenni rá? Nincs másik Arduinom.

 

2. Kipróbáltam UNO-ra állítva. Így sem ment, de a hibaüzenet más volt:

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x60

És ezt ismételte 10-szer. Az Rx leden pici felvillanások látszanak is.

Nano-t választva 2 programmer is not responding próbálkozás után ezt teszi hozzá:

avrdude: error reading signature data for part "ATmega328P", rc=-1
Mi itt a signature data? Ad ez valami infót? Nekem sajnos nem.

 

3. Nem látszik a panelen se zárlat, se szakadás.

 

4. Ezzel még várnék. :-)

 

Inkább 3$, de igazad van, most már én sem egyet rendelnék.

A "Get board info" válasz mond valakinek valamit?

"BN: Unknown board
VID: 1A86
PID: 7523"

 

Tudok rajta még tesztelni, ellenőrizni valamit?

Előzmény: Vargham (2755)
Prof Creative Commons License 2017.01.19 0 0 2757

Próbáld meg teljesen másik USB portról!

Előzmény: szla0056 (2754)
Prof Creative Commons License 2017.01.19 0 0 2756

Nekem volt eddig egy (kb. 15-ből), meg egyet én téglásítottam. Mondjuk nem a 2 dolláros, hanem az 5 dollárosok között válogattam inkább.

Előzmény: Vargham (2755)
Vargham Creative Commons License 2017.01.19 0 0 2755
  1. Nincs rajta bootloader. Megoldás: Tegyél rá. (Van működő Arduinod?)
  2. UNO bootloader van rajta. Megoldás: Válaszd az UNO-t a board listából.
  3. Zárlatos / szakadt a panel. Megoldás: Javítsd meg.
  4. Döglött az MCU. Megoldás: Dobd ki.

> Programmer-nek "USBasp"-t

Ez itt nem játszik, mindegy.

 

Egyet rendeltél? 2 dolláros termékről van szó, érdemes többet rendelni, mint újra várni hetekig, ha hibás. Mondjuk én eddig még nem találkoztam hibással.

Előzmény: szla0056 (2754)
szla0056 Creative Commons License 2017.01.19 0 0 2754

Sziasztok!

Rendeltem egy Nano V3.0 ATmega328 16M kínai klónt CH340G USB vezérlővel, hogy ismerkedjem az Ardunio rendszerrel. Első próbálkozásként letöltöttem és telepítettem hozzá az IDE-t (v. 1.8.1), és a CH430 USB driver-t. XP alatt látszik mint COM6, ezt, és a Nano-t, processzort (328) beállítottam az IDE-ben. Programmer-nek "USBasp"-t.

A panelen a zöld Power LED világít, egy piros villog. (Ez azt jelzi, hogy a Boot loader várja az infót az USB-n?)

 

Elsőként a minták közül kiválasztottam a "Blink"-et. A fordítás lefutott, de a letöltés nem:

 

"Arduino: 1.8.1 (Windows XP), Board: "Arduino Nano, ATmega328"
Sketch uses 2068 bytes (6%) of program storage space. Maximum is 30720 bytes.
Global variables use 186 bytes (9%) of dynamic memory, leaving 1862 bytes for local variables. Maximum is 2048 bytes.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_recv(): programmer is not responding
avrdude: error reading signature data for part "ATmega328P", rc=-1
avrdude: error reading signature data, rc=-1
avrdude: error reading signature data, rc=-1

 

A "Get board info"-ra ezt kaptam:

 

"BN: Unknown board
VID: 1A86
PID: 7523"

 

Rossz lehet a panel, vagy valami még hiányzik a beállításokból?

 Előre is köszönöm a választ.

 

titusz99 Creative Commons License 2017.01.17 0 0 2753

A Dallasok kiolvasása még nem az igazi.

Feleslegesen sokáig tart.

Előzmény: Törölt nick (2752)
Törölt nick Creative Commons License 2017.01.17 0 0 2752

Így már tökéletes.

Kezd hasonlítani egy programra.....

A stabilitás eldöntheti végre, szoftveres, vagy hardveres oka van a teljes lefagyásnak.

Stabil működés esetén jöhet a megás, due fejlesztés.

Előzmény: titusz99 (2751)
titusz99 Creative Commons License 2017.01.17 0 0 2751

Pedig mennie kellene.

 

Helyette:

void lcd0()

{

static int c = 0;

if (c==0) lcd_idopont();

if (c==1) lcd_puffer();

if (c==2) lcd_teljesitmeny();

if (c==3) lcd_fusthofok();

c=(c+1) % 4;
}


és 4*1000*4 -ből vedd le az egyik "*4"-et.

Előzmény: Törölt nick (2750)
Törölt nick Creative Commons License 2017.01.17 0 0 2750

void lcd0() {
lcd_idopont();
t.after(INTERVAL_LCD , lcd1);
}
void lcd1() {
lcd_puffer();
t.after(INTERVAL_LCD , lcd2);
}
void lcd2() {
lcd_teljesitmeny();
t.after(INTERVAL_LCD , lcd3);
}
void lcd3() {
lcd_fusthofok();
}

A kód ezen része részlegesen fut, lcd2 és lcd3 megjelenik az lcd-n,

lcd0 és lcd1 nem fut le.

Előzmény: Törölt nick (2749)
Törölt nick Creative Commons License 2017.01.17 0 0 2749

Köszi.

Javult a helyzet:

Sketch uses 26364 bytes (81%) of program storage space. Maximum is 32256 bytes.
Global variables use 1528 bytes (74%) of dynamic memory, leaving 520 bytes for local variables. Maximum is 2048 bytes.

Előzmény: titusz99 (2748)
titusz99 Creative Commons License 2017.01.17 0 0 2748

Küldtem mailt.

Ha több ram kell, lehet a Serial bufferek méretét csökkenteni.

 

Üdv.:Titusz

Előzmény: Törölt nick (2746)
titusz99 Creative Commons License 2017.01.16 0 0 2747

Van egy csomó változód amiket feleslegesen többször deklarálod.

Ezek biztosan feleslegesek:

void kiolvas_t()
{

temppufferfent = sensors.getTempC(pufferfent);

temppuffer1_3 = sensors.getTempC(puffer1_3);
temppuffer2_3 = sensors.getTempC(puffer2_3);
temppufferlent = sensors.getTempC(pufferlent);
tempkintihofok = sensors.getTempC(kintihofok); 

 

float T1 = sensors.getTempC(pufferfent); //float hiba, emiatt lokális változó lesz
float T2 = sensors.getTempC(puffer1_3);
float T3 = sensors.getTempC(puffer2_3);
float T4 = sensors.getTempC(pufferlent);
float T9 = sensors.getTempC(kintihofok); 

van+ több is.

 

Holnap megnézem.

Sajnos az SD falja a RAM-ot.

 

Mára már jóéjszakát!

Előzmény: Törölt nick (2746)
Törölt nick Creative Commons License 2017.01.16 0 0 2746

Sketch uses 26602 bytes (82%) of program storage space. Maximum is 32256 bytes.
Global variables use 1662 bytes (81%) of dynamic memory, leaving 386 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.

A kód, amiből lehetne gyomlálni

 

[code]
/*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>
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

// WP 1
DeviceAddress pufferfent = { 0x28, 0xAC, 0xFA, 0x26, 0x06, 0x00, 0x00, 0x8C }; // "T1"
DeviceAddress puffer1_3 = { 0x28, 0x61, 0xBB, 0x26, 0x06, 0x00, 0x00, 0x7D }; // "T2"
DeviceAddress puffer2_3 = { 0x28, 0x99, 0x10, 0x26, 0x06, 0x00, 0x00, 0xED }; // "T3"
DeviceAddress pufferlent = { 0x28, 0x15, 0x1F, 0x28, 0x06, 0x00, 0x00, 0x00 }; // "T4"
DeviceAddress kintihofok = { 0x28, 0x49, 0xFE, 0x26, 0x06, 0x00, 0x00, 0x51 }; // "T9"
float temppufferfent = 0.0;
float temppuffer1_3 = 0.0;
float temppuffer2_3 = 0.0;
float temppufferlent = 0.0;
float tempkintihofok = 0.0;
float T1 = sensors.getTempC(pufferfent);
float T2 = sensors.getTempC(puffer1_3);
float T3 = sensors.getTempC(puffer2_3);
float T4 = sensors.getTempC(pufferlent);
float T9 = sensors.getTempC(kintihofok);
float kW1 = ((T1+T2+T2+T3+T3+T4)/6)-37 ;
float kW = kW1*1.2771 ;
float szazalek = kW/64*100;
float T5 = temperature1.getTemp();
float T6 = temperature2.getTemp();
float T7 = temperature3.getTemp();
float T8 = temperature4.getTemp();
float lakaskW1 = (T5-T6)*0.001161*12.5*60;
float kazankW1 = (T7-T8)*0.001161*28*60;

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void kiolvas_t()
{
//puffer hőfok DS18B20-ból
sensors.requestTemperatures(); // Send the command to get temperatures
temppufferfent = sensors.getTempC(pufferfent);
temppuffer1_3 = sensors.getTempC(puffer1_3);
temppuffer2_3 = sensors.getTempC(puffer2_3);
temppufferlent = sensors.getTempC(pufferlent);
tempkintihofok = sensors.getTempC(kintihofok);
float T1 = sensors.getTempC(pufferfent);
float T2 = sensors.getTempC(puffer1_3);
float T3 = sensors.getTempC(puffer2_3);
float T4 = sensors.getTempC(pufferlent);
float T9 = sensors.getTempC(kintihofok);
float kW1 = ((T1+T2+T2+T3+T3+T4)/6)-37 ;
float kW = kW1*1.2771 ;
float szazalek = kW/64*100;

//hőfok kiolvasása DS1624-ből
float T5 = temperature1.getTemp();
float T6 = temperature2.getTemp();
float T7 = temperature3.getTemp();
float T8 = temperature4.getTemp();
float lakaskW1 = (T5-T6)*0.001161*12.5*60;
float kazankW1 = (T7-T8)*0.001161*28*60;
//lakástermosztát fűtésre kapcsol= A3=5V
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
//hőfok kiolvasása MAX6675-ből
fusthofok = temp.read_temp();
if (LAKASFUTES > 0)
{
lakaskW = lakaskW1;
}
else
{
lakaskW = 0;
}
if(T7 > 47)
{
kazankW = kazankW1;
}
else
{
kazankW = 0;
}
}
void serial_print()
{
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
Serial.println(LAKASFUTES);
Serial.println(fusthofok);
Serial.println(T1);
Serial.println(T2);
Serial.println(T3);
Serial.println(T4);
Serial.println(T5);
Serial.println(T6);
Serial.println(T7);
Serial.println(T8);
Serial.println(T9);
Serial.println(kW);
Serial.println(szazalek);

}
void sd_iras()
{
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
SD.begin(A0);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
String dataString = "";
dataString += String(dayOfMonth, DEC);
dataString += ";";
dataString += String(hour, DEC);
dataString += ";";
dataString += String(minute, DEC);
dataString += ";";
dataString += String(second, DEC);
dataString += ";";
dataString += String(LAKASFUTES);
dataString += ";";
dataString += String(fusthofok);
dataString += ";";
dataString += String(T1);
dataString += ";";
dataString += String(T2);
dataString += ";";
dataString += String(T3);
dataString += ";";
dataString += String(T4);
dataString += ";";
dataString += String(T5);
dataString += ";";
dataString += String(T6);
dataString += ";";
dataString += String(T7);
dataString += ";";
dataString += String(T8);
dataString += ";";
dataString += String(T9);
dataString += ";";
dataString += String(kazankW);
dataString += ";";
dataString += String(lakaskW);
dataString += ";";
dataString += String(kW);
dataString += ";";
dataString += String(szazalek);
dataString += ";";
dataString.replace('.',',');
File dataFile = SD.open("datalog.csv", FILE_WRITE);

// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
}
void lcd_idopont ()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(5,0);
lcd.print("20");
lcd.setCursor(7,0);
lcd.print(year, DEC);
lcd.setCursor(9,0);
lcd.print(".");
lcd.setCursor(10,0);
lcd.print(month, DEC);
lcd.setCursor(12,0);
lcd.print(".");
lcd.setCursor(13,0);
lcd.print(dayOfMonth, DEC);
lcd.setCursor(15,0);
lcd.print(".");
lcd.setCursor(5,1);
lcd.print(hour, DEC);
lcd.setCursor(7,1);
lcd.print(":");
lcd.setCursor(8,1);
lcd.print(minute, DEC);
lcd.setCursor(10,1);
lcd.print(":");
lcd.setCursor(11,1);
lcd.print(second,DEC);
lcd.setCursor(1,3);
lcd.print(dayOfWeek);
lcd.setCursor(2,3);
lcd.print(".");
lcd.setCursor(5,3);
lcd.print("nap a heten");
}
void lcd_puffer ()
{
float T1 = sensors.getTempC(pufferfent);
lcd.clear();
lcd.home(); lcd.backlight();
lcd.setCursor(8,0);
lcd.print("PUFFER");
lcd.setCursor(0,1);
lcd.print("T1=");
lcd.setCursor(4,1);
lcd.print(T1);
lcd.setCursor(11,1);
lcd.print("T2=");
lcd.setCursor(14,1);
lcd.print(T2);
lcd.setCursor(0,2);
lcd.print("T3=");
lcd.setCursor(4,2);
lcd.print(T3);
lcd.setCursor(11,2);
lcd.print("T4=");
lcd.setCursor(14,2);
lcd.print(T4);
lcd.setCursor(0,3);
lcd.print("kW=");
lcd.setCursor(4,3);
lcd.print(kW);
lcd.setCursor(11,3);
lcd.print("%=");
lcd.setCursor(14,3);
lcd.print(szazalek);
}
void lcd_teljesitmeny()
{
float T7 = temperature3.getTemp();
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(4,0);
lcd.print("LAKAS:");
lcd.setCursor(11,0);
lcd.print(lakaskW);
lcd.setCursor(0,1);
lcd.print("T5=");
lcd.setCursor(4,1);
lcd.print(T5);
lcd.setCursor(11,1);
lcd.print("T6=");
lcd.setCursor(14,1);
lcd.print(T6);
lcd.setCursor(4,2);
lcd.print("KAZAN:");
lcd.setCursor(11,2);
lcd.print(kazankW);
lcd.setCursor(0,3);
lcd.print("T7=");
lcd.setCursor(4,3);
lcd.print(T7);
lcd.setCursor(11,3);
lcd.print("T8=");
lcd.setCursor(14,3);
lcd.print(T8);
}
void lcd_fusthofok()
{
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(8,0);
lcd.print("FUSTHOFOK");
lcd.setCursor(0,1);
lcd.print("fusthofok=");
lcd.setCursor(11,1);
lcd.print(fusthofok);
lcd.setCursor(8,2);
lcd.print("KINTIHOFOK");
lcd.setCursor(0,3);
lcd.print("kintihofok=");
lcd.setCursor(12,3);
lcd.print(T9);
}
void szabalyozas()
{
float T7 = temperature3.getTemp();
if(T7 > 55 && fusthofok > 130)
{

digitalWrite(LAKAS1,LOW );
digitalWrite(SZV1START,HIGH);
digitalWrite(PUFFER, HIGH);
}
else
{
if(T7 > 47)
{
digitalWrite(PUFFER, LOW);
digitalWrite(LAKAS1, HIGH);
digitalWrite(SZV1START, HIGH);
}
else
{
digitalWrite(PUFFER, LOW);
digitalWrite(LAKAS1, HIGH);
digitalWrite(SZV1START, LOW);
}
}
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
if ( LAKASFUTES > 4 && szazalek >1)
{
digitalWrite(BYPASS, HIGH);
digitalWrite(LAKAS2, LOW); // 6. RELÉ 8d
digitalWrite(SZV2START, HIGH); // 2. RELÉ 4d
}
else
{
digitalWrite(LAKAS2, HIGH);
digitalWrite(BYPASS, LOW); // 5. RELÉ 7d
digitalWrite(SZV2START, LOW); // 2. RELÉ 4d
}
}
#include "Timer.h"
#define INTERVAL_SD 3000 // sd kártya írás ciklus
#define INTERVAL_LCD 4000 // lcd írás ciklus
#define INTERVAL_PROG 6000 //program futás ciklus
Timer t;
void setup() {
t.every(3*1000, kiolvas_t); //3 másodpercenként
t.every(3*1000, serial_print); //3 másodpercenként
t.every(60*1000, sd_iras); //percenként
t.every(6*1000, szabalyozas); //6 másodpercenként
t.every(4*1000*4, lcd0); //sorban 4 másodpercenként a 4 kijelzési kép
lcd.init(); // initialize the lcd
lcd.backlight();
Serial.begin(9600);
// set the initial time here:
//DS3231 seconds, minutes, hours, day, date, month, year
//setDS3231time(30,12,11,13,13,04,16);

//------- 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
sensors.setResolution(kintihofok, 10); //T9
temperature1.start();
temperature2.start();
temperature3.start();
temperature4.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);
SD.begin(A0);
if (!SD.begin(A0)) {

Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");

if (SD.exists("datalog.csv")) {
Serial.println("datalog.csv exists.");
}
else {
Serial.println("datalog.csv doesn't exist.");
}
}
void loop() {
t.update();
}
void lcd0() {
lcd_idopont();
t.after(INTERVAL_LCD , lcd1);
}
void lcd1() {
lcd_puffer();
t.after(INTERVAL_LCD , lcd2);
}
void lcd2() {
lcd_teljesitmeny();
t.after(INTERVAL_LCD , lcd3);
}
void lcd3() {
lcd_fusthofok();
}
[/code]

Előzmény: titusz99 (2744)
Törölt nick Creative Commons License 2017.01.16 0 0 2745

Megnézem, már az előző is alakul.

Előzmény: titusz99 (2744)
titusz99 Creative Commons License 2017.01.16 0 0 2744

Ez a Timer is a millis-t használja.

Mennyi ideig tartanak a hőmérések?

 

kb ennyi: 

void setup() {
t.every(3*1000, kiolvas_t); //3 másodpercenként

t.every(3*1000, serial_iras); //3 másodpercenként

t.every(60*1000, sd_iras); //percenként
t.every(6*1000, szabalyozas); //6 másodpercenként
t.every(4*1000*4, lcd0); //sorban 4 másodpercenként a 4 kijelzési kép
}
void loop() {
t.update();
}
void lcd0() {
lcd_idopont();
t.after(INTERVAL_LCD , lcd1);
}
void lcd1() {
lcd_puffer();
t.after(INTERVAL_LCD , lcd2);
}
void lcd2() {
lcd_teljesitmeny();
t.after(INTERVAL_LCD , lcd3);
}
void lcd3() {
lcd_fusthofok();
}

Előzmény: Törölt nick (2743)
Törölt nick Creative Commons License 2017.01.16 0 0 2743

Megnézem.

Amit ki szeretnék hozni a kódból:

delay() nélkül legyen // mert az jó,

6 mp-ént szabályozzon,

legyen elég idő a hőfok mérésekre // 3 mp,

4 mp-ig olvasható egy-egy kiírás az lcd-n,

írjon serial-ra is.

Ez egy Timerrel menni fog?

 

 

Előzmény: titusz99 (2741)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!