-
PROHARDVER!
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
Pubszon
veterán
-
Pubszon
veterán
Üdv.
Van egy shift register modulom, konkrétan ez.Az alábbi probléma van vele.
HIGH-ra hibátlanul kapcsol, viszont LOW-ra mindig hibásan.
Az utolsó kettőt mindig egyszerre kapcsolja, de van hogy másik kettőt is egyszerre kapcsol LOW-ra.
VIDEO ITT.Kód:
const int SHCP_pin = 12;
const int STCP_pin = 11;
const int DS_pin = 10;
const int shiftoutput = 7;
boolean registers[8];
void setup()
{
pinMode(DS_pin, OUTPUT);
pinMode(STCP_pin, OUTPUT);
pinMode(SHCP_pin, OUTPUT);
}
void loop()
{
delay(1000);
for (int i = shiftoutput; i >= 0; i--)
{
registers[i] = LOW;
writereg();
delay(500);
}
delay(1000);
for (int i = shiftoutput; i >= 0; i--)
{
registers[i] = HIGH;
writereg();
delay(500);
}
}
void writereg()
{
digitalWrite(STCP_pin, LOW);
for (int i = shiftoutput; i >= 0; i--)
{
digitalWrite(SHCP_pin, LOW);
digitalWrite(DS_pin, registers[i] );
digitalWrite(SHCP_pin, HIGH);
}
digitalWrite(STCP_pin, HIGH);
}Mi lehet a hiba? Vagy hardveres?
-
Pubszon
veterán
válasz
Gergosz2 #1780 üzenetére
Most kipróbáltam, hogy 50 méter (25 oda, 25 vissza )UPT kábelen mi történik az 5V-os jellel.
25 méterre vezettem el egy gombot.
Szépen visszajött ahogy kell, 10KOhm-os felhúzó ellenállást használva.
Össze hasonlítom még analóg bemeneten is, hogy mennyit esik a fesz a 20cm-es dupon kábelhez képest.
Csak érdekességképpen írtam le. -
Pubszon
veterán
-
Pubszon
veterán
válasz
Hyperion #1707 üzenetére
Nem, csak 5V helyett 3.3V-ot adok az RTC modulnak, azóta hibátlanul megy.
Meg kicsit magyarítottam a demon.
2015 Oktober 05. Hetfo 16:16:41
2015 Oktober 05. Hetfo 16:16:42
2015 Oktober 05. Hetfo 16:16:43
2015 Oktober 05. Hetfo 16:16:44
2015 Oktober 05. Hetfo 16:16:45
2015 Oktober 05. Hetfo 16:16:46
2015 Oktober 05. Hetfo 16:16:47
2015 Oktober 05. Hetfo 16:16:48 -
Pubszon
veterán
válasz
dave0825 #1703 üzenetére
Ez szerintem nem jó hozzá, nekem DS1302 van.
MOD: Az RTC tápját 5V-ról átkötöttem 3.3V-ra és azóta jó!
Itt is írták, hogy valami zajt szedhet össze mert nincs felhúzóellenálás vagy ilyesmi. -
Pubszon
veterán
Üdv.
DS1302-es RTC modult beüzemeltem, de folyton ezt kapom vissza:
05.10.2015 -- 14:12:21
01.44.2005 -- 05:04:08
05.10.2015 -- 14:12:23
01.44.2005 -- 05:04:09
05.10.2015 -- 14:12:25
01.44.2005 -- 05:04:09
05.10.2015 -- 14:12:27
01.44.2005 -- 05:04:10
05.10.2015 -- 14:12:29Minden második sor a pontos idő.
Valami ötlet? -
Pubszon
veterán
válasz
nagyharcos #1674 üzenetére
A rotary encoderhez nem kell library, az lényegében 3 gombként működik.
Én csináltam egy ilyen menüt, amivel relét kapcsolgattam és különböző változókat változtattam, mondjuk ledek fényerejét, hőmérsékletet néztem meg stb.Ezt fejlesztettem tovább:
int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
void setup() {
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);
Serial.begin (9600);
}
void loop() {
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
} else {
encoder0Pos++;
}
Serial.print (encoder0Pos);
Serial.print ("/");
}
encoder0PinALast = n;
}(#1677) tvamos: Aida64-hez akartam külső kijelzőt, de inkább feladom.
-
Pubszon
veterán
Ha a géptől kap az arduino két bájtot, pontosan 0xFE és 0x37, arra szeretnék válaszolni egy bájtal (0x09), az hogy oldható meg legegyszerűbben?
-
Pubszon
veterán
Shift regiszterrel hogy a legegyszerűbb kapcsolni csak 1-1 kimenetet?
Mondjuk van 3db 74HC595, azaz 24 kimenet, de például csak a 12-es kimenetet akarom változtatni, a többit pedig változatlanul hagyni. -
Pubszon
veterán
válasz
DougButabi #1592 üzenetére
Én is így fogom megcsinálni a tesóm házát (10x10m), UTP-t akarok használni, max a tápot 2 érpáron vezetem, remélem elég lesz. Mondjuk az analog szenzorok nem lesznek messze az arduinotól, inkább csak a kapcsolók, de oda elég 3V is ha jut.
Esetleg 1-2 központos helyen használhatsz buck convertert. hogy kisebb távra kelljen vinni a tápot.
Sajnos az RS485-ös megoldásban nincs jártasságom. -
Pubszon
veterán
Szia.
Ez a modul jó az arduinóhoz?
Ha jól gondolom, az egyik 6-os láb csoport a bemenet, a másikkal pedig sorba lehet kötni a következő modult?
Illetve a 3*8-as tüskesor pedig a kimenet(Signal, GND, VCC)? -
Pubszon
veterán
Üdv.
Megjött az ESP8266-os wifi modulom, viszont nem tudok vele boldogulni.
Összekötöttem (remélem jól), de bármilyen kód is van az arduinon, a wifi az egy AP-ként működik, még csatlakozni is tudok hozzá.
Mit csináljak, hogy tudjon csatlakozni a routerhez, hogy aztán kapcsolatba tudjak léni vele neten keresztül? -
Pubszon
veterán
Üdv.
Az ESP8266-os WiFi modullal van tapasztalatotok?
Mobiltelefonnan interneten keresztül szeretnék pár egyszerü parancsot kiküldeni az arduinonak, mint pl. egy boolean legyen igaz.
Ezzel a felállással meg lehet oldani? Illetve a mobil oldalra is kellene majd egy program.
Köszi. -
Pubszon
veterán
Üdv.
Kellene egy RTC modul, melyiket ajánljátok?
A lehető legegyszerűbbet keresem.
Ezzel van tapasztalat? -
Pubszon
veterán
Üdv.
Van olyan DHT11 library ami tizedes Celsius fokot is tud?
A jelenlegim csak egész. Persze ez nem gond, csak mutatósabb a tizedes.
Közbe megjött a 1602-es I2C-s kijelzőm, már be is üzemeltem. -
Pubszon
veterán
Ha van például 5 változóm (false vagy true, illetve HIGH vagy LOW), akkor hogy tudom azt megoldani, hogy ha ebből bármely 3 teljesül akkor csináljon valamit?
-
Pubszon
veterán
válasz
Hyperion #561 üzenetére
Ugyan ez a rossz is amit linkeltél, ezeket nem lehet égetni?
USB kábel jó, eddig nem volt gond vele, tuti nem az a baja.
Másik gépen nem próbáltam, de a többi jó ezen a gépen.
Ez a hiba ha írnám:
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x01
Kipróbálom apám notiján, de szerintem az sem lesz jó... -
Pubszon
veterán
válasz
Hyperion #549 üzenetére
Van itthon másik NANO, akkor azzal helyreállítom (vagyis megpróbálom).
Mindig ezt a hibát kapom.
Arduino: 1.6.0 (Windows 7), Board: "Arduino Uno"
avrdude: usbdev_open(): did not find any USB device "usb"
Error while burning bootloader.This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences. -
-
Pubszon
veterán
Úgy néz ki, hogy az UNO meg adta magát, valamit véletlenül összezárhattam.
Gépre kötve a PC látja, de induláskor csak az ON és az L led világít, ha írni akarok rá akkor a TX felvillan, de hibát dob.
Valami ötlet esetleg? -
Pubszon
veterán
A másik hozzád szólót kiegészítve, én eBay-ről rendeltem 2db NANO-t és egy UNO-t, mind hibátlanul teszi a dolgát, első osztályú minőséggel, filléres áron.
Ezt a NANO-t vettem, 2db-ot.
Az UNO pedig ilyen, de már nem tudom visszanézni hogy kitől. Mind a 3 DCcEle márkájú.
Mindhez kaptam kábelt is.Én amiket vettem hozzá:
Jumper kábel (female-female és male-female-t is)
Dugdosós próbapanel (breadboard)Tactile gombok
Potméter
LED-ek
Sok ellenállás
Ezek voltak a fontosabbak, de még ezeket vettem:
Csavarterminált (NANO, UNO)
Stepper driver
Különböző szenzorok (fény, hang, mozgás, eső, mágnes)
RF adó-vevő
Relé modulDe még van sok minden, nekem is benne van már 10-15 ezer forintba.
-
Pubszon
veterán
PWM-el vezérelhető potméter van arduinóhoz?
Egy triakot akarok szoftverből vezérelni, most poti van rajta. -
Pubszon
veterán
Van olyan IDE ami folyamatábrás?
A könnyebb átláthatóság miatt.happy555: Most jutott eszembe amit korábban mondtál, egy progi sosincs kész...
A kapunyitóm már számolja a nyitás/zárást is, menti az EEPROM-ba, sípol is, meg lassan már boltba is el fog menni magától.A TavIR 60 napos tanfolyamján most a speakert vettük, de nekem csak egyszerű sípolás kell, azt pedig PWM vezérléssel oldottam meg, így a delay nem fogja meg a programot.
analogWrite(Speaker, 128); a hangjából ítélve, a PC is ugyan így vezérli. -
Pubszon
veterán
válasz
Hyperion #516 üzenetére
Értem, köszi, akkor jól gondoltam.
Kezdetnek ez jó lesz, erre már rá is van integrálva.
A TavIR féle 60 nap alatt arduinoban most itt járok, de majd bepótolom ha megjön.Mi ez az új spoiler gomb? Csak tesztelem. -
Pubszon
veterán
I2C interfészt mely kijelzőkhöz tudom használni?
Könnyebb vele dolgozni vagy csak annyi az előnye, hogy elég neki 2 I/O? -
Pubszon
veterán
válasz
adatfalo #509 üzenetére
Én így néztem meg hogy mik vannak, persze nem minden van itt ami a világon, de elég sok, sok mindenre nem is gondoltam.
-
Pubszon
veterán
válasz
happy555 #490 üzenetére
Köszi a kódot.
A asm volatile (" jmp 0"); parancs a szoftveres reset? -ezt kipróbálom még ma- Mert akkor inkább ezt használom és egy bemenetet nem kell felhasználom meg kábelezni sem kell.
Ha pedig a jelenleginél maradok, akkor egy 1KOhm-os ellenállást beiktatok, de jelenleg megy rendesen. -
Pubszon
veterán
A túlcsordulás megelőzése érdekében csináltam, hogy ha több mint 30 napja megy és a legközelebbi szabad pillanatába lereseteli önmagát. A belső 32bites számláló majdnem 50 napig képes számlálni, emiatt 19 nap alatt csak lesz egy szabad pillanat.
Ezt így oldottam meg:// Reset 30 nap futas utan
if ((vegallasZarva == LOW) && (digitalRead(lampaPin) == HIGH) && (day > 29))
{
digitalWrite(ResetPin, LOW);
}Tehát hogy ha be van zárva a kapu és a lámpa sincs felkapcsolva, illetve több mint 29 napja fut (azaz legalább 30), akkor a reset pint LOW-ra teszi. A reset és a D12 közvetlen össze van kötve, a setupba pedig a D12 HIGH-ra van állítva.
Mivel majd holnap rakom össze a hardvert (a kapunyitóét), emiatt ezt nem tudtam kipróbálni, hanem most ezzel gyakorlok meg vele együtt a soros kommunikációt is.
int led = 13;//pin 13 as OUTPUT LED pin
int resetPin = 12;
int ledState = digitalRead(led);
unsigned long sec;
// the setup routine runs once when you press reset:
void setup() {
digitalWrite(resetPin, HIGH);
digitalWrite(led, LOW);
delay(200);
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
pinMode(resetPin, OUTPUT);
Serial.begin(115200);//initialize Serial Port
Serial.println("");
Serial.println("Start");//print reset to know the program has been reset and
//the setup function happened
delay(500);
}
// the loop routine runs over and over again forever:
void loop() {
sec = millis() / 1000; // Masodperc
Serial.println("LOOP Start");
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
ledState = digitalRead(led);
Serial.print("LED Statusz: ");
Serial.println(ledState);
sec = millis() / 1000; // Masodperc
Serial.print(sec);
Serial.println(" masodperc telt el indulas ota...");
delay(1000); // wait for a second
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
Serial.print("LED Statusz: ");
ledState = digitalRead(led);
Serial.println(ledState);
sec = millis() / 1000; // Masodperc
Serial.print(sec);
Serial.println(" masodperc telt el indulas ota...");
delay(1000); // wait for a second
if (sec>20)
{
Serial.println("Reset most...");
delay(10);
digitalWrite(resetPin, LOW);
Serial.println("HIBA! Reset nem mukodik...");
}
//this never happens because Arduino resets
} -
Pubszon
veterán
Ez így jó szerintetek?
A program elején:
unsigned long sec;
unsigned int minute;
unsigned int hour;
byte day;A loopban pedig:
sec = millis()/1000;
minute = sec/60;
hour = minute/60;
day = hour/24;Ezzel könnyen tudok egy 30 naponkénti resetet és egyéb időhöz tartozó dolgot csinálni.
-
Pubszon
veterán
De ez egy végleges projekt, breadboardal és UNO-val csináltam, most pedig a NANO-t ültetem a próbanyákba, de a NANO kivehető lesz.
A breadboard kicsit drága ahhoz meg nincs is olyan kontakt mint a forrasztás.
Saját nyákot lenne jó csinálni, de nincs meg hozzá ami kell sajnos. -
Pubszon
veterán
Megjött egy másik Arduinom, egy Nano, ami lesz a kapunyitó vezérlője és meglepődve láttam, hogy komolyabb mint az Uno a plusz 2 analóg bemenetével.
Közbe elkezdtem csinálni a nyákot is amibe bele fog menni, már az is megvan 70%-ban. -
Pubszon
veterán
válasz
happy555 #446 üzenetére
Az aktuátorba van egy kör alaku mágnes, mellette egy reed relé.
És ahogy forog, egyfolytában nyit/zár. Ez gyárilag van benne, mert ha valamit oda zár vagy nagyon erőlködik, akkor a gyári tápegysége lekapcsolja és 3 másodperc után lehet újra elindítani.
A pulseIn parancs nem jó, mert olyan mint a delay, addig nem tudok mást csinálni vele, amíg le nem jár a beállított idő.
Viszont rátaláltam erre, de ez meg csak egyszer fut le, de annyiszor meg le kell, és utána nem nézi folyamatosan tovább.
Meg az utóbbit nem is tudtam igazából használni, csak soros monitoron néztem.
Ha nincs rá megoldás, akkor az van, hogy egy másik arduino panelt erre kell felhasználni.Neked van erre valami ötleted?
-
Pubszon
veterán
A pulseIn paranccsal barátkozok, minden oké is, de az a baj, hogy lebénítja arra az időre a működést amíg várja a pulzust.
Nem lehet úgy megoldani, hogy közbe mást is tudjon csinálni? -
Pubszon
veterán
Köszi srácok, holnap kipróbálom ezt a verziót!
Sokat kerestem de mégsem találtam meg. -
Pubszon
veterán
Ezt a kódot honnan tudom megszerezni?
-
Pubszon
veterán
Mai kérdésem.
Feltételnek hogy kell azt beállítani, hogy pl a ledPin, HIGH? -
Pubszon
veterán
válasz
happy555 #432 üzenetére
Így volt először, csak az egyszerűség kedvéért csináltam time-ot belőle.
Viszont továbbmentem és a késleltetés idejét egy változóval helyettesítettem, amit egy potival állítok, így a világítás idejét 1-5 percig tudom állítani, csak az a baj, hogy nem lineáris.Most pedig ráállok az RPM számlálós témára, mert az aktuátorba meg van minden ami ehhez kell.
Ez is jó dolog, mert ha esetleg valami miatt megszorulna a kapu, akkor inkább állítsa le, mintsem leégjen valami.
Ha ehhez van valami tipped, ötleted, szívesen várom. -
Pubszon
veterán
Na, de ezt is megcsináltam!
A nem releváns ciklusokat és részeket nem rakom ide bele, csak ami érintett.unsigned long lejarat;
unsigned long time;
void setup()
void loop()
time = millis();
if ((value != RFnyitas) && (value != RFzaras) && (nyitoGomb == LOW) && (zaroGomb == LOW)) // Tetlen allapot
{
value = mySwitch.getReceivedValue();
digitalWrite(iranyPin1, HIGH);
digitalWrite(iranyPin2, HIGH);
digitalWrite(jelzoPin, HIGH);
if (value == lampaON)
{
lejarat = time+2500;
digitalWrite(lampaPin, LOW);
}
if ((value == lampaOFF) || (time>lejarat))
{
digitalWrite(lampaPin, HIGH);
}
if(((millis()/500) & 1) == T) //tizedmásodperces ütemezés
{
T=!T;
digitalWrite(ledPin, T);
}
}Nekem itt kb annyit segítetek mint amennyi egyéb infót a neten is találok.
Lehet fárasztó vagyok nektek, ezt nézzétek el nekem.
Köszi. -
Pubszon
veterán
válasz
JozsBiker #427 üzenetére
Ha jól értem akkor kell egy jelenlegi idő(time) és egy késleltetési idő(lejarat).
És akkor tudom azt csinálni, hogy ha loopon belül megvizsgálom a time értékét (mondjuk 1.000.000ms) és a késleltetést mondjuk (5.000ms) akkor az addig fogja csinálni, amíg a time<lejárat+time lesz avagy 1.005.000 lesz a time.
Ezt értem is, de még azt nem tudom, hogy mit hol nézzek és hogy melyik paranccsal. -
Pubszon
veterán
Köszi srácok, utána nézek akkor a millis() parancsnak, hogy értelmezzem.
Lassan, de tanulom.(#421) happy555: Kipróbálom. A void setup() elé pedig beírtam, hogy long lejarat = 0;
else if (value == lampaON)
{
{
value = mySwitch.getReceivedValue();
digitalWrite(lampaPin, LOW);
unsigned long lejarat=millis()+15000;
}
while(millis()<lejarat);
digitalWrite(lampaPin, HIGH);
}Mint korábban írtam, van benne felesleges dolog.
Így jó lesz szerinted? 15 másodpercig fog világítani ha jó értelmezem, aztán magától lekapcsol.(#420) tvamos: A TavIR ingyenes tanfolyamát elkezdtem, bár még csak a 3. leckénél tartok.
Még kezdő vagyok, az if, do és a while parancsokat használom leginkább. -
Pubszon
veterán
Azt hogy tudom megcsinálni, hogy az if ciklus addig fusson míg egy feltétel nem teljesül (ez tiszta) vagy mondjuk 15 másodperc? Tehát az idő a lényeg.
Ehhez ha jól tudom kell egy óra modul? Ha ige, akkor jó egy DS1302 chipes? -
Pubszon
veterán
válasz
happy555 #406 üzenetére
Hát igen, még lesz 2 szabadon felhasználható gomb, nem tudom mi lesz velük, de valami biztos.
Amúgy az RCSwitch-el sikerült.
Nélkületek tuti nem jött volna össze.
Ez a projekt lassan kész, de találok ki másikat.
Mondjuk a kapuba nem az UNO-t fogom berakni, hanem úton van 2db NANO.Na de lenne még két részben ide tartozó kérdésem.
1. Az RF receiverre milyen antennát rakjak, mert jelenleg pár méter a hatósugara antenna nélkül.
Gondolom a bal alsó sarokba lehet forrasztani.2. Szilárdtest relével egyenáramot is lehet megszakítani ha azon csak váltóáram van feltüntetve?
Például. -
Pubszon
veterán
Na végül sikerült megcsinálnom, 2 gombot már be is programoztam, van benne pár felesleges parancs, de már csak finomitanom kell rajta.
-
Pubszon
veterán
Meg van a 4 gomb 6 számjegyű kódja.
Egyelőre 2 gombot akarok használni, ami lényegében ugyan azt a funkciót töltené be, mint 2 pillanatkapcsoló.
Az egyik kód lenne a nyitoGomb a másik pedig a zaroGomb.Hogy tudom megoldani?
-
Pubszon
veterán
válasz
happy555 #394 üzenetére
Igen, ennek minden gombját szépen mutatta a serial monitor.
Sőt, még ennek a központi zár távirányítónak a jelét is fogta, de lehet ez ugrókódos. -
Pubszon
veterán
Igen, de ahhoz van 2db 315MHz-es távirányítóm is, az jó lesz máshova, viszont van az arduinohoz 433MHz-es receiver 2db meg 2 transmitter is. Ahhoz lenne ez a távirányító.
Remélem jó lesz hozzá, mivel ez 4 gombos, így egyéb funkciókat is tudok beprogramozni a nyitás/záráson kívül (elektromos kapunyitó). -
Pubszon
veterán
Jah, azt hittem valami komoly ok miatt, de kidobni nem fogom.
Rendeltem egy ilyet, remélem jó lesz.
Szerinted? -
Pubszon
veterán
válasz
happy555 #383 üzenetére
Akkor átállok 433-ra, ahhoz 4 gombos távirányító is van 5-600Ft-ért, amivel ahogy korábban mondtad egyéb funkciók is megoldhatóak.
Gyakorolni meg van mivel addig helyette.Direkt vártam pár percet szerkesztési időben, hogy hátha látjátok, de akkor nem mondtam újat.
Az én kocsim távja jelét nem fogja, de a faterét igen, ami utólag lett beszerelve.
Nem tudom hogy ugró kódos e.(#385) tvamos: Nem fogom, de miért nem ajánlott?
-
Pubszon
veterán
válasz
happy555 #363 üzenetére
Most én is módosítottam, nyitás vagy záráskor bármely gombot ha megnyomom akkor megáll, vár 1000ms-ot és csak utána lehet adni neki a következő parancsot.
A végálláskapcsolókat is módosítottam, folyamatosan HIGH állapotba vannak, mikor benyomódnak akkor lépnek LOW-ba. Ezt a biztonságért, hogy ha szakadás van, inkább ne induljon el, minthogy valami leégjen.Viszont megjött az RF vevő amit a fórumtárs küldött, ráadásul 2 vevő és 2 transzmitter!
Ezennel is köszönöm, amint tudom meghálálom.Na de egyelőre csak a vevőt használnám, ahhoz hol találom meg a megfelelő könyvtárat és leírást?
2 gombos távirányítót használnék. -
Pubszon
veterán
válasz
happy555 #361 üzenetére
Rosszul fejeztem ki magam, de így biztosan fogod érteni.
Viszont jól átalakítottam a kódot és most pillanatkapcsolóval menne, amivel még egyszerűbb az egész.
Most úgy van, hogy pl nyitás közben ha megnyomom a zárás gombot, akkor csak megáll, ha pedig megint megnyomom, akkor meg bezár, és ez fordítva is igaz. Ez jelenleg csak pillanatkapcsolóval működik, de ez a resetelős megoldás amúgy sem jó.kagzer fórumtárs küldött tegnap egy RF vevőt, remélem holnap megkapom és akkor lesz az igazi!
-
Pubszon
veterán
válasz
happy555 #359 üzenetére
Ez is jó, bele is tettem a programba, ami most tökéletesen működik.
Viszont azt már most látom, hogy nem lesz könnyű megcsinálni az RF vevővel ha meg jön.
Most azzal kísérletezgetek, hogy hogy kell egy pillanatkapcsolóból billenőkapcsolót csinálni.
Itt van hozzá egy kód, ami működik is ahogy kell, de már ez is elég bonyolult, főleg hogy még rakjam is bele a kapunyitó programba, meg még az RF vevőt is bele kell.Jó lenne, ha ezek meglennének könyvtárként.
-
Pubszon
veterán
Na és össze van állítva próbára, működik ahogy elgondoltam!
Itt a kód, tippeket várok.
const int buttonPin1 = 2; // Kapu nyitas gomb, a vevo egyik releje
const int buttonPin2 = 3; // Kapu zaras gomb, a vevo masik releje
const int iranyPin1 = 4; // Kapu nyitas-zaras, elso rele valtokapcsolo 1. rele
const int iranyPin2 = 5; // Kapu nyitas-zaras, masodik rele valtokapcsolo 2. rele
const int jelzoPin = 6; // Jelzofeny nyitas/zaras ideje alatt 3. rele
const int resetPin = 7; // Vevo reset hogy a relek NO-ba alljanak 4. rele
const int ACvPin = 8; // Motor 230V lekapcsolasa 5. kulonallo rele
const int vegallasPin1 = 9; // Vegallaskapcsolo-nyitva
const int vegallasPin2 = 10; // Vegallaskapcsolo-zarva /Magnes erzekelo/
const int ledPin = 13; // Allapotjelzo LED, folyamatosan vilagit muvelet kozben
// valtozni fognak:
int nyitoGomb = 0; // Valtozik a gomb allapota alapjan
int zaroGomb = 0; // Valtozik a gomb allapota alapjan
int vegallasNyitva = 0; // Valtozik a vegallaskapcsolo allapota alapjan
int vegallasZarva = 0; // Valtozik a vegallaskapcsolo allapota alapjan
void setup() {
// Ki-bemenetkent:
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(vegallasPin1, INPUT);
pinMode(vegallasPin2, INPUT);
pinMode(iranyPin1, OUTPUT);
pinMode(iranyPin2, OUTPUT);
pinMode(jelzoPin, OUTPUT);
pinMode(ACvPin, OUTPUT);
pinMode(resetPin, OUTPUT);
pinMode(ledPin, OUTPUT);
}
void loop()
{
nyitoGomb = digitalRead(buttonPin1);
zaroGomb = digitalRead(buttonPin2);
vegallasNyitva = digitalRead(vegallasPin1);
vegallasZarva = digitalRead(vegallasPin2);
digitalRead(buttonPin1);
digitalRead(buttonPin2);
digitalRead(vegallasPin1);
digitalRead(vegallasPin2);
if ((nyitoGomb == HIGH) && (zaroGomb == LOW) && (vegallasNyitva == LOW)) // Nyitas
{
digitalWrite(jelzoPin, LOW);
digitalWrite(ledPin, HIGH);
digitalWrite(iranyPin1, HIGH); //+
digitalWrite(iranyPin2, LOW); //-
delay(300);
digitalWrite(ACvPin, LOW);
}
else if ((nyitoGomb == HIGH) && (zaroGomb == LOW) && (vegallasNyitva == HIGH)) // Nyitva
{
delay(11); //Ha kinyilik, mennyit toljon meg, hogy feszes legyen
digitalWrite(jelzoPin, HIGH);
digitalWrite(ACvPin, HIGH);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalRead(nyitoGomb);
digitalRead(zaroGomb);
break;
}
while((nyitoGomb==HIGH) || (zaroGomb==HIGH));
delay(400);
digitalWrite(resetPin, LOW);
}
else if ((nyitoGomb == LOW) && (zaroGomb == HIGH) && (vegallasZarva == LOW)) // Zaras
{
digitalWrite(jelzoPin, LOW);
digitalWrite(ledPin, HIGH);
digitalWrite(iranyPin1, LOW); //+
digitalWrite(iranyPin2, HIGH); //-
delay(300);
digitalWrite(ACvPin, LOW);
}
else if ((nyitoGomb == LOW) && (zaroGomb == HIGH) && (vegallasZarva == HIGH)) // Zarva
{
delay(11); //Ha bezarul, mennyit toljon meg, hogy feszes legyen
digitalWrite(jelzoPin, HIGH);
digitalWrite(ACvPin, HIGH);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalRead(nyitoGomb);
digitalRead(zaroGomb);
break;
}
while((nyitoGomb==HIGH) || (zaroGomb==HIGH));
delay(400);
digitalWrite(resetPin, LOW);
}
else if ((nyitoGomb == LOW) && (zaroGomb == LOW)) // Mind 2 gomb kikapcsolva a taviranyiton, alap statusz
{
digitalWrite(iranyPin1, HIGH);
digitalWrite(iranyPin2, HIGH);
digitalWrite(ACvPin, HIGH);
digitalWrite(jelzoPin, HIGH);
digitalWrite(resetPin, HIGH);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalRead(nyitoGomb);
digitalRead(zaroGomb);
break;
}
while((nyitoGomb==LOW) && (zaroGomb==LOW));
}
else
{
digitalWrite(iranyPin1, HIGH);
digitalWrite(iranyPin2, HIGH);
digitalWrite(jelzoPin, HIGH);
digitalWrite(ACvPin, HIGH);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
digitalRead(nyitoGomb);
digitalRead(zaroGomb);
break;
}
while((nyitoGomb==LOW) && (zaroGomb==LOW));
delay(200);
digitalWrite(resetPin, HIGH);
}
} -
Pubszon
veterán
válasz
happy555 #349 üzenetére
A 4-es relé modulból használnék 2-t irányváltásra, egyet a villogónak ami 12V-ról megy és egyet a 230V lekapcsolására.
Nekem így egyszerű, nem akarom megbonyolítani tranyóval meg ilyesmivel.Ez nem nagyon tiszta:
A relé modul amit linkeltél az 1x záró 1x bontó érintkezős, vagyis tudsz vele váltani a két irány közt.
Az irányváltáshoz nem kell legalább 2 relé? -
-
Pubszon
veterán
válasz
happy555 #345 üzenetére
Na, javítgattam, de míg nincs itt az arduino addig nem tudom tesztelni, ezért kérem véleményezd és mond mit a hiba.
const int buttonPin1 = 2; // Kapu nyitas gomb, a vevo egyik releje
const int buttonPin2 = 3; // Kapu zaras gomb, a vevo masik releje
const int iranyPin1 = 4; // Kapu nyitas-zaras, elso rele valtokapcsolo 1. rele
const int iranyPin2 = 5; // Kapu nyitas-zaras, masodik rele valtokapcsolo 2. rele
const int jelzoPin = 6; // Jelzofeny nyitas/zaras ideje alatt 3. rele
const int resetPin = 7; // Vevo reset hogy a relek NO-ba alljanak 4. rele
const int ACvPin = 8; // Motor 230V lekapcsolasa 5. kulonallo rele
const int vegallasPin1 = 9; // Vegallaskapcsolo-nyitva
const int vegallasPin2 = 10; // Vegallaskapcsolo-zarva /Magnes erzekelo/
const int ledPin = 13; // Allapotjelzo LED, folyamatosan vilagit muvelet kozben
// valtozni fognak:
int nyitoGomb = 0; // Valtozik a gomb allapota alapjan
int zaroGomb = 0; // Valtozik a gomb allapota alapjan
int vegallasNyitva = 0; // Valtozik a vegallaskapcsolo allapota alapjan
int vegallasZarva = 0; // Valtozik a vegallaskapcsolo allapota alapjan
void setup() {
// Ki-bemenetkent:
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(vegallasPin1, INPUT);
pinMode(vegallasPin2, INPUT);
pinMode(iranyPin1, OUTPUT);
pinMode(iranyPin2, OUTPUT);
pinMode(jelzoPin, OUTPUT);
pinMode(ACvPin, OUTPUT);
pinMode(resetPin, OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(jelzoPin, HIGH);
delay(2000);
digitalWrite(jelzoPin, LOW);
Serial.begin(9600);
}
void loop()
{
nyitoGomb = digitalRead(buttonPin1);
zaroGomb = digitalRead(buttonPin2);
vegallasNyitva = digitalRead(vegallasPin1);
vegallasZarva = digitalRead(vegallasPin2);
if (digitalRead(nyitoGomb) == HIGH && digitalRead(zaroGomb) == LOW && digitalRead(vegallasNyitva) == LOW) // Nyitas
{
digitalWrite(jelzoPin, HIGH);
digitalWrite(ledPin, HIGH);
digitalWrite(iranyPin1, HIGH); //+
digitalWrite(iranyPin2, LOW); //-
delay(500);
digitalWrite(ACvPin, HIGH);
}
else if (digitalRead(nyitoGomb) == HIGH && digitalRead(zaroGomb) == LOW && digitalRead(vegallasNyitva) == HIGH) // Nyitva
{
delay(196);
digitalWrite(jelzoPin, LOW);
digitalWrite(ACvPin, LOW);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
while(digitalRead(nyitoGomb)==HIGH || digitalRead(zaroGomb)==HIGH);
delay(200);
digitalWrite(resetPin, HIGH);
}
else if (digitalRead(nyitoGomb) == LOW && digitalRead(zaroGomb) == HIGH && digitalRead(vegallasNyitva) == LOW) // Zaras
{
digitalWrite(jelzoPin, HIGH);
digitalWrite(ledPin, HIGH);
digitalWrite(iranyPin1, LOW); //+
digitalWrite(iranyPin2, HIGH); //-
delay(500);
digitalWrite(ACvPin, HIGH);
}
else if (digitalRead(nyitoGomb) == LOW && digitalRead(zaroGomb) == HIGH && digitalRead(vegallasNyitva) == HIGH) // Zarva
{
delay(374);
digitalWrite(jelzoPin, LOW);
digitalWrite(ACvPin, LOW);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
while(digitalRead(nyitoGomb)==HIGH || digitalRead(zaroGomb)==HIGH);
delay(200);
digitalWrite(resetPin, HIGH);
}
else if (digitalRead(nyitoGomb) == LOW && digitalRead(zaroGomb) == LOW) // Mind 2 gomb kikapcsolva a taviranyiton, alap statusz
{
digitalWrite(iranyPin1, LOW);
digitalWrite(iranyPin2, LOW);
digitalWrite(ACvPin, LOW);
digitalWrite(jelzoPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
while(digitalRead(nyitoGomb)==LOW && digitalRead(zaroGomb)==LOW);
}
else
{
digitalWrite(jelzoPin, LOW);
digitalWrite(ACvPin, LOW);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
while(digitalRead(nyitoGomb)==HIGH || digitalRead(zaroGomb)==HIGH);
delay(200);
digitalWrite(resetPin, HIGH);
}
} -
Pubszon
veterán
válasz
happy555 #339 üzenetére
A cél az, hogy addig villogjon (persze nem ilyen gyorsan) amíg mind a kettő LOW nem lesz.
De így sem jó... while(digitalRead(nyitoGomb)==LOW && digitalRead(zaroGomb)==LOW);
Mert így 4 variáció van
LOW HIGH
HIGH LOW
HIGH HIGH
LOW LOWAzt kellene rögzíteni, hogy a LOW LOW állás true, minden más pedig false, és akkor azt megadni, hogy addig villogjon míg false, ha pedig true akkor lépjen tovább.
De ha jól értem, akkor ez a || jel azt jelenti, hogy vagy az előtte vagy az utána lévő parancs teljesül akkor lép tovább?
-
Pubszon
veterán
válasz
happy555 #339 üzenetére
A cél az, hogy addig villogjon (persze nem ilyen gyorsan) amíg mind a kettő LOW.
Így jó? while(digitalRead(nyitoGomb)==LOW && digitalRead(zaroGomb)==LOW);De ha jól értem, akkor ez a || jel azt jelenti, hogy vagy az előtte vagy az utána lévő parancs teljesül akkor lép tovább?
-
Pubszon
veterán
válasz
happy555 #337 üzenetére
Jó reggelt!
Az int lowlow = (nyitoGomb == LOW && zaroGomb == LOW) == true;
sor korábban nem volt benne, csak az este írtam bele és a while(lowlow == false); és a while(lowlow == true); sorok helyett is a while(nyitoGomb == HIGH && zaroGomb == LOW) == true; sor volt, mondjuk szerintem ez sem jó, de a program hibát nem dobott rá.Akkor például az utolsó ciklust te így csinálnád meg?
{
digitalWrite(jelzoPin, LOW);
digitalWrite(ACvPin, LOW);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
while(digitalRead(nyitoGomb)==LOW || digitalRead(zaroGomb)==LOW);
delay(200);
digitalWrite(resetPin, HIGH);
} -
Pubszon
veterán
válasz
happy555 #335 üzenetére
Igen, azt szeretném, hogy a delay-ek egyszer fussanak le és ha bármi van egyből tudjon reagálni.
Na de inkább beírom ide az egészet, hogy így jó e.
Nagyjából meg van a leírás is hogy mi mi.
A resetPin az RF vevőt áramtalanítja, hogy a relék visszaálljanak alap állapotba. Ez addig lesz így, míg nem jön meg a másik. Mert ez csak self-lock, tehát egy gombnyomás akkor úgy is marad a relé. Az meg nekem nem jó, mert rövid áramszünet után kinyílna a kapu, meg ne legyen behúzva a relé, csak ha kell./*
Az aramkor:
* Gombok a +5V es a pin 2, 3, 9 es 10 koze.
* 10K ellenallas a pin 2, 3, 9, 10-re a GND-rol kulon-kulon.
* Megjegyzes: A legtobb Arduinon mar van egy integralt LED a pin 13-ra kotve.
A 4 csatornas rele panelen az 1. es 2. rele bemenetet ossze kell kotni a valtokapcsolas miatt.
Rele bekotese:
Rele 1: NC +30V DC motor fele, NO GND motor fele, COM +30V DC a tap felol.
Rele 2: NC GND motor fele, NO +30V DC motor fele, COM GND a tap felol.
Rele 3: NC 230V AC a DC tap fele, COM 230V AC a halozati arambol.
Rele 4: NC +12V DC a 2 csatornas tavvezerlo fele, COM +12V DC a tap felol.
*/
const int buttonPin1 = 2; // Kapu nyitas gomb, a vevo egyik releje
const int buttonPin2 = 3; // Kapu zaras gomb, a vevo masik releje
const int iranyPin1 = 4; // Kapu nyitas-zaras, elso rele valtokapcsolo 1. rele
const int iranyPin2 = 5; // Kapu nyitas-zaras, masodik rele valtokapcsolo 2. rele
const int jelzoPin = 6; // Jelzofeny nyitas/zaras ideje alatt 3. rele
const int resetPin = 7; // Vevo reset hogy a relek NO-ba alljanak 4. rele
const int ACvPin = 8; // Motor 230V lekapcsolasa 5. kulonallo rele
const int vegallasPin1 = 9; // Vegallaskapcsolo-nyitva
const int vegallasPin2 = 10; // Vegallaskapcsolo-zarva /Magnes erzekelo/
const int ledPin = 13; // Allapotjelzo LED, folyamatosan vilagit muvelet kozben
// valtozni fognak:
int nyitoGomb = 0; // Valtozik a gomb allapota alapjan
int zaroGomb = 0; // Valtozik a gomb allapota alapjan
int vegallasNyitva = 0; // Valtozik a vegallaskapcsolo allapota alapjan
int vegallasZarva = 0; // Valtozik a vegallaskapcsolo allapota alapjan
void setup() {
// Ki-bemenetkent:
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(iranyPin1, OUTPUT);
pinMode(iranyPin2, OUTPUT);
pinMode(jelzoPin, OUTPUT);
pinMode(ACvPin, OUTPUT);
pinMode(resetPin, OUTPUT);
pinMode(vegallasPin1, INPUT);
pinMode(vegallasPin2, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ACvPin, LOW);
digitalWrite(iranyPin1, LOW);
digitalWrite(iranyPin2, LOW);
digitalWrite(jelzoPin, HIGH);
delay(2000);
digitalWrite(jelzoPin, LOW);
Serial.begin(9600);
}
void loop()
{
nyitoGomb = digitalRead(buttonPin1);
zaroGomb = digitalRead(buttonPin2);
vegallasNyitva = digitalRead(vegallasPin1);
vegallasZarva = digitalRead(vegallasPin2);
int lowlow = (nyitoGomb == LOW && zaroGomb == LOW) == true;
if (nyitoGomb == HIGH && zaroGomb == LOW && vegallasNyitva == LOW) // Nyitas
{
digitalWrite(jelzoPin, HIGH);
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(iranyPin1, HIGH); //+
delay(250);
digitalWrite(iranyPin2, LOW); //-
delay(500);
digitalWrite(ACvPin, HIGH);
}
else if (nyitoGomb == HIGH && zaroGomb == LOW && vegallasNyitva == HIGH) // Nyitva
{
delay(196);
digitalWrite(jelzoPin, LOW);
digitalWrite(ACvPin, LOW);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
while(lowlow == false);
delay(200);
digitalWrite(resetPin, HIGH);
}
else if (nyitoGomb == LOW && zaroGomb == HIGH && vegallasZarva == LOW) // Zaras
{
digitalWrite(jelzoPin, HIGH);
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(iranyPin1, LOW); //-
delay(250);
digitalWrite(iranyPin2, HIGH); //+
delay(500);
digitalWrite(ACvPin, HIGH);
}
else if (nyitoGomb == LOW && zaroGomb == HIGH && vegallasNyitva == HIGH) // Zarva
{
delay(374);
digitalWrite(jelzoPin, LOW);
digitalWrite(ACvPin, LOW);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
while(lowlow == false);
delay(200);
digitalWrite(resetPin, HIGH);
}
else if (nyitoGomb == LOW && zaroGomb == LOW) // Mind 2 gomb kikapcsolva a taviranyiton, alap statusz
{
do
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
while(lowlow == true);
}
else
{
digitalWrite(jelzoPin, LOW);
digitalWrite(ACvPin, LOW);
digitalWrite(resetPin, LOW);
do
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(100);
}
while(lowlow == false);
delay(200);
digitalWrite(resetPin, HIGH);
}
} -
Pubszon
veterán
válasz
happy555 #331 üzenetére
Tehát ha a feltételek adottak és lefutnak a parancsok, akkor utána nem futtatja többször csak figyeli a feltételeket amíg valamelyik meg nem változik?
Mert ha így van akkor az a legjobb nekem.Én azt hittem hogy újra és újra lefut és gondoltam hogy ha pont az első delay alatt változik meg az egyik feltétel akkor megvárja míg végigfut és csak utána lép a következő ciklusra, de az már nem lenne jó mert akkor a kapu még több mint egy másodpercet erőlködne.
(#332) Danex: Köszi neked is, szerintem akkor én is többre tudok majd jutni ha itt lesznek a cuccok, addig meg csak fejbe futtatom le.
Ez meg még bonyolult. -
Pubszon
veterán
válasz
happy555 #329 üzenetére
Át fogok akkor állni, ideiglenesen jó lesz, jó a 433MHz-eshez is egyaránt.
Viszont mivel nagyon kezdő vagyok, ezért van egy kérdésem amire nem találok választ.
Ha van egy if ciklus amiben vannak parancsok, de én azt szeretném, hogy bizonyos parancsok csak egyszer fussanak le ha a feltételek megfelelnek, illetve megint csak pár fusson addig amíg a feltétel is megengedi, akkor azt hogy kell csinálni?
Itt a példám:
Azt szeretném, hogy ha a 3 feltétel is megfelel, akkor fusson le az összes parancs egyszer, de csak az utolsó digitalWrite(ACvPin, HIGH); fusson újra és újra amíg a feltételek engedik.
Mert ha jól gondolom, így ha az egyik feltétel megvoltozik, akkor lehet akár 1400ms múlva lép a következő ciklusra.if (Gomb1 == HIGH && Gomb2 == LOW && Gomb3 == LOW)
{
digitalWrite(jelzoPin, HIGH);
delay(500);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(iranyPin1, HIGH);
delay(200);
digitalWrite(iranyPin2, LOW);
delay(500);
digitalWrite(ACvPin, HIGH);
}Bocs ha hülyeséget kérdek, pár hete kezdtem utána olvasgatni.
Új hozzászólás Aktív témák
Hirdetés
- 2db Dell PowerEdge R740 2U Rack Szerver és 3db Netapp FAS2040 NAS
- BESZÁMÍTÁS! MSI B450 TomaHawk R5 3600 16GB DDR4 512GB SSD RX5500 XT 8GB Rampage SHIVA TT 530W
- 125 - Lenovo Legion Pro 5 (16ARX8) - AMD Ryzen 9 7945HX, RTX 4070
- Samsung Odyssey G6 S27BG650EU - 27" QHD 2K 240Hz Ivelt - Gaming monitor - 1,5 év Gyári garancia
- Samsung Galaxy A23 5G 128GB, Kártyafüggetlen, 1 Év Garanciával
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged