Keresés

Részletes keresés

Törölt nick Creative Commons License 2017.01.07 0 0 2684

Az általad megadott kód hibaüzenetei :

 

Arduino: 1.8.0 (Windows 10), Alaplap:"Arduino Due (Programming Port)"

C:Userswin10DocumentsArduinolibrarieslibrariesmillis_sd_lcdmillis_sd_lcd.ino: In function 'void loop()':

millis_sd_lcd:7: error: expected ')' before ';' token

#define INTERVAL_LED 1000;

^

C:Userswin10DocumentsArduinolibrarieslibrariesmillis_sd_lcdmillis_sd_lcd.ino:33:24: note: in expansion of macro 'INTERVAL_LED'

if (ledTimestamp + INTERVAL_LED < millis())

^

millis_sd_lcd:33: error: expected primary-expression before '<' token

if (ledTimestamp + INTERVAL_LED < millis())

^

millis_sd_lcd:33: error: expected ';' before ')' token

if (ledTimestamp + INTERVAL_LED < millis())

^

millis_sd_lcd:8: error: expected ')' before ';' token

#define INTERVAL_PRINT 5000;

^

C:Userswin10DocumentsArduinolibrarieslibrariesmillis_sd_lcdmillis_sd_lcd.ino:38:26: note: in expansion of macro 'INTERVAL_PRINT'

if (printTimestamp + INTERVAL_PRINT < millis())

^

millis_sd_lcd:38: error: expected primary-expression before '<' token

if (printTimestamp + INTERVAL_PRINT < millis())

^

millis_sd_lcd:38: error: expected ';' before ')' token

if (printTimestamp + INTERVAL_PRINT < millis())

^

exit status 1
expected ')' before ';' token

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Előzmény: Vargham (2682)
Prof Creative Commons License 2017.01.07 0 0 2683

Szia,

 

No problemo.

 

Minden projektfejlesztést úgy kezdek, hogy felírom a megrendelő (akár saját magam) fejében kialakult vágyakat a lehető legpontosabban. Aztán elképzelem azt, hogy később erre még milyen hülyeség jöhet rá vagy lehet praktikus, milyen kockázatok vannak (pl. hőmérséklet, tápellátás, kosz, zavarok stb.). Ezt is beleveszem, hogy később modulárisan, ha szükséges, a fejlesztés lezárulta után is rá lehessen aggatni a rendszerre újabbakat. Ha ez megvan, akkor jön az, hogy egyedi gyártás lesz, kis széria vagy sorozatgyártás. Sorozatgyártáshoz nem értek, itt mindig segítséget kérek már a tervezési fázisban is olyanoktól, akiknek ez szakmájuk.

Ha ez megvan, elkezdem a rendszer elvi összerakását: az érzékelőknek milyen igénybevételnek kell megfelelniük, milyen tűréshatáron belül kell mérniük, mennyi a pontosság minden tekintetben stb. Példa: van olyan mérési feladat az egyik projektnél, ahol folyadékhőmérsékletet kell mérni 0,1 mp-es mintavételezési sűrűséggel 0,05 celsius pontossággal 70 és 110 fok közötti tartományban, egyik oldalon légköri nyomáson, a másik oldalon 8-10 bar közötti túlnyomáson. Ez azért nem az alapértelmezett "K-hőelem" vagy a "DHT-11" kategória. Ezen belül kommunikációs protokollok, azok gyengeségei/erősségei/rendszerigénye, későbbi tokozás, kábelezés megoldása, tápellátás átgondolása, nem utolsó sorban pedig van-e működő, tesztelt könyvtár hozzá bárhol (sajnos olyanba már belefutottam, hogy Arduinora van, mbedre nincs) és az vajon ütközik-e másikkal vagy sem. Ezzel összeáll egy rendszer-szintű terv, amihez már lehet alkatrészeket túrni akár itthon a fiókokban, akár kintről (ebay, farnell, rs), akár itthonról (hestore, lomex, kontha). Ez alapján kijön, hogy egyáltalán megvalósítható-e a terv gazdaságosan vagy sem (a fenti hőmérsékletes történet most aktuális, még mindig proto szintű büdzséje már 200 000 forintnál jár, de aktuálisan dolgozom projekten, aminek a nettó alkatrészszükséglete is már százezres nagyságrend). Ha gazdaságos, akkor jöhet a következő.

 

A lapka kiválasztása nehéz ügy. Az Arduino is elég sokféle, az mbed ennek a többszöröse, minden tekintetben. Külön eszközök vannak IoT-re, beépített modulokkal, van olyan modul, ami mikroamperes nagyságrendű fogyasztást tud, vannak brutál erőművi cuccok, vannak olyanok, amik tényleg "mindent" tudnak, pl. a Disco-k. Alapvetően mindegyikre igaz, hogy fejlesztői platform (az Arduino is az, csak más a megközelítés), a központi lapkán kívül van még egy rakat alkatrész mellette (usb, debugger, töbféle tápellátás, kristályok, csak hogy a legfontosabbakat említsem). Ha a projekt proto vagy nagyon kis szériás, akkor szinte minden esetben olyan kártyát választok, amin tüskesor van, így egy hüvelysorral akár próbapanelre, akár egyedi gyártású nyákra fel lehet rakni, a szoftverfrissítés meg annyi, hogy a kártyát kiveszem a helyéről, rádugom számítógépre, frissítek, aztán vissza a helyére.

A kérdésedre a válasz az, hogy nagyjából bármelyikkel. A kérdés az, hogy a vezérlés mekkora részét akarod az egyedi elemekre leosztani vagy mindent központilag irányítani. Az okos ház kategória (ezt pár napja pont egy fejlesztővel beszélgettem) nem éppen az, amit észszerűen meg lehet oldani házi körümények közöt, már feltéve, hogy nem akarod pernyévé égve látni a házad. Egyetlen példát hozok: pár napja se le, se fel szinten befagyott nálam a rendőny. Egy redőnymozgató mechanikának és annak a vezérlésének ezt a helyzetet kezelnie kell. És nem mindegy, hogy hogyan.

Redőnyök: van-e már motor vagy bármilyen vezérlés hozzá? Ha van, akkor egyszerűbb történet, ha nincs, akkor mechanikailag is jóval bonyolultabb.
Öntöző: bemész boltba és veszel egy intelligens rendszert. Egyszerűbben és olcsóbban megúszod. A dolog mechanikai részét (szivatyú, rejtett csövezés, szórófejek, csepegtető stb.) ígyis-úgyis meg kell venned, nagyságrendileg ez meg úgyis jóval több, mint az, amibe az egésznek a "lelke" kerül (ami egyébként úgyszintén egy tök egyszerű mikrokontroller).
Hőmérséklet: ha csak az kell, akkor Dallas 18B20 vagy hasonló egyszerűen telepíthető és cserélhető cucc. Akár analóg, akár digitális, csillió megoldás létezik.
Páratartalom: csak páratartalom hőmérséklet nélkül szerintem felesleges (nem tudsz harmatpontot számolni, ami pl. öntézésnél egy praktikus információ). Kapásból erre nincs ötletem, kicsi túrnom kellene.
Villanykapcsolók: RS486 relé modulok CAT6 kábelre fűzve. Mellé tennék még egy passzív érzékelőt (világos van-e, és ha igen, mennyire), plusz visszajelző ledet. Kérdés, hogy a kapcsolókat kiváltani akarod, vagy az eredeti funkciójukat megtartani (kötés szempontjából nem mindegy). Ilyet még nem csináltam, kapásból nem tudok rá eszközt, de olyan végponti modulokat keresnék, amin 4-6 analóg vagy digitális ki/bemenet van és mindegyik külön címezhető a választott buszon. A korábban említett Canbus hátránya az, hogy azt elsősorban autóipari felhasználásra találták ki, ennek megfelelően kevés hozzá a nem erre alapozott gyári érzékelő, így jobbára magadnak kell építened/kitalálnod.
Konnektorok: ugyanez, mint a kapcsolók. Én ide még betennék egy-egy hall szenzort is, hogy lássa, van-e rajta valami, és ha van, az mennyit fogyaszt.

Konkrétum nélkül... Valószínű, hogy az mbed referencia lapkájával, az NXP LCP1768-ra épülő egyszerű modulból indulnék ki, vagy valamelyik hasonló alapkapacitású, nem túl erős processzorú darabból (valamelyik Nucleo például). Ha a központi egységre bíznám a grafikus megjelenítést is, akkor valamelyik Disco vagy az egyik nagyobb Nucleo, ezeken direkt kijelzővezérlő vagy kijelző is van.

Minden feladatot külső, kisebb vezérlőkre bíznék (itt jelentős számban előfordulhatnak akár Attiny szintű egészen egyszerű MCU-k is, amik az adott célra bőven elegendők. Mivel pl. a konnektorok egyedi vezérlése 15-ször, a kapcsolóké 17-szer ismétlődik, a sorozatgyártás határán vagyunk. Itt akár az egyedi nyákot is életképesnek tartom (van 10 dollár 10x10 cm-es két oldalas nyákra ajánlat a neten, ebből bőven kijön a szükséges mennyiség, pláne, ha az alkatrészek egy része nem furatszerelt, hanem smt).

És aztán jön a szofver. Külön a modulok MCU-iba, a központi vezérlőbe, modulonként, lehetőleg saját könyvtárakkal, mert azért az mbed háza táján is van (sajnos) Arduino keretrendszerből copy-paste-módszerrel átvett megoldás, ami ugye -- nyilván -- egyáltalán nem működik.

Azt sem tartanám elvetendő megoldásnak, hogy minden feladatra külön rendszert építesz, aztán ezeket integrálod a végén egyetlen egységbe egy központi vezérlővel. Ha faszányos GUI-t szeretnél, akkor itt pl. az RPI már adja magát, bár teljesen más architektúra, más lehetőségekkel.

 

Kb. ennyi. Nem sok konkrétum van benne. Ez elsősorban annak a következménye, hogy teljesen más irányvonalon fejlesztettem eddig.

Előzmény: spiler0078 (2676)
Vargham Creative Commons License 2017.01.07 0 0 2682

1. Mivel az index fórumban nincs kód formázási funkció, az összes beszúrt kód olvashatatlan. Ezért érdemes lenne mindenkinek külső forrásból linkelni a kódot. Vagy tud erre valaki jobb megoldást?

2. Az időzítési kérdésedhez nem szükséges az egész programot beszúrni, elég a releváns részt.

Előzmény: Törölt nick (2680)
Vargham Creative Commons License 2017.01.07 0 0 2681
Előzmény: Törölt nick (2680)
Törölt nick Creative Commons License 2017.01.07 0 0 2680

Hamár programozás...

Az alábbi kódban a loop()-ban delay helyett millis van, hogyan kellene átírni, hogy a 

 

lcd_display();
sd_write;

különböző ,tetszőleges időben fusson?

A többi programban is jobb lenne a millis alkalmazása, ha jól gondolom azzal a program futása nem állna le.

Jelenleg a fűtés program még kiakad futás közben, és úgy tűnik nem hardweres okkal, abban delay() van.

 

[code]
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#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) );
}
#include <UTFT.h>
UTFT myGLCD(CTE32,25,26,27,28);
#include <DS3231.h>
// Init the DS3231 using the hardware interface
DS3231 rtc(SDA, SCL);
#include <URTouch.h>
URTouch myTouch( 6, 5, 32, 3, 2);
int x, y;
char stCurrent[20]="";
int stCurrentLen=0;
char stLast[20]="";

extern uint8_t ArialNumFontPlus[];
extern uint8_t Inconsola[];
extern uint8_t SevenSegmentFull[];
extern uint8_t SmallFont[];

void lcd_display()
{
// Send Day-of-Week
Serial.print(rtc.getDOWStr());
Serial.print(" ");

// Send date
Serial.print(rtc.getDateStr());
Serial.print(" -- ");

// Send time
Serial.println(rtc.getTimeStr());
// Send current temperature
Serial.print("Temperature: ");
Serial.print(rtc.getTemp()-3);
Serial.println(" C");
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setColor(255,255,0);
myGLCD.setFont(ArialNumFontPlus);
myGLCD.print (rtc.getTimeStr(FORMAT_SHORT), CENTER, 10);
myGLCD.setColor(120,0,255);
myGLCD.setFont(Inconsola);
myGLCD.print (rtc.getDOWStr(), CENTER, 80);
myGLCD.setColor(255,255,0);
myGLCD.setFont(SevenSegmentFull);
myGLCD.print (rtc.getDateStr(), CENTER, 120);
myGLCD.setColor(255,0,0);
myGLCD.setFont(SevenSegmentFull);
myGLCD.printNumF(rtc.getTemp()-3,2, CENTER, 180);
}
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 sd_write()
{ SD.begin(53);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&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(rtc.getTemp()-3, DEC);
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();
}
// if the file isn't open, pop up an error:
else
{
//Serial.println("error opening datalog.txt");
}
}
int ledPin = 13; // LED connected to digital pin 13
unsigned long currentTime;
unsigned long loopTime;
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
currentTime = millis();
loopTime = currentTime;
// Setup Serial connection
Serial.begin(115200);
// Uncomment the next line if you are using an Arduino Leonardo
//while (!Serial) {}

// Initialize the rtc object
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(8, 12, 2016); // Set the date to January 1st, 2017
pinMode(53, OUTPUT);
SD.begin(53);
if (!SD.begin(53))
{

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()
{
currentTime = millis();

if(currentTime >= (loopTime + 6000))
{
digitalWrite(ledPin, !digitalRead(ledPin)); // toggles the LED on/off
lcd_display();
sd_write;
loopTime=currentTime;
}

}
[/code]

Előzmény: Prof (2679)
Prof Creative Commons License 2017.01.07 0 1 2679

Szasztok,

 

Sploc, mielőtt óriási keveredés lenne a dologból, pár alaptétel.

 

1. Egy programon belül (Arduino 'sketch', konkrétan az Arduino keretrendszer/IDE szabályai szerint) kizárólag egy loop() ciklus lehet. Ez alap esetben végtelen számú alkalommal ismétlődik. Egy programon belül a miniális és egyben maximális követelmény is az egy darab void setup() és az egy darab void loop() megléte. A fordítást, áttöltést követően a setup() minden indítást  (reset vagy táp bekapcsolást követően) egyszer fut le, a loop () néhány speciális esetet kivéve végtelen számú alkalommal. A speciális eseteket hagyjuk egyelőre.

 

2. Léteznek olyan parancsok, amelyek valamely feladatot egy loop() futási körön belül többször futtatnak le. Jellegüket tekintve vagy magukban számolnak (például for ciklus), vagy vamely állapotot figyelnek (például while ciklus). Amikor a program futása során ezek sorra kerülnek, a szintaktika (az Arduino keretrendszer 'nyelvtana') szerinti módon a cikluson belüli utasítás vagy utasítások a megadott/tervezett számú alkalommal futnak le. Ettől a loop() ciklus futása nem változik, mindössze annyi történik, hogy a program futása az adott feltételek teljesülésének idejére csupán néhány utasításra korlátozódik.

halaloszto példája alapján a setup() az alapanyagok és eszközök előszedését jelenti (csak egyszer kell, az elején), a loop () maga az ételkészítés folyamata, a for ciklus megfelel pl. a "vágj fel 4 hagymát"-nak, egészen konkrétan "addig vagdoss hagymákat, ameddig a felvágott hagymák száma el nem éri a 4-et", a while ciklus pedig nagyjából az "addig dinszteld a hagymákat, amíg azok üvegesek nem lesznek".

 

3. Ide kívánkozik még egy rész, amit ugyan a legtöbb Arduino példa, különösen az egyszerűbbek nem érintenek, de a változók hatókörének megértéséhez fontos. Ezek a függvények. Az Arduino kód alap esetben két függvényt, a loop()-ot és a setup()-ot tartalmazza. Viszont ezen kívül végtelen számú (legalábbis a rendelkezésre álló memória erejéig) további függvényt tartalmazhat. Ezeket önálló programrészeknek kell tekinteni, amelyek akkor és csak akkor futnak le, amikor egy másik függvényből [setup(), loop() vagy másik önálló föggvény] hívás érkezik rájuk. Erre sajnos a legtöbb általam ismert oktatóanyag nem vagy nem kellő alapossággal tér ki.

 

4. Változók. Az Arduino keretrendszer alapjául szolgáló C nyelvben ez elég jól definiált dolog, ez nagyjából-egészében az Arduinora is igaz szerencsére, bár néhány dolgot jóval egyszerűbben oldottak meg (mert inkább tanulásra, oktatásra kitalált rendszerről van szó). Egy változónak alapvetően két fontos tulajdonsága van: a típusa (char, bool, int stb.), illetve a hatóköre (lokális, globális stb.). A típust kellő angol ismerettel az Arduino honlap REFERENCE szakaszában kifejtik. A hatókör már egy más kérdés. Alap esetben úgy kell elképzelni, hogy egy változó akkor foglal memóriát, ha él, egyébként nem. Ha él, van benne adat (függetlenül attól, hogy hozzárendeltél-e adatot akkor, amikor életre hívtad vagy sem), ha elpusztul, akkor az adat törlődik (egészen pontosan felszabadul az a memóriacím, amin tárolva van, ha ezt nem írja felül semmi, a memóriacímről elvileg beolvasható a régi adat). A változók életciklusa és hatóköre piszok fontos a jó programstruktúra elkészítéséhez (plusz memória-takarékossághoz stb.). Az alap tétel az, hogy egy lokális változó ott férhető hozzá, ahol létrehoztuk. Egy globális változó a programon belül mindenhol hozzáférhető. A legtöbb példában a változók deklarálása (és jó esetben a kezdeti értékek hozzárendelése) a programok legelején történik. Ezek mind globális változók, a setup() és a loop() függvényeken belül bárhol, illetve minden egyedileg létrehozott függvényen belül hozzáférhetők. A for ciklusban deklarált változó viszont lokális, ez csak ott és csak addig él, amíg a for ciklus fut, utána elpusztul (pontosabban felszabadul a memóriahely és a változó neve is "újrahasznosítható" lesz). Egy változó a hatókörén kívül nem él, nem értelmezhető, nem hozzáférhető, normális körülmények között nem írható át (erre van kivétel, de ebbe most nem megyek bele). Nagyon egyszerű példával:

int globalisValtozo = 0; //változó deklaráció a kód elején, ezek a kódon belül végig, mindenütt élnek és hozzáférhetők.

void setup()

{

int vaneGombnyomas = digitalRead(1); // ez lokális változó, csak a setup() függvényen belül él

}

void loop()

{

int loopValtozo = 42; // ez egy lokális változó, csak a loop()-on belül hozzáférhető

for (int i=0; i<10 ; i++) //az i változó csak a for cikluson belül él, csak ott hozzáférhető

{ } //ez a for ciklus parancsszakasza

int i = 21; // ez meg itt egy vicces helyet, amibe sokan belefutnak, lásd alább.

}

A változók a globálistól lefelé a lokális függvény szintű és a lokális parancs (ciklus) szintű változókig építkeznek hatókör szerint. Ennek megfelelően egy adott elnevezésű globális változóból egy programon belül csak egyetlen egy lehet. Egy függvényen belül egy adott elnevezésű változóból csak egyetlen egy lehet, de ugyanazt a változónevet létrehozhatod és használatod egy másik függvényen belül is (elvileg akkor is, ha mindkét változó egyszerre él), és a két függvényben a két teljesen azonos nevű változó teljesen eltérő értékkel bírhat. Ugyanez igaz a ciklusokra is, annyi differenciával, hogy beágyazott ciklusok ugyan vannak (cikluson belüli ciklus), de a beágyazott ciklus nem érhet véget később, mint az a ciklus, amibe beágyaztad. Plusz mivel a változók, amiket a cikluson belül deklaráltál, a cikluson belül élnek és érvényesek, ezért a ciklusba ágyazott ciklusban ugyanazt a változót még egyszer azonos néven nem hozhatod létre (for (int i....)-n belül nem lehet még egy for (int i...)). Sőt, mint a fenti példa is mutatja, ha egy változónak van egy függvényen belül érvényes változata és egy függvényen belüli cikluson belüli változata, akkor a kód fordítása sem fog már megtörténni (mivel a függvényen belül érvényes változó a függvénybe ágyazott utasításszintű változóként lenne újra létrehozva). Ez szintaktikai hiba.

 

Aztán van még a változó nevezéktan, a változótípusokkal való hatékony munka és a memóriakezelés hatékonyabbá tétele, a változók és a konstansok közötti differencia és ezek hatékony használata, és akkor még mindig nem hívtunk adatot memóriacímről. :-) Ez jó hosszú külön poszt lehetne.

 

Innentől csak a távoli jövő...No, ha ezzel így megvagyunk, akkor jön a következő csavar, hogy függvényen belül lokális változót át lehet adni másik függvénynek úgy, hogy a lokális változó tartalmát a meghívott függvényben felhasználjuk, sőt, az ottani lokális változóban meg is változtatjuk, majd ezt visszaadhatjuk egy teljesen másik változóba a hívott függvényből a hívó függvénybe. Sőt, megtehetjük azt is, hogy a függvényt kiszedjük a picsába, csinálunk belőle egy könyvtárat, amibe úgyszintén vannak lokális és (a könyvtáron belüli) globális változók, sőt, olyanok is, amik a könyvtárat használó programból is elérhetőek és megváltoztathatóak.

 

Előzmény: Sploc (2677)
halaloszto Creative Commons License 2017.01.07 0 0 2678

ezek  a programok felülről lefele futnak, mint a kajarecept. ha egymás alatt vannak ciklusok, akkor azoknak semmi köze egymáshoz. először dinszteled a hagymás üvegesedésig, a vége fele meg addig főzöd amíg zsírjára le nem sül. ha két ciklus egymás hasában van, az egy spéci eset. a belső annyiszor fog lefutni, ahányszor a külső kényszeríti. vedd az almákat, és mindet darabold 8ba. a belső ciklusban egy almát vágsz nyolc fele, a külső meg végigmegy az almákon.

 

Vajk

Előzmény: Sploc (2677)
Sploc Creative Commons License 2017.01.07 0 0 2677

Sziasztok, 

Mint már írtam nem rég kezdtem el a programozást,  így nem túl nagy a lexikális tudásom belőle. Néhány példaprogramnál láttam, hogy több loop ciklus van egy adott kódban,  ezt hogy kell érteni? Egymástól függetlenül futnak a ciklusok különböző sebességel? Át is lehet bennük a változókat olvastatni?

 

Köszi

spiler0078 Creative Commons License 2017.01.07 0 0 2676

Szia!

 

Hát előbb kérdeztem, mint hogy utána olvastam volna... 

Szóval úgy néz ki komolyabb az mbed platform mint az Arduino (De gondolom ezt te már tudtad:) ). Az FRDM K64F igazából szinte mindent tud...

 

Közben átgondoltam, nem is lenne jó ha mindent egy boarddal hajtanék meg, persze, ha attól függetlenül láthatnék mindent 1 kijelzőn...

 

Most már érdekelne a csilli - villi kijelzés is. :) Te mit használsz kijelzésre?

 

Melyik lapkával lehetne ezt megoldani, hogy ezt mindet tudjam vezérelni?

 

redőnyöket (4-5 kőr)

öntözőt (4-6 kőr)

mérném a hőmérsékleteket (lakásban és kint ) (OneWire) 1 kimenet

páratartalmakat (lakásban és kint) 6 helyen

levegő minőséget (lakásban és kint) 6 helyen

villanykapcsolók  (17 db)

konnektorok (15 kőr)

 

Előre is köszi 

Spiler

Előzmény: Prof (2667)
Gogol69 Creative Commons License 2017.01.06 0 0 2675

Szia!

Nekem meg maradtak ilyen sima DS18B20-k (10db)

Ha gondold átadom.

Én inkább ds18b20 waterproof -t használok.

Előzmény: enginer (2669)
rSmoky Creative Commons License 2017.01.06 0 0 2674

Rájöttem !

Előbb elkel indítani a szenzort és csak utána beállítani a bitrátát.

Szeretem ha csak ilyen apró hibák vannak és a megoldáshoz nem kell atomot robbantani!

 

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 8, 14, 15, 16, 17);

#define ONE_WIRE_BUS_1 7 
#define ONE_WIRE_BUS_2 6

OneWire oneWire_in(ONE_WIRE_BUS_1); 
OneWire oneWire_out(ONE_WIRE_BUS_2);

DallasTemperature sensor_inhouse(&oneWire_in); 
DallasTemperature sensor_outhouse(&oneWire_out);

 

void setup() {

lcd.begin(20, 4);
lcd.clear();

sensor_inhouse.begin();
sensor_outhouse.begin();  // előbb elindítjuk a szenzorokat

sensor_inhouse.setResolution (12);  // Aztán csak utána álítjuk be a felbontást 
sensor_outhouse.setResolution (12); 

}
void loop() {


delay(750);
sensor_inhouse.requestTemperatures();
sensor_outhouse.requestTemperatures(); 
delay(750); 
lcd.setCursor(0,0);
lcd.print("In:");
lcd.print(sensor_inhouse.getTempCByIndex(0),1); 
lcd.setCursor(0,1);
lcd.print("Out:");
lcd.print(sensor_outhouse.getTempCByIndex(0),1);
}

 

Előzmény: rSmoky (2672)
spiler0078 Creative Commons License 2017.01.05 0 0 2673

Szia!

 

Köszi a választ!!! :)

 

Az mbed platformon milyen vezérlőt használnál, ha nem az Arduino Mega2560-at, mert ahogy néztem itt is elég sokféle alaplap van. 

 

Szóval ezt IoT-re hegyezték ki... Ez szerinted stabilabb mint az arduino, vagy miért választanád ezt?

 

Viszont találtam egy ilyet: Freescale Freedom-K64F, ez szerinted tudásban elég lehet nekem?

 

Ehhez milyen kiegészítőket lehet kapcsolni ? Mert azt nem nagyon találtam, vagy csak rosszul kerestem... Annyit találtam, hogy "tower"-be lehet építeni.

 

Arduinoval én nextionos megjelenítést használok. Elég gyorsan lehet vele dolgozni (mármint a grafikákat beilleszteni, változókat létrehozni, stb). Mbed platformon is van valami hasonló, vagy jobb display, vagy itt is használható a nextion?

 

Reléket hogyan tudok vele meghajtani (30-40db)? Gondolom nem a legjobb ha direkt a kimenetre kötöm, mert nem tudja kiszolgálni elég árammal a lapka. 

 

Köszi!

 

Spiler

 

 

Előzmény: Prof (2667)
rSmoky Creative Commons License 2017.01.05 0 0 2672

Sziasztok egy kis problémám van Ds18b20 szenzor témában.

Mega arduino van és 10db dallas szenzort szeretnék rákötni mindegyikteket külön-külön bemenetre.

(az addressal nem akarok bajlódni)

Az a bajom hogy így csak 9 biten kommunikálnak hiába adom meg a bitrátát.

Ha egy bemenetre rakom őket és addressal azonosítom akkor működik szépen.

 

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 8, 14, 15, 16, 17);

#define ONE_WIRE_BUS_1 7
#define ONE_WIRE_BUS_2 6

OneWire oneWire_in(ONE_WIRE_BUS_1);
OneWire oneWire_out(ONE_WIRE_BUS_2);

DallasTemperature sensor_inhouse(&oneWire_in);
DallasTemperature sensor_outhouse(&oneWire_out);

 

void setup() {

lcd.begin(20, 4);
lcd.clear();

sensor_inhouse.setResolution (12);  // ezt az utasítás hibának nem veszi de figyelmen kívül hagyja
sensor_outhouse.setResolution (12); 
sensor_inhouse.begin();
sensor_outhouse.begin();
}
void loop() {


delay(750);
sensor_inhouse.requestTemperatures();
sensor_outhouse.requestTemperatures(); 
delay(750);
lcd.setCursor(0,0);
lcd.print("In:");
lcd.print(sensor_inhouse.getTempCByIndex(0),1); 
lcd.setCursor(0,1);
lcd.print("Out:");
lcd.print(sensor_outhouse.getTempCByIndex(0),1);
}

halaloszto Creative Commons License 2017.01.05 0 0 2671
Előzmény: halaloszto (2670)
halaloszto Creative Commons License 2017.01.05 0 0 2670

azért ez nem semmi. több mint 4 éve volt. és a manusznak ugyanaz az accountja az ebayen, és ugyanazon az url-en ott van a listing, ugyanaz az id-je. az ár viszont sokat ment fel, 2012ben 9.22usd volt free shippinggel.

Előzmény: enginer (2669)
enginer Creative Commons License 2017.01.05 0 0 2669

Szia!

 

Tudnál küldeni egy ebay linket ehhez az eladóhoz? , mert akkor rendelnék tőle egy adagot.

Elöre is köszi.

 

Előzmény: halaloszto (2541)
Törölt nick Creative Commons License 2017.01.05 0 0 2668

mega2560, due +cte3.2 lcd vonalon elsőre a megfelelő csatlakozást kellett ellenőrizni, due-nél a megfelelő libraryt is nehéz volt megtalálni.

Amikor a due is működött, meghalt az érintő panel az lcd-n, másikat kellett rendelni.

Viszont napi szinten találkozom ipari elektronikával, szoftverekkel, ott sem hiba mentes a működés.

Előzmény: Brandyman (2666)
Prof Creative Commons License 2017.01.05 0 0 2667

Szia,

1. Alapvetően protokolltól függ, i2c-vel ne is próbálkozz, azt alapvetően nyákon belüli kommunikációra találták ki. Vannak rendszerek (pl. RS485), ami vígan elmegy több tíz métert is különleges birizgálás nélkül. Arduinóval számos minta van rá. Canbus játszik (bár az eszközök köre szűkös). Elgondolkodtató ez esetben a szobánkénti kontroller és a központi vezérlő master/slave-szerű elrendezésben. Cat6 megfelelő az adatátvitelre és a tápkábelnek is.

2. Kérdés, hogy mennyire akarsz pontos értéket. A One Wire vígan elmegy néhány tucat métert, de a távolsággal arányosan a zavarérzékenység nő. Én nem keverném a rendszereket, egy központi busz, az érzékelők meg a sajátjukon (lásd 1. pont).
3. Én nem feltétlen Arduino alapon csinálnám, de a mega2560, ha nem akarsz csili-vili kijelzést, megbírkózik vele. Én valószínűleg mbed platformon és jó eséllyel Can-Bus-szal vagy RS485-tel csinálnám.
4. Amit a rendszer elbír. Tudok közelségérzékelős rendszerről is, ami megfelelő protokoll alapján tök automatikusan kapcsol mindent a lakásban.
5. A műszaki átvétel után azt csinálsz, amit akarsz, a plusz kábelnek a villanyszerelő nem fog örülni, de azt kérheted, hogy másik csatornába húzza és másik fali elosztódobozba rakja, és akkor nincs gond vele semmilyen szempontból. Az biztos, ha valamit elbaltázol, akkor a tűzvizsgálók erősen  kérdezgetni fogják, hogy mi hogy volt, és ha úgy alakul, a biztosító például simán kifarol a helyzetből. Az okosházon nem (csak) az elektronika kerül annyiba, hanem az is, hogy felelősséget vállalnak arra, hogy emiatt nem fog leégni a házad (ha mégis, akkor az ő biztosítójuk az ő felelősségbiztosításuk terhére fizetni fog). Építésügyileg ez úgy néz ki, hogy a házba az és úgy kerülhet bele, ahogy a terveken van. Ez a felelős műszaki vezető felelőssége. Ha a terveken szerepel egy sor második kábelcsatorna, benne egy-két-há CAT-6 UTP kábellel, akkor az lesz. Hogy aztán ezzel mi fog történni, ahhoz nekik már semmi közük. A házat úgy kell átadni, hogy a te tervedből semmi nem látszik sem a terveken, sem a házon (maximum kihagyott lyukak, üres kötődobozok stb.). Aztán amikor az e-építési naplót lezárják, akkor jöhet a mehet, mert onnantól az már a te felelősséged, nem az építésvezetőé.

Előzmény: spiler0078 (2665)
Brandyman Creative Commons License 2017.01.05 0 0 2666

Sziasztok, 

 

Beleszaladtam egy 2.4-es MCUFRIEND TFTLCD-be, de sehogyan sem tudom elindítani. 

Kipróbáltam sok library-t, de vagy fel sem megy, vagy ha fel is megy, semmi sem történik. 

 

A példaprogramok működnek, soros porton jönnek adatok (ha beleírták), de magán a kijelzőn semmi sem történik.

 

Van valakinek ezzel kapcsolatban tapasztalata? 

 

Én is okos házban gondolkodnék, ez lenne a fő eleme, de így...

 

Előre is köszönöm! 

 

 

 

spiler0078 Creative Commons License 2017.01.05 0 0 2665

Sziasztok!

 

Jövőre építkeznék (160m2), és elkezdtem nézegetni az okosház rendszereket, viszont elég húzós árakat
mondtak... (1.5-2Mft)
Amire szükségem lenne (kb):
- 14-15 világítási kör vezérlése
- 6-7 helység hőmérsékletének mérése, és szabályzása
- 10 db redőny vezérlése
- kapunyitás
- szellőztető berendezés vezérlése

 

Jelenleg egy 50m2-es kis családi házban lakunk, ahova már összeraktam egy kis eszközt, amivel a
a szoba, nappali, külső hőmérsékletét mérem. Páratartalmat mérek, és vezérlem a hővisszanyerős szellőztetőmet.
Ugyanezzel az eszközzel mérem a vegyes tüzelésű kazán előremenő és visszatérő víz hőmérsékletét és a puffer hőmérsékletét...

Ez eddig elég stabilan működik, viszont itt kicsik a távolságok (10m max.) a szenzorok és relék, és a mikorkontroller között (Arduino MEGA 2560),
és itt működik úgy hogy az arduino jelszintekkel kapcsolok...

 

Buszos rendszerre gondoltam (hogy építek egyet), ahol a fogyasztókig kihúzatnám (villanyszerelővel) a táp kábeleket egy központi vezérlőszekrényből, és a
kapcsolók (lámpa, redőny, stb) és szenzorok (hő- és párataratlom mérő) helyére pedig Cat5e vagy Cat6 -os kábelt húznék, és ezen keresztül adnám az
adott jelet vissza a mikrokontrollernek, hogy pl kapcsold fel a lámpát vagy nyisd ki a 2.szoba fűtési szelepét, stb...

 

Arra gondoltam, hogy megcsinálnám magamnak a vezérlést, de van egy csomó kérdés ami miatt még infót szeretnék gyűjteni, hogy érdemes-e belevágnom...
1., a mikorkontrollertől egy távolabbi helység kapcsolójából nem esik-e túl sokat a jel mire elér a MEGA-ig, ezeket ilyenkór hogyan érdemes csinálni?
24V vagy 48V-al kapcsolni, mert az távolabbra is vihető nagyobb jelszint esés nélkül?


2., DS18B20-al mérem a hőmérsékleteket jelenleg, ha mondjuk a legtávolabbi hőmérő van vagy 30m-re az mennyire fog pontos értéket adni?

 

3., Egy ilyen "nagyobb" rendszerrel mennyire stabil a MEGA, vagy melyik lapkát érdemes használni?

 

4., Villanykapcsolónak mit érdemes használni?
"Csengő" kapcsoló jó választás lehet?
Vagy egy Nextion UNO páros relével. (Erre azért gondoltam, mert a kapcsoló programozható, hogy mit szeretnék kapcsolni vele)

 

5., Lakhatási engedély kiadásánál mennyire veszik figyelembe, hogy a vezérlést nem villanyszerelő csinálta? Szóval mennyire
van erre nekem "jogosultságom" hogy megcsináljam? (Elektroműszerész és OKJ-s programozói vizsgám van)

 

Előre is köszi a segítséget!

 

Spiler

 

Néhány kép a mostani vezérlésemről:

 

 

 

Prof Creative Commons License 2017.01.04 0 0 2664

Hehe... :-) Vicces, de egyébként meg jogos.

Előzmény: halaloszto (2663)
halaloszto Creative Commons License 2017.01.04 0 0 2663

https://forum.arduino.cc/index.php?topic=397240.0

 

itt azt írják, hogy ezek tranyók.

Előzmény: enginer (2662)
enginer Creative Commons License 2017.01.04 0 0 2662

Az fasza! Akkor én is beszoptam 10db-ot.

Előzmény: Sploc (2661)
Sploc Creative Commons License 2017.01.04 0 0 2661

Szia!

Semmit... kipróbáltam 8at a 10ből, de egyik sem működik a "hagyományos példákkal".

Visszakértem az árát az eladótól, és vettem itthon DS18b20+ -ost.

Tényleg mi a különbség a DS18b20+os és a sima DS18b20 között?

Előzmény: enginer (2660)
enginer Creative Commons License 2017.01.04 0 0 2660

Én is belefutottam ebbe a kintről rendelt  DALLAS 1541C4 +233AA szenzorba. Google nem talál róla semmit.

Te találtál valami megoldást?

 

Előzmény: Sploc (2540)
Sploc Creative Commons License 2017.01.01 0 0 2659

Köszi! 

Előzmény: Gogol69 (2653)
Sploc Creative Commons License 2017.01.01 0 0 2658

A véletlen  félremérésekre fel is vagyok készülve, 5elemu tömbökbe olvasok,  legkisebb,  legnagyobb elemek eldobasaval és a maradék átlagolásával.  De ha egy mérőeszköz folyamatosan  - 127c t ad azzal nem tudok mit kezdeni. Érdekes, hogy mikor USB-n volt az arduino akkor jót mért a hőmérő is és meg is találta a címét is,  de mikor külső tápot kapott megállt. Pedig a másik 3 is azon a tápon van.  Lehet hogy az előző leírásom nem volt egyértelmű,  de külön-külön használom a hőmérőket,  mind a 4 másik digitális lábon van.  One-wire ként egyik sem működött. Ki fogom cserélni azt az egy hőmérőt hátha csak annak van valami kínja. 

 

Köszi! 

B. U. É. K. 

Előzmény: titusz99 (2655)
Sploc Creative Commons License 2017.01.01 0 0 2657

Köszi.  Ez jutott nekem is eszembe mikorra feltettem a kérdést... nem is értem miért nem így csináltam meg eddig,  hiszen más változót is így olvasok onnan. Szerencsére csak egy oldalas a kijelzés ez így nem okoz problémát. 

Előzmény: nagyharcos (2656)
nagyharcos Creative Commons License 2017.01.01 0 0 2656

Szia!

 

A Nextion-os problémárba én is belefutottam. A dualstatebutton , vagy sima button és új global változó a megoldás. Nyomáskor megváltozik a dsbutton értéke ( vagy nyomáskor megváltoztatod az új változó érték (mondjuk va_valami.val=1). Nextion tárolja a dsbutton vagy a va_valami értékét addig, amíg nem írod felül. Mikor már nincs szükség rá, visszaíratod a változó értékét. (Mondjuk a programban a lekérdezés közvetlen visszaírod alapra).

 

nextion 0.7.0 vagy 0.9.0 könyvtárral így megy pld:

dualstate button-al:

 

uint32_t uzemmod;  

NexDSButton bt_uzemmod = NexDSButton(0, 1, "bt_uzemmod");

 

void setup(void)
{

 nexInit();

}

void loop(void)
{

bt_uzemmod.getValue(&uzemmod);  //kiolvasod az értéket

iif (uzemmod == 1) { 

 .....

}

bt_uzemmod.setValue(0);  //visszaírod az értéket alapra

}

 

Szépséghiba, hogy a kiolvasáshoz, visszaíráshoz az adott lapon kell lenned a nextion-on. (bár elméletben a global változókkal, ha minden lapon letárolod, akkor mennie kell).

Előzmény: Sploc (2652)
titusz99 Creative Commons License 2017.01.01 0 0 2655

Szia!

 

Mintaként 10 db dallast kötöttem egy nano-ra. Eredeti 3m-es árnyékolatlan kábelével.

A nano-n 8 db onewire buszt hoztam létre. Így 6-ra 1-1, 2-re 2-2 dallas, került.

Kb. 1000-ből 1 esetben olvasott félre.

Én másodpercenként 1* olvasom ki őket, majd indítom a mérést. Amíg mérnek csinálhatok mást.

1 dallas kiolvasása kb 13 ms ideig tart.

Árnyékolást egyik végén, célszerűleg arduino oldalon.

A felhúzó ellenállás csökkentésével némileg csökkenthető a zavar hatása.

Mindenesetre a programban fel kell készülni a zavarokra.

 

Soros portnak van buffere. Annak csökkentésével szoktam több ram-ot adni a programnak.

Alapértelmezetten 64 byte.

 

Nextion-om egyenlőre nincs, de tudomásom szerint:

Ha megyomod a gombot, akkor üzenetet küld arduinonak. Amit feldolgoz arduino.

Esetedben relé meghúz vagy elenged. Ha nem így megy akkor valami logikai bukfenc vagy túlcsordulás áll fenn.

 

B.U.É.K!

Előzmény: Sploc (2652)

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