Hirdetés

2024. április 28., vasárnap

Gyorskeresés

Téma összefoglaló

Téma összefoglaló

  • Utoljára frissítve: 2023-03-11 00:46:52

LOGOUT.hu

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.

Összefoglaló kinyitása ▼

Hozzászólások

(#1801) tvamos válasza Flashback (#1796) üzenetére


tvamos
nagyúr

Én inkább feltennék mégegy Arduino-t, mondjuk egy minit. Vagy csak egy mega328-at... Akkor nem kell az ellenállás háló, a kommunikáció mehet i2c-n, spi-n, asincron serial, vagy akármi.

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#1802) Flashback


Flashback
addikt

Köszönöm mindkettőtöknek! :R

Bocs nincs hosszú ö, ü és néha az á is ä :)

(#1803) Pubszon


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?

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1804) zka67 válasza Pubszon (#1803) üzenetére


zka67
őstag

Szia, próbáld meg így:

void setup()
{
pinMode(DS_pin, OUTPUT);
pinMode(STCP_pin, OUTPUT);
pinMode(SHCP_pin, OUTPUT);
digitalWrite(STCP_pin, LOW);
digitalWrite(SHCP_pin, LOW);
}

...

void writereg()
{
digitalWrite(STCP_pin, LOW);
digitalWrite(SHCP_pin, LOW);
for (int i = shiftoutput; i >= 0; i--)
{
digitalWrite(DS_pin, registers[i] );
digitalWrite(SHCP_pin, HIGH);
digitalWrite(SHCP_pin, LOW);
}
digitalWrite(STCP_pin, HIGH);
digitalWrite(STCP_pin, LOW);
}

(#1805) Pubszon válasza zka67 (#1804) üzenetére


Pubszon
veterán

Megpróbálom, köszi, de szerintem hardveres a gond.
Most csináltam egy ilyen modult, azzal hibátlan, úgyhogy szerintem hardveres a gond.

Mennem kell vissza dolgozni, de majd kipróbálom. :R

MOD: Amit én csináltam, azzal jó a kódod, a gyári panellal pedig este próbálom ki!

[ Szerkesztve ]

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1806) Pubszon válasza zka67 (#1804) üzenetére


Pubszon
veterán

Megnéztem.
A kódod jó, de a modul továbbra sem az igazi. :(

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1807) zka67 válasza Pubszon (#1806) üzenetére


zka67
őstag

Szia, nincs valahol zárlat?

(#1808) Pubszon válasza zka67 (#1807) üzenetére


Pubszon
veterán

Gyári panel, nem vettem észre hogy lenne, szerintem nincs, mert a LED-ek felkapcsolása mindig hibátlan mint a videón is látszik.
Csak a lekapcsolás a hibás.
Amit én dobtam össze, az hibátlan. :F

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1809) Saua


Saua
tag

Sziasztok,

Ezt a kódot sikerült összeeszkábálni, nyomógombbal és telefonról is lehet kapcsolgatni a LED –et, és a telefonon megjelenik a LED aktuális állapota.
/*
LED attached from pin 12 to ground
pushbutton attached to pin 5 from +5V
10K resistor attached to pin 5 from ground
*/
#include <SoftwareSerial.h>

int bluetoothTx = 2; // TX-O pin of bluetooth mate, Arduino D2
int bluetoothRx = 3; // RX-I pin of bluetooth mate, Arduino D3

int led = 12;
int button = 5;

int dataFromBt;

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

// változókat hozunk létre:
int ledState = LOW; // kimeneti pin aktuális állapota
int buttonState; // bemeneti pin aktuális állapota
int lastButtonState = LOW; // bemeneti pin előző értéke

long lastDebounceTime = 0;
long debounceDelay = 50;

void setup()
{
Serial.begin(9600); // Begin the serial monitor at 9600bps

bluetooth.begin(115200); // The Bluetooth Mate defaults to 115200bps
bluetooth.print("$"); // Print three times individually
bluetooth.print("$");
bluetooth.print("$"); // Enter command mode
delay(100); // Short delay, wait for the Mate to send back CMD
bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity
// 115200 can be too fast at times for NewSoftSerial to relay the data reliably
bluetooth.begin(9600); // Start bluetooth serial at 9600
pinMode(led, OUTPUT);
pinMode(button, INPUT);
digitalWrite(led, ledState);
}

void loop()
{

if(bluetooth.available()) // If the bluetooth sent any characters
{
dataFromBt = bluetooth.read();

if(dataFromBt == '1'){
digitalWrite(led, HIGH);
ledState = HIGH;

}
if(dataFromBt == '0'){
digitalWrite(led, LOW);
ledState = LOW;

}
if(dataFromBt == '3'){
bluetooth.print(ledState);
}

}

int reading = digitalRead(button);

if (reading != lastButtonState) {
lastDebounceTime = millis();
}

if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;

if (buttonState == HIGH) {
ledState = !ledState;
digitalWrite(led, ledState);
}

}

}

lastButtonState = reading;
}

Ezt szeretném módosítani, hogy négy LED –et lehessen kapcsolgatni.

Főleg a LED aktuális állapotának a lekérdezésével van a gond (most a telefon 100 miliszekundomonként küldi a 3-as karaktert és visszakapja a 1 vagy 0 karaktert)…nem tudom hogyan küldhetne a többi LED más-más karaktert az állapotokról, mert az állapotuk csak LOW vagy HIGH lehet.

(#1810) Danex


Danex
addikt

Autóriasztót és így indításgátlót terveznék csinálni az autóba, szerintetek miket kéne belepakolni?

Én eddig IR mozgásérzékelőt, döntés érzékelőt és egy titkos ;] megoldást a gyújtás relé kapcsolásához.

(#1811) Saua válasza Danex (#1810) üzenetére


Saua
tag

A mozgásérzékelőnek nem lenne jobb egy ultrahangos érzékelő ? Szerintem mindenképp tudjon küldeni SMS -t ha esemény van.

(#1812) Danex válasza Saua (#1811) üzenetére


Danex
addikt

Ami a sofőr ülésére lenne irányítva? :F Az infrás pontatlan/megbízhatatlan lenne?

Meg a távirányítós részt nem építenék bele, hisz a mostani autók gyengéje is ez, hogy a távvezérlőt le tudják olvasni. Szóval a bel térből gondoltam az aktiválást/deaktiválást.

Gondoltam arra, hogy nyitástól számítva 10-15s lenne az ameddig van idő a riasztót kikapcsolni, mielőtt megszólalnának a kűrtök. Ehhez lehet kéne egy rtc modul.

GSM modulra én is gondoltam, majd keresek még hozzá.

(#1813) Pubszon


Pubszon
veterán

Még mindig a shift regiszterrel (továbbiakban SR) bajlódok.
Van 2 projektem az asztalon és a következőt vettem észre:
Az egyik amiben van a SR az vezérel 2 LED-et, egy aktív buzzert és 4 relét.
A másik pedig egy kapunyitó elektronika.
Mind a kettő jó működik, nincsenek egy elektromos körben.
Amikor a kapunyitó 24V-os reléi kapcsolnak, akkor random a másik projekt SR kimenetén össze vissza kapcsolgatja a ledeket, reléket és a buzzert a SR.
A SR építésénél nem használtam sem ellenállást, sem pedig kondenzátort.
Ami biztosnak tűnik, azaz, hogy az USB kábelt ha kihúzom az arduinobol ami a SR-es arduino-t köti össze a géppel, akkor nincs ilyen probléma. (Mint ha egy nagy antenna lenne :F )
Ebből arra gondolok, hogy valami nagyfrekvenciás zajt szedhet össze az USB kábelen.
Hogy tudom én ezt megszüntetni?
Remélem érthetően fogalmaztam. :B

[ Szerkesztve ]

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1814) maestro87


maestro87
őstag

Sziasztok!
Kicsit off leszek.
Ilyen léptetőmotor meghajtó modulból nincs véletlen valakinek elvétve kettő? Ebay-re nem tudok most várni. :( Természetesen felárat fizetnék értük.

[ Szerkesztve ]

(#1815) gyapo11 válasza Danex (#1812) üzenetére


gyapo11
őstag

A távirányító elég könnyen törhetetlenné tehető, OTP-vel. Nem, nem a bankkal. :)
Fogni kell egy pro minit, egy nagyobb flasht, és teletölteni véletlenszámokkal, ugyanezt az autóba is, és szép sorban használni a byte-okat. Ha zavarják a vételt, akkor a vevő a kapott kódot keresi előrefelé x db-ig, mondjuk 10-ig. Mivel a számok között _semmi_ összefüggés nincs, nem lehet kiszámolni a következőt meg egyáltalán egyiket se. Annak a valószínűsége, hogy véletlenül eltalálja a következő 10 kód egyikét attól függ, milyen hosszú a kód. Ha mondjuk 2 byte, akkor már 1 a 65536-hoz, ha 3 byte, akkor 1 a 16 millióhoz.
Ha pedig nincs a következő 10 között a kapott kód, akkor 3-at kell beolvasni, és egymás mellett levő 3-at kell kapni.
A lehallgatást el lehet kerülni fénnyel, üvegen belül a vevő, kívülről meg rányomni az adót, azt scannelje le úgy, hogy nem veszem észre.
És ha már közel megyek, akkor az rfid is szóbajöhet, nem tudom autóüvegen át is működik-e.

menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

(#1816) JozsBiker válasza Saua (#1809) üzenetére


JozsBiker
aktív tag

Szia !

Azért nem értem a kérdésed, mert ha egy ilyen programot sikerült összehoznod ( amihez nyilván kellett a telefon oldali rész is, ami szintén nem annyira egyszerű ), akkor miért nem tudod könnyűszerrel átírni több LEDesre :-)
Első közelítésben az jutott eszembe, hogy az adatcsere legkisebb egysége a byte, aminek ugye 256 különböző állapota lehet, tehát bőven el lehet benne kódolni 4 LED állapotát.
Vagy ha mégsem, akkor egymás után küldözgetni. Van egy elválasztó karakter, pl. * , utána szépen sorban küldöd a 4 LED állapotát. Olvasáskor a * -ból tudod hol tartasz.

Épp nemrég fejeztem be egy "projektet", ami 64 db LED -det vezérel Androidról. Igaz, itt csak egyirányú a kommunikáció. Ennél úgy oldottam meg, hogy minden kigyújtásnál ill. oltásnál el van küldve a LED sorszáma, és egy + vagy - karakter attól függően hogy kigyújtani v. eloltani kell-e.

Tökre ugyanaz lett, mint ebben a videóban :

[link]

(#1817) tvamos válasza Pubszon (#1813) üzenetére


tvamos
nagyúr

Ha zavar a zaj, hasznalj tobb arduinot, es kosd ossze oket soros porton. Ha meg akkor is zavarodik, akkor nagyobb arammal kell meghajtani a soros kabelt. (Felhuzoellenallas....)

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#1818) Saua válasza JozsBiker (#1816) üzenetére


Saua
tag

Szia,

Az androidos rész az Appinventorral készült, a használata nagyon egyszerü, nem kell hozzá programozói tudás. Az arduinós kód pedig mint egy legó lett összerakva egy tipikus nyomógombos példaprogramból (először bekapcsolja, majd második megnyomásnál kikapcsolja a LED-et, pergésmentesítést is használ) meg egy LED ki-be kapcsolgató kódbol.
De ha már négy nyomógombrol plusz a telefonrol jövő karaterekrő van szó, gondolom már tömböt kellene használni....az meg már más tudásszint

[ Szerkesztve ]

(#1819) Pubszon válasza tvamos (#1817) üzenetére


Pubszon
veterán

A lényeg az, hogy ha a nanoba be van dugva egy USB kábel, akkor a relék kapcsolásakor a shift regiszter kimenete megváltozik.

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1820) tvamos válasza Pubszon (#1819) üzenetére


tvamos
nagyúr

Ezt én értem. Nekem is volt ilyen gondom régen. Én kidobtam az összes shift regisztett a retekbe. Elavult technológia.
Tegyél kisebb értékű felhúzó ellenállásokat! Az szerintem segíteni fog valamelyest. Ha ront a dolgon, akkor meg legalább tudjuk, hogy földlelési, vagy táp gondod van.

[ Szerkesztve ]

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#1821) Imy


Imy
veterán

Most ismerkedek az arduinóval, de nem akar összejönni a következő program részlet. A lényeg hogy a nyomógomboknak a 13-as kimenetet kellene működtetni,. Ha megnyomom bekapcsol, ha megnyomom még egyszer kikapcsol.
Vizsgálni akarom, ha be van kapcsolva akkor lehessen kikapcsolni... De nem megy. :(

#include "LiquidCrystal.h"
// A LiquidCrystal eljarast hasznaljuk

LiquidCrystal lcd(5, 4, 0, 1, 2, 3);
// Az LCD bekotese labak szerint:
// RS(D5), E(D4), D4(D0) ,D5(D1), D6(D2), D7(D3)

//PIN0 LCD D4
//PIN1 LCD D5
//PIN2 LCD D6
//PIN3 LCD D7
//PIN4 LCD E
//PIN5 LCD RS
int NYOMOGOMB = 6; //PIN6
//PIN7
//PIN8
//PIN9
//PIN10
//PIN11
//PIN12
int LED = 13;

void setup() {
lcd.begin(16, 2); //Az LCD 2 sor, 16 oszlopos
lcd.print("Nyomogomb:"); //
lcd.setCursor(10, 0); //
lcd.print("KI"); //

pinMode(NYOMOGOMB, INPUT); //PIN6 nyomogomb bemenet
pinMode(LED, OUTPUT); //PIN13 LED meghajtás

int KiAll_13; //13. kimenet állapotát figyeljük
KiAll_13 = 0; // alapértelmezés beállítása

digitalWrite((LED), LOW); //LED kikapcsolva alapértelmezettként
}

void loop()
{
nyomogomb_BE();
nyomogomb_KI();

}

void nyomogomb_BE()
{
if (digitalRead(NYOMOGOMB) == LOW)
delay(20); // prell elkerülése
{
if (digitalRead(NYOMOGOMB) == LOW)

{
digitalWrite((LED), HIGH);
int KiAll_13 = 1;
}
}
}

void nyomogomb_KI()
{
if (KiAll_13 == 1)
{
if (digitalRead(NYOMOGOMB) == LOW)
delay(20); // prell elkerülése
{
if (digitalRead(NYOMOGOMB) == LOW)
{
digitalWrite((LED), LOW);
int KiAll_13 = 2;
}
}
}
}

sketch_oct18a.ino: In function 'void nyomogomb_KI()':
sketch_oct18a:64: error: 'KiAll_13' was not declared in this scope
'KiAll_13' was not declared in this scope

(#1822) zka67 válasza Imy (#1821) üzenetére


zka67
őstag

Szia, így próbáld meg:

void loop() {
int curr, prev, state;

prev = 1;
state = 0;

while (1) {
curr = digitalRead(NYOMOGOMB);
if ((curr == 0) && (prev != 0)) {
state ^= 1;
digitalWrite(LED, state);
}
prev = curr;
delay(100);
}
}

(#1823) Imy válasza zka67 (#1822) üzenetére


Imy
veterán

Köszi, de le is írnád, hogy ez hogyan működik? Érteni is akarom, és tanulni is belőle. :R

(#1824) Saua válasza Imy (#1821) üzenetére


Saua
tag

Szia,

itt nagyon jó példaprogramokat lehet találni, magyarázatokkal.

(#1825) Pubszon válasza Imy (#1821) üzenetére


Pubszon
veterán

int KiAll_13; //13. kimenet állapotát figyeljük sort ne a setup részbe rakd!

[ Szerkesztve ]

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1826) gyapo11 válasza Imy (#1823) üzenetére


gyapo11
őstag

A while feltétele 1, ami igaz, vagyis örökké fog futni.
curr = digitalRead(NYOMOGOMB);
beírja a curr változóba a gomb állapotát.
if ((curr == 0) && (prev != 0)) {
Mivel prev=1, vagyis igaz, hogy nem 0, csak akkor igaz az if feltétele, ha curr=0. Vagyis amíg curr=1, addig nem történik változás, az if nem fut le,
prev = curr;
prevbe beírja a curr-t, vagyis 1-et, vár 100 msecet, és újra kezdi a while-t.

Egyszer megváltozik a gomb állapota, és a curr-ba 0 kerül. Ekkor az if feltétele már igaz lesz, mert curr=0 és prev nem 0.
state ^= 1;
A ^ jel a bitwise xor, vagyis 1-gyel xorolja a biteket, aminek következtében ami 0 volt az 1 lesz, ami 1 volt az 0 lesz. A state eddig 0 volt, vagyis most 1 lesz.
digitalWrite(LED, state);
Vagyis a LED pinbe 1-et ír, a led világítani kezd.
prev = curr;
A prevbe 0 kerül, innen már tudjuk, hogy az if nem fog lefutni, mert a prev nem 0 feltétel nem teljesül, egészen addig, amíg a nyomógomb állapota ismét nem változik és válik 1-gyé.
delay(100);
Ez a pergésmentesítés miatt kell, hogy a nyomógomb lenyomásakor és felengedésekor létrejövő többtucat ki-be kapcsolást figyelmen kívül hagyjuk. Csak az első változást dolgozzuk föl, utána várunk 100 msecet, addig ezek a parazita kapcsolások megszűnnek.

[ Szerkesztve ]

menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

(#1827) zka67 válasza Imy (#1823) üzenetére


zka67
őstag

Szia, a működése: a prev változó tárolja a nyomógomb előző állapotát, a state a kimenet aktuális állapotát.
Utána egy végtelen ciklusban beolvassa a curr változóba a nyomógomb aktuális állapotát, majd megnézi, hogy a nyomógomb most le van-e nyomva és az előző állapotban nem volt-e lenyomva, azaz most került-e lenyomásra. Ha igen, megváltoztatja a kimenet állapotát és kiírja azt a portra. A végén minden esetben átkerül az előző állapotba a nyomógomb aktuális állapota, és vár 100ms-et a nyomógomb prell elkerülésére.

NYOMÓGOMB ___ _________ _____ ______
\____/ \/\______/ \_/

LED ______________ _______
___/ \______________/

MINTAVÉTEL | | | | | | | | | | | | | | |

Szerk: lásd gyapo11 válaszát is :)

[ Szerkesztve ]

(#1828) gyapo11 válasza zka67 (#1827) üzenetére


gyapo11
őstag

Szinte egyszerre írtuk. :)
Aztán rájöttem, hogy nem is annyira érthető, az enyém mert hosszú, a tiéd mert rövid.
Vagyis folyamatábra lenne a leginkább követhető.

menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

(#1829) tvamos válasza gyapo11 (#1826) üzenetére


tvamos
nagyúr

Ezt utálom az Arduinoban, nincs ide, meg debug. Ha lenne, akkor lerakna pár breakpointot, és megérthetné magától. Igy csak gányolni tanulnak meg az emberkek, nem programozni. Tisztelet a kivételnek. Mondju... Ő legalább megkérdezte, hogy működik...

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#1830) tvamos válasza Imy (#1823) üzenetére


tvamos
nagyúr

Sokat tanulhatsz belőle, ha a File meu, Example-jeit átnézed.

"Mindig a rossz győz, és a jó elnyeri méltó büntetését." Voga János

(#1831) Imy válasza zka67 (#1822) üzenetére


Imy
veterán

Erről mi a véleményetek? Magam találtam ki, és működik. Valami hiba esetleg? Jobban szeretem én kitalálni, s szívni vele. persze segítség sosem árt. ;)

De ez nagyon az eleje a végleges programnak.

#include "LiquidCrystal.h"
// A LiquidCrystal eljarast hasznaljuk

LiquidCrystal lcd(5, 4, 0, 1, 2, 3);
// Az LCD bekotese labak szerint:
// RS(D5), E(D4), D4(D0) ,D5(D1), D6(D2), D7(D3)

//PIN0 LCD D4
//PIN1 LCD D5
//PIN2 LCD D6
//PIN3 LCD D7
//PIN4 LCD E
//PIN5 LCD RS
int NYOMOGOMB = 6; //PIN6
//PIN7
//PIN8
//PIN9
//PIN10
//PIN11
//PIN12
int LED = 13;

void setup() {
lcd.begin(16, 2); //Az LCD 2 sor, 16 oszlopos
lcd.print("Nyomogomb:"); //
lcd.setCursor(10, 0); //
lcd.print("KI"); // alapértelmezettként ki van kapcsolva

pinMode(NYOMOGOMB, INPUT); //PIN6 nyomogomb bemenet
pinMode(LED, OUTPUT); //PIN13 LED meghajtás

//int KiAll_13; //13. kimenet állapotát figyeljük
//KiAll_13 = 0; // alapértelmezés beállítása

digitalWrite((LED), LOW); //LED kikapcsolva alapértelmezettként
}

void loop()
{

// Ha LED ki van kapcsolva, akkor be lehet kapcsolni
if (digitalRead(LED) == LOW)
{
if (digitalRead(NYOMOGOMB) == LOW)
delay(20); // prell elkerülése
{
if (digitalRead(NYOMOGOMB) == LOW)
{
digitalWrite((LED), HIGH);
lcd.setCursor(10, 0); //
lcd.print("BE"); // Bekapcsolás kiírás
delay(1000);
}
}
}

// Ha LED be van kapcsolva, akkor ki lehet kapcsolni
if (digitalRead(LED) == HIGH)
{
if (digitalRead(NYOMOGOMB) == LOW)
delay(20); // prell elkerülése
{
if (digitalRead(NYOMOGOMB) == LOW)
{
digitalWrite((LED), LOW);
lcd.setCursor(10, 0); //
lcd.print("KI"); // Bekapcsolás kiírás
delay(1000);
}
}
}

}

(#1832) Imy


Imy
veterán

4 soros LCD-t tudtok ajánlani e-bayről ami jól működik? 2 sorosom van, de kevés lesz, sok információt szeretnék kiírni rá.

(#1833) Pubszon válasza Imy (#1832) üzenetére


Pubszon
veterán

Ez jó áron van és korrekt eladótól.
[link]
I2C-s, tehát csak 2 kimenetet igényel ráadásul.

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1834) Imy válasza Pubszon (#1833) üzenetére


Imy
veterán

:R

Az ISP-snél a kiírásra esetleg egy példát tudsz? És amúgy amit az eladó az oldalán ír, az a kód jó?

(#1835) Saua válasza Imy (#1831) üzenetére


Saua
tag

Szia,

Én is nagyon kezdő vagyok...de ez a kód valószínüleg nem működik rendesen, rengeteg késleltetés van benne....és ameddig egy-egy delay tart hiába nyomkodod a gombot nem történik semmi. Nem árt kész kódokat is tanulmányozni. Sokmindent már megoldottak, nehezen lehet tökéletesíteni.

[ Szerkesztve ]

(#1836) Imy válasza Imy (#1834) üzenetére


Imy
veterán

Most nézem, itt 2x16-os LCD-re van írva.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2); //set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("b2cqshop");
lcd.setCursor(0, 1);
lcd.print("Voltage: ");
lcd.setCursor(13, 1);
lcd.print("V");
}
void loop()
{
int val;
float temp;
val=analogRead(0);
temp=val/4.092;
val=(int)temp;//
lcd.setCursor(9, 1);
lcd.print(0x30+val/100,BYTE);
lcd.print(0x30+(val%100)/10,BYTE);
lcd.print('.');
lcd.print(0x30+val%10,BYTE);
delay(100);
}

Ha ezt a sort átírom, akkor elvileg tudja a 4x20-at?
LiquidCrystal_I2C lcd(0x27,20,4);

Kiírás hogyan megy ISP-nél, ugyanúgy mint a hagyományosnál? Pl...

lcd.begin(20, 4); //Az LCD 4 sor, 20 oszlopos
lcd.setCursor(3, 1); //
lcd.print("tESZT:"); //

(#1837) Imy válasza Saua (#1835) üzenetére


Imy
veterán

Az azért van, hogy ne lehessen túl gyakran ki, vagy bekapcsolni, vagy a véletlen megnyomás ellen.
Ez majd egy ki-bekapcsoló gombot fog működtetni, és nem kell azt tizedmásodpercenként ki-be kapcsolni. ;)

(#1838) Pubszon válasza Imy (#1834) üzenetére


Pubszon
veterán

Az ISP-s kiiratásos dolgot nem értem.
A kódot elnézve jó.
Szinte ugyan azok a parancsok, csak I2C-s könyvtár kell hozzá, de nekem is megvan.

A fenti kódodban pl az azonos sorokat összevonhatod.
Javitottam a loop részedet

void loop()
{
// Ha LED ki van kapcsolva, akkor be lehet kapcsolni
if (digitalRead(LED) == LOW)
{
delay(20); // prell elkerülése
digitalWrite((LED), HIGH);
lcd.setCursor(10, 0); //
lcd.print("BE"); // Bekapcsolás kiírás
delay(1000);
}
// Ha LED be van kapcsolva, akkor ki lehet kapcsolni
if (digitalRead(LED) == HIGH)
{
delay(20); // prell elkerülése
digitalWrite((LED), LOW);
lcd.setCursor(10, 0); //
lcd.print("KI"); // Bekapcsolás kiírás
delay(1000);
}
}

De ezzal továbbá ahogy már írták, a sok delay megfogja az egészet.
De ha használsz még egy bitet (boolean) akkor azzal kiküszöbölheted ezt és a kijelző se fog másodpercenként frissülni, hanem csak akkor amikor annak kell.
Így:
Az első sor a setup rész elé kell.
boolean ledstate = true;
.
.
.
.
void loop()
{
// Ha LED ki van kapcsolva, akkor be lehet kapcsolni
if ((digitalRead(LED) == LOW) && (ledstate))
{
ledstate = false;
delay(20); // prell elkerülése
digitalWrite((LED), HIGH);
lcd.setCursor(10, 0); //
lcd.print("BE"); // Bekapcsolás kiírás
}
// Ha LED be van kapcsolva, akkor ki lehet kapcsolni
if ((digitalRead(LED) == HIGH) && (!ledstate))
{
ledstate = true;
delay(20); // prell elkerülése
digitalWrite((LED), LOW);
lcd.setCursor(10, 0); //
lcd.print("KI"); // Bekapcsolás kiírás
}
}

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1839) zka67 válasza Pubszon (#1838) üzenetére


zka67
őstag

Szia, bocs, hogy beleszólok, de a programod folyamatosan kapcsolgatja a ledet ki-be.

(#1840) Imy válasza Pubszon (#1838) üzenetére


Imy
veterán

Köszönöm a nyomógombos tippet, ki fogom próbálni.

ISP-s könyvtárast meg tudnád osztani? Köszi! :R

Az csak annyi, hogy bemásolom a C:\Program Files (x86)\Arduino\libraries-ba?

[ Szerkesztve ]

(#1841) maestro87 válasza Pubszon (#1833) üzenetére


maestro87
őstag

Nem csak I2C modul jár hozzá? A leírásból és képről én azt veszem le, hogy rá is van forrasztva ez a modul. :((
A sima 20x4-est én legutóbb, legolcsóbban aliexpressről rendeltem valami 1500Ft-ért.

Mellesleg nem tud valaki olyan I2C modult amibe nincs beforrasztva a tüskesor? A múltkorival én eléggé megszenvedtem míg ki tudtam cserélni hüvelysorra.

(#1842) Pubszon válasza Pubszon (#1838) üzenetére


Pubszon
veterán

Az idő lejárt, de módosítottam a kódodat.

#include "LiquidCrystal.h"
// A LiquidCrystal eljarast hasznaljuk
LiquidCrystal lcd(5, 4, 0, 1, 2, 3);
// Az LCD bekotese labak szerint:
// RS(D5), E(D4), D4(D0) ,D5(D1), D6(D2), D7(D3)
//PIN0 LCD D4
//PIN1 LCD D5
//PIN2 LCD D6
//PIN3 LCD D7
//PIN4 LCD E
//PIN5 LCD RS
int NYOMOGOMB = 6; //PIN6
//PIN7
//PIN8
//PIN9
//PIN10
//PIN11
//PIN12
int LED = 13;
boolean ledstate = true;
void setup() {
lcd.begin(16, 2); //Az LCD 2 sor, 16 oszlopos
lcd.print("Nyomogomb:"); //
lcd.setCursor(10, 0); //
lcd.print("KI"); // alapértelmezettként ki van kapcsolva
pinMode(NYOMOGOMB, INPUT); //PIN6 nyomogomb bemenet
pinMode(LED, OUTPUT); //PIN13 LED meghajtás
//int KiAll_13; //13. kimenet állapotát figyeljük
//KiAll_13 = 0; // alapértelmezés beállítása
digitalWrite((LED), LOW); //LED kikapcsolva alapértelmezettként
}
void loop()
{
// Ha LED ki van kapcsolva, akkor be lehet kapcsolni
if ((digitalRead(LED) == LOW) && (digitalRead(NYOMOGOMB) == LOW) && (ledstate))
{
ledstate = false;
delay(20); // prell elkerülése
digitalWrite((LED), HIGH);
lcd.setCursor(10, 0); //
lcd.print("BE"); // Bekapcsolás kiírás
}
// Ha LED be van kapcsolva, akkor ki lehet kapcsolni
if ((digitalRead(LED) == HIGH) && (digitalRead(NYOMOGOMB) == LOW) && (ledstate))
{
ledstate = false;
delay(20); // prell elkerülése
digitalWrite((LED), LOW);
lcd.setCursor(10, 0); //
lcd.print("KI"); // Bekapcsolás kiírás
}
if ((digitalRead(NYOMOGOMB) == HIGH) && (!ledstate))
{
ledstate = true;
}
}

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1843) Pubszon válasza maestro87 (#1841) üzenetére


Pubszon
veterán

Rá is van forrasztva az I2C modul, azért is ennyi.
Nélküle olcsóbb.

LiquidCrystal_I2C

[ Szerkesztve ]

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1844) Nagytoll


Nagytoll
senior tag

Hello! Van egy TM1638-as chipre épülő led mátrixom, most gyakorlom a használatát. Hogy lehetne azt megoldani, hogy megy egy pont a mátrixon és közben gombokkal egy másik pontot tudok irányítani? A lényeg, hogy azonos időben ugyanolyan gyorsan bevegye az inputot, és az önjáró golyó is menjen normálisan. Az alapprogram megvan, csak a delay belassítja, utánaolvastam neten a millis() nevű dolognak, de nem nagyon értem/nem tudom, hogy rakhatnám bele a kódomba, ezen kívül van valami lehetőség ilyen "párhuzamos futtatás" szerűségre?

(#1845) Pubszon válasza Nagytoll (#1844) üzenetére


Pubszon
veterán

Néz meg a BlinkWithoutDelay példát, abból megtudhatod.
Ha nem megy, akkor holnap tudok segíteni, esetleg rakd be ide a kódodat.

ASRock X79 Extreme6, i7 4930K, 32GB DDR3, GTX 1080 G1, Corsair RM750x...

(#1846) Nagytoll válasza Pubszon (#1845) üzenetére


Nagytoll
senior tag

Ma tiszta fejjel elsőre sikerült feldolgoznom és megértenem a blinkwithoutdelay-t :) , így már úgy működik, ahogy szeretném. Köszi!

(#1847) Nagytoll


Nagytoll
senior tag

Hello! Megint van egy gondom/kérdésem. van ez a kód :
if ((gx==px) && (gy==py)) {
while(1) {
LED_Matrix.displayPic(picDat0);
if((digitalRead(10)==HIGH) || (digitalRead(11)==HIGH) || (digitalRead(12)==HIGH) || (digitalRead(13)==HIGH)) {
x = TrueRandom.random(0,8); //x,y -> P1
y = TrueRandom.random(0,8);
gx = TrueRandom.random(0,8); //gx, gy ->P3
gy = TrueRandom.random(0,8);
px = TrueRandom.random(0,8); //px, py ->P2
py = TrueRandom.random(0,8);
delay(1000);
LED_Matrix.clear();
break;
};
};
};

A lényeg az, hogy megy a mátrixon egy pötty(P1) balról jobbra az egyik sorban, van egy másik pötty(P2) random valahol és van egy harmadik pötty(P3) amit lehet irányítani, ha P1 nekimegy P3-nak akkor rendesen működik ez a kód, mármint egy ugyan ilyen, csak az if feltételében az van, hogy ((gx==x) && (gy==y)). Ha viszont P3 megy neki P1-nek (és ugyanígy P2-nek is, ez igazából a cél, P2 "megszerzése") akkor a program vár a delay szerint 1mp-et és magától újraindul/loop elejére megy. Amit normál esetben csinál(ha P1 megy neki P3-nak) az az, hogy csak akkor megy a loop elejére, ha megnyomom a gombot, aztán vár és break. Szerintetek ez miért van?

[ Szerkesztve ]

(#1848) Nagytoll válasza Nagytoll (#1847) üzenetére


Nagytoll
senior tag

Tárgytalan, rájöttem, csak kell neki egy delay, mert nélküle rögtön beolvasná a gombokat.

(#1849) gyapo11 válasza Nagytoll (#1846) üzenetére


gyapo11
őstag

A timer libraryvel elég könnyen lehet delay nélküli időzítéseket csinálni.

menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

(#1850) gyapo11 válasza gyapo11 (#1849) üzenetére


gyapo11
őstag

És még egy pár timer:
TimerOne, Timer1
SoftTimer

menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

Copyright © 2000-2024 PROHARDVER Informatikai Kft.