- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- Luck Dragon: Asszociációs játék. :)
- erkxt: A Roidmi becsődölt – és senki nem szól egy szót sem?
- Dr.Zoo blogja, avagy az élet nagy dolgai...
- sziku69: Fűzzük össze a szavakat :)
- droidic: YouTube videók és playlistek letöltése GUI-alkalmazással
- ldave: New Game Blitz - 2025
- Hold - SW Heritage - Auto üzemmód
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
-
LOGOUT
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
-
JozsBiker
aktív tag
válasz
Gergosz2 #19012 üzenetére
Szia Gergosz2 !
Küzdök mint disznó a jégen :-), szeretnék kérdezni a fenti programoddal kapcsolatban.
- Leírnád pár szóban hogy a beállítandó paraméterekkel mit hogyan állítok ? ( ADC_OFFSET, ADC_GAIN, RMS_GAIN )
- Az interrupt kezelő rész fontos bele ? Mit csinál tulajdonképpen ?
- Műszer által 2,33 A -nek írt terhelőáramnál a következőket írja:2.93
0.30
2.93
0.29
2.93
0.28
2.93
0.31
2.93
0.31
2.92
...Az utasításokból számomra nem derül ki miért van ez a váltakozás, gondolom a működésből következik, de nem bírok rájönni az okára.
Köszi.
-
Wolfram
aktív tag
ESP8266/wemos D1 mini-n találtam megint egy hibát:
USB töltőn keresztül adom neki a tápot, és egyszerűen nem indul el? Mi lehet a gond? A kábel hosszát próbáltam rövidíteni, de 50cm-esen sem indul el, csak akkor ha megnyomom rajta a reset gombot. -
olli
tag
Köszi, működik.
A következő lépés az áram és feszmérő szenzorok csatlakoztatása.
Jelenleg a glcd-re kiírja az adatokat, printeli serialra.
Sd kártyára is megírtam csv-be mentésre, együtt a printseriallal
hibázik.
Csökkenteni kellene a glcd-re kiírás, a serialprint, sd mentés számát, vagy elhagyni valamelyiket? -
Lyally
Legközelebb légyszi használd a kód beilleszthetése gombot vagy pastebin-t (vagy hasonlót).A select gomb nyomása ezt csinálja:
currentOffsetRead = 1; // to activate offset for current
voltageOffsetRead = 1; // to activate offset for voltage
powerOffsetRead = 1; // to activate offset for power
LCD.setCursor(0,0); /* set display words starting at upper left corner*/
LCD.print ("INITIALIZING..... ");
LCD.setCursor(0,1); /* set display words starting at lower left corner*/
LCD.print ("WAIT 5 SEC ..... ");Mi van, ha ezt a pár sort beteszed a setup-ba?
(Most nincs időm alaposabban megfejteni a kódot, hogy mit miért csinál.) -
look into serial monitor to add or minus the value manually and key in here.
Pontosan hogyan tudom módosítani az értéket?Ezt a megadott kódrészletből nem lehet látni, azt a részt nem másoltad be.
Érintő képernyő + mega 2560 lesz az alap hardwer, az érintőképernyő
gombjaival ki lehet váltani a fizikai gombokat?Ki lehet, persze, de sokkal egyszerűbb lenne fizikai gombokkal kiváltani az eredeti gombokat. Eredetileg a kód szerint egy analóg lábra vannak kötve a gombok, valószínűleg ellenálláslétra segítségével különbözteti meg, hogy melyik gomb van lenyomva. Ezt 5 egyforma ellenállás segítségével le tudod modellezni, ha szeretnéd, vagy lehet úgy módosítani a kódot, hogy 1db gombot rákötve a select gombot érzékelje.
megoldás egy pwm lábon kiadni a feszültség szinteket az A0 lábra?
Ez több okból sem lenne megoldás.
-
olli
tag
Sziasztok!
Energia mérőhöz az eredeti programban nyomógombos lcd szerepel, a gombokkal kalibrál. Az lcd az A0 lábon csatlakozik./* 0.1- Button Function */
int buttonRead;
buttonRead = analogRead (0); // Read analog pin A0. Pin A0 automatically assigned for LCD Display Button function (cannot be changed)
currentButtonMillis = millis();
if(currentButtonMillis - startButtonMillis >= 300)
{
//Right button is pressed
if (buttonRead < 60)
{
myGLCD.clrScr(); // Clear the screen (black)
myGLCD.setFont(BigFont);
myGLCD.setColor(0, 0, 255);
myGLCD.setBackColor(0, 0, 255);
myGLCD.print ("PRESS <SELECT> ",20,20);
myGLCD.print ("TO CALLIBRATE ",20,50);
}
// Up button is pressed
if (buttonRead < 200 && buttonRead > 60) // Press up button to go to upper page
{
page = page - 1 ;
if( page <=0)
{ page = 1;}
startButtonMillis = millis();
}
// Down button is pressed
if (buttonRead < 400 && buttonRead > 200) // Press down button to go to lower page
{
page = page + 1;
if (page >3)
{ page = 3;
}
startButtonMillis = millis();
}
// Left button is pressed
if (buttonRead < 600 && buttonRead >400)
{
myGLCD.clrScr(); // Clear the screen (black)
myGLCD.setFont(BigFont);
myGLCD.setColor(0, 0, 255);
myGLCD.setBackColor(0, 0, 255);
myGLCD.print ("PRESS <SELECT> ",20,20);
myGLCD.print ("TO CALLIBRATE ",20,50);
}
// Select button is pressed
if (buttonRead < 800 && buttonRead > 600)
{
currentOffsetRead = 1; // to activate offset for current
voltageOffsetRead = 1; // to activate offset for voltage
powerOffsetRead = 1; // to activate offset for power // set display words starting at upper left corner
myGLCD.print ("INITIALIZING..... ",20,120); // set display words starting at lower left corner
myGLCD.print ("WAIT 5 SEC ..... ",20,150);
}
}
A nyomógombos lcd hiányában kihagyható: // Offset will automatically callibrate when SELECT Button on the LCD Display Shield is pressed.
// If you do not have LCD Display Shield, look into serial monitor to add or minus the value manually and key in here.
Pontosan hogyan tudom módosítani az értéket?
Érintő képernyő + mega 2560 lesz az alap hardwer, az érintőképernyő
gombjaival ki lehet váltani a fizikai gombokat?
Pl. megoldás egy pwm lábon kiadni a feszültség szinteket az A0 lábra? -
Janos250
őstag
válasz
Wolfram #19036 üzenetére
OK. Én azért tekintettem fölötte lévőnek, mert http nélkül nincs websocket, és én eddig mindig a weblapra írásra használtam, miután itteni kollégák megtanítottak rá, hogy ezt jól lehet használni. :-)
Mivel a WiFi szerverre , és kliensre ül rá, közvetlenül azok is használhatók, de ahhoz nincsenek úgy készen a dolgok, mint a websockethoz.
Mellesleg, ha nem szakítod meg a kapcsolatot, a sima szerver is tud kérés nélkül küldeni. Most hirtelen nem jut eszembe, de valaki leírt egy konkrét esetet, ahol a szerver lesi a klienseket, és ha bármelyik ír, mindenkinek elküldi, hasonlóan az MQTT-hez. -
Janos250
őstag
válasz
tibi-d #19035 üzenetére
"a tableten állapot megjelenítést kellene létrehozni."
Ezért lenne előnyös a websocket, mert az közvetlenül a WEB lapra tud írni. Ha másodpercenként kellene újra felépíteni a kapcsolatot, az nem lenne előnyös. Van persze más is, ami nem szakítja meg a kapcsolatot, de ez a legegyszerűbb, vagy legalábbis legelterjedtebb.
Vagy esetleg AJAX, de inkább websocket.
A http fejlécében normál esetben ott van, hogy szakítsa meg a kapcsolatot. -
tibi-d
tag
válasz
Janos250 #19034 üzenetére
Hogy konkrétumokat is írjak. Egy berendezést vezérel az ESP32. A HMI kapcsolatot oldaná meg a tablet. Amíg a berendezés üzemel, addig az ESP és a tablet között a kapcsolatnak folyamatosan meg kéne lennie, hogy a tableten kiadott parancsot a készülék végre tudja hajtani. A berendezésen lévő folyamatról a tableten állapot megjelenítést kellene létrehozni. Az adat cserét legrosszabb esetben is másodpercenként meg kéne valósítani.
-
Janos250
őstag
válasz
tibi-d #19032 üzenetére
Az androidos telefon nekem a táskában van kikapcsolva, és csak ha GPS, vagy net kell, akkor veszem elő, ezért arról nem tudok nyilatkozni.
A TCP önmagában elég gyors, de ha minden egyes forgalmazás után megszakítod a kapcsolatot, és mindig újra építed, az lassú. Ezt csinálja a TCP-re épülő http.
Ezért raktak a http fölé még egy réteget, hogy ne szakítsa meg a kapcsolatot, hanem tartsa fenn. Ez a websocket.
UDP gyors, de nincs ellenőrzés, hogy megjött-e az adat, vagy valaki útközben lenyelte.
Ha simán felépíted a WiFi-re épülő kapcsolatot, és nem szakítod meg, hanem fájlként írsz rá, olvasol róla, bármelyik C, C++ file-kezelő utasítással, akkor az - nekem úgy tűnt - elég jó sebességű.
WEB lapra írásnál nyomtatható karakterek kellenek, tehát bináris adat egyszerű átvitelénél WEB lapra, akkor base64 kódolás kell, ami 3 bármilyen byte-ból csinál 4 nyomtathatót. A túloldalon meg vissza. -
tibi-d
tag
Szerintetek egy ESP32 és egy tablet közötti adatcserét melyik verzió támogatja jobban. Ha az ESP32-n létrehozott weblapon állítom be az adatokat, vagy egy android programban állítom be és átküldöm wifi-n. Az ESP-nek is kell küldeni adatot a tablet felé.
Köszi a tanácsokat. -
Ez a feladategyüttes vajon megoldható 2db wemossal?
#1: BT kapcsolat wemos#1-en ülő fülessel és telefonnal egyidőben
#2: ha jel jön a speaker jacken, akkor telóról szóló zene lenémít, jacken érkező (rádiós) kommunikáció totális kontrollt kap
#3: telós tartalmat wemos#2 továbbítja a rádió mikrofon jackje felé.miért nem veszem meg készen? 1: a rádióba dugós darabka nem kompatibilis a rádiómnal (nem fér el és máshogy van bekötve) 2: a kész cucc 90+£...
-
#79563158
törölt tag
Itthon lehet valahonnan Teensy 4.1-et szerezni? Nem baj, ha várni kell rá vagy elö kell rendelni, de a legtöbb helyen "majd-egyszer-lesz™" módban vannak.
-
Wolfram
aktív tag
-
JozsBiker
aktív tag
válasz
Gergosz2 #19017 üzenetére
Mármint minek az amplitudója ? A ZMCT elvileg 5 A -es, ami - gondolom - azt jelenti, hogy 5A -es áramnál fog a kimenetén 0 -ig ill. 5 V -ig érni a szinusz hullám.
Átírtam a változót, 0 Ampernél folyamatosan 0,88 -at ír, 2,4 A -es terhelésnél (hajszárító
) felváltva ír 0,6 -t és 1,5 -öt.
-
Gergosz2
veterán
válasz
JozsBiker #19015 üzenetére
Ahogy fentebb is írtam : Ez a kód most nullát fog mindenre visszaadni amígy ADC_GAIN -t nem állítod be.
Szinuszos áram mérésekor a ZMCT103C analóg kimenetén a bemenő jelalaknak megfelelő feszültség mérhető, aminek a nullátmenete kb. a fél tápfeszültségnél azaz 2,5 V -nál van. Az amplitudó arányos a mért áram amplitudójával ill. lehet változtatni a trimmerrel.
Ez tiszta sor, de mennyi az amplitúdó? 5A? Ha annyi akkor a
#define ADC_GAIN 0.0f
sort írd át erre :
#define ADC_GAIN 0.009765625000000f // 5/512
-
JozsBiker
aktív tag
-
Gergosz2
veterán
válasz
JozsBiker #18965 üzenetére
Na én valami ilyesmivel próbálkoznék. Boarodon nem próbáltam ki, csak gyorsan összedobtam. Amit bekéne állítani az a
ADC_GAIN
ésADC_OFFSET
, Utóbbit 512-re tippelem viszont látom, hogy a modulon van valami potméter is így tipper a gain az állítható.
Ez a kód most nullát fog mindenre visszaadni amígyADC_GAIN
-t nem állítod be.#include <Arduino.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define ADC_BUFFER_SIZE 20
#define ADC_PIN A0
#define ADC_OFFSET 512.0f
#define ADC_GAIN 0.0f // be kell állítani
#define RMS_GAIN 0.05f // delta_T/T
volatile uint8_t bufferIterator = 0;
volatile uint16_t ADC_BUFFER[ADC_BUFFER_SIZE];
uint16_t ADC_BUFFER_CALC[ADC_BUFFER_SIZE];
float RMS_Current;
void setup()
{
//Gergosz2 2023
Serial.begin(51200);
setupPWMInterrupt();
bufferIterator = 0;
memset(ADC_BUFFER, (uint16_t)0, ADC_BUFFER_SIZE*sizeof(uint16_t));
}
void loop()
{
if (0u == bufferIterator)
{
memcpy(ADC_BUFFER_CALC, ADC_BUFFER, ADC_BUFFER_SIZE*sizeof(uint16_t));
RMS_Current = 0.0f;
int iterator = 0;
for (iterator = 0; iterator < ADC_BUFFER_SIZE; iterator++)
{
float SI_val = (((float)ADC_BUFFER_CALC[iterator] - ADC_OFFSET)*ADC_GAIN);
RMS_Current = RMS_Current + SI_val*SI_val* RMS_GAIN;
}
RMS_Current = sqrt(RMS_Current);
Serial.println(RMS_Current);
}
}
void setupPWMInterrupt()
{
noInterrupts(); // disable all interrupts
TCCR2A = 0; // set entire TCCR2A register to 0
TCCR2B = 0; // same for TCCR2B
TCNT2 = 0; //initialize counter value to 0
// set compare match register for 1khz increments
OCR2A = 124; // = (16*10^6) / (2*1000*64) - 1 (must be <256)
TCCR2A |= (1 << WGM21); // turn on CTC mode
TCCR2B |= (1 << CS22); // Set CS01 and CS00 bits for 64 prescaler
sbi(TIMSK2, OCIE2A); // enable timer compare interrupt
interrupts(); // enable all interrupts
}
ISR(TIMER2_COMPA_vect)
{
ADC_BUFFER[bufferIterator] = analogRead(ADC_PIN);
bufferIterator ++;
if (bufferIterator > ( ADC_BUFFER_SIZE - 1u) ) bufferIterator = 0u;
} -
Janos250
őstag
válasz
JozsBiker #19009 üzenetére
Én nem vagyok villanyász, és nem is értek hozzá, de én már az elején elakadtam. Az elveknél!
Ha egy trafó primer árama megy keresztül a kütyün, és a szekunderen semmi nincs, akkor rohangál ott áram? De még mennyire! Teljesítmény? Nulla.
Elvi kérdés, hogy akkor milyen értéket akarunk kapni? Nullát, vagy nem nullát. Nem tudom, a lakatfogó ilyen esetben mit mér. Mert ha tisztán ohmikus a terhelés, akkor OK, de ez nem mindig van így. Pl. fúrógép. -
JozsBiker
aktív tag
válasz
razorbenke92 #19008 üzenetére
Köszi hogy foglalkoztok vele!
Én is azt találtam az RMS érték számításra amit a #19006 -ban írtál: négyzetösszegek képzése, osztás a minták számával aztán gyökvonás. Érdekes lenne tudni hogy a kézi mérőműszerek is így számolnak-e :-). Szerintem is a feldolgozással lesz gond, talán valami nüansznyi dologgal szivatom magam. Mindenképp megírom ha jutok valamire. -
Oké, csak ő most mégis ezt a kódot dobta be, hogy szeretné továbbgondolni, ebben akartam segíteni.
A korábban linkelt másik kód önmagában nem fog működni, csak ha kalibrálja. Abban van egy konstans és egy elsőfokú korrekció, idő alapon integrál (feltételezi, hogy két mérés között más idő telik el).Ha tiszta jelalaknál jól működik, akkor én nem gyanakodnék a nyers adatra, inkább az utófeldolgozás kétséges.
-
válasz
razorbenke92 #19006 üzenetére
Írta, hogy próbált másik módszert, és azzal sem volt jó. Személy szerint én kiíratnám a mért értékeket, és kézzel kiszámolnám, hogy egyáltalán jó-e az input.
-
A 10bit ADC az 5A méréshatárt 1024 részre osztja. Előjelesen 512-re. Az még 0,01A precizitás.
A gond egyértelműen a számolás menetével van. Ahogy korábban írtuk, a pillanatnyi csúcsok értékéből nem következik egyértelműen a folytonos áramfelvétel.
Itt vannak ezek a jelalakok. Egyértelműen belátható, hogy más más fogyasztás (és ezáltal folytonos áram) tartozik a piros-zöld-kék áramokhoz. A peak-to-peak mégis azonos mindnél, így a számolás ugyanazt fogja adni.
Azért írtam az RMS-t, mert az egy közelítő integrált fog adni a görbe alatti területekre (gyakolatilag kicsi hasábok területei lesznek, melyek magassága a pillanatnyi érték, szélessége a mintavételi idő.).
Kódban ez valahogy így nézne ki:
void Measure()
{
int mAmps=0;
uint32_t RMS=0; //ide jó sok nagy szám befuthat
int RMScount=0;
uint32_t start_time = millis();
int sensoValue;
while((millis()-start_time) < 200)
{
sensorValue = analogRead(CURRENT_SENSOR);
RMS+=sensorValue*sensorValue;
RMScount++;
}
RMS = RMS/RMScount;
RMS = sqrt(RMS);
RMS = RMS * tapasztalatitenyezo; //ha esetleg kéne, a szorzót meg lehet állapítani, talán lineáris is elég
}Egyébként ha akarsz rajta pontosítani, akkor érdemes tesztelgetni, hogy az ADC prescaler felgyorsításával javul e a pontosság. Ugyebár akkor a mérés maga pontatlanabb lesz, de a mérések mennyisége több lesz, így jobban közelíti a függvény alatti területet a pici téglalapok átlaga.
Szerk.: A csatolt kép lemaradt -
LustaDick123
tag
válasz
rita7107 #19003 üzenetére
Szia,
Kezdő vagyok én is a témában, csendes olvasója a topiknak. Én pár hónapja hasonló gondban voltam, mint te, annyi a különbség, hogy én elsősorban a gyerekeknek kerestem valami hasznos elfoglaltságot, ami relatíve gyors sikert jelent számukra és látványos.
Mivel nekem nem volt semmiféle eszközöm itthon így adta magát, hogy vásároljak valamiféle „kezdő szettet”, a választásom az Eleggo készlete lett: https://www.elegoo.com/products/elegoo-uno-most-complete-starter-kit
Ebben van egy csomó alaplecke, amivel megtanulható az egyes klasszikus szenzorok kezelése, idővel már kombinálhatóak egymással. A honlapról letölthető a CD-n adott manual is:
https://www.elegoo.com/blogs/arduino-projects/elegoo-uno-r3-project-the-most-complete-starter-kit-tutorial
Nyilván minden megvásárolható külön-külön is és van 1000 hasonló készlet a kínai webshopokban, kezdők számára teljesen jól használható egy ilyen készlet, talán így egyben olcsóbb is (európai amazonról rendelve pár nap alatt itt volt).
Ahogy a többiek is írták, ha elakadás van, akkor a Google a segítség, de sokat ötletet merítettünk az Arduino hivatalos oldaláról is: https://projecthub.arduino.cc/ -
-
JozsBiker
aktív tag
UNO -t és Nano -t használok.
Az első verzióban ezzel próbálkoztam:void getMinMaxValue()
{
int sensorValue; //value read from the sensor
sensorMin = 1024;
sensorMax = 0;
uint32_t start_time = millis();
while((millis()-start_time) < 200)
{
sensorValue = analogRead(CURRENT_SENSOR);
if (sensorValue > sensorMax)
{
sensorMax = sensorValue;
}
if (sensorValue < sensorMin)
{
sensorMin = sensorValue;
}
}
}
Ezt hívtam meg a loop -ból aztán a Min -ből és Max -ból különbséget számoltam és azt szoroztam egy értékkel. Tiszta szinuszos jelalaknál jó is nyilván, csak a fogyasztók jó része nem olyan, ezért szeretném továbbgondolni.
-
Ezt meg csak úgy itt hagyom: https://checkio.org
Nem C, de JS és Python feladatokat kell megoldani, közben rengeteget lehet tanulni.
Javascript és sok más oktató anyag egyébként van a https://hu.khanacademy.org/ oldalon.
Új hozzászólás Aktív témák
- Honor 200 Smart 256GB Kártyafüggetlen, 1Év Garanciával
- Bomba ár! MacBook PRO 13" Early 2015 - i7 I 16GB I 1TBSSD I 13,3" Retina I OS X Monterey I Cam I Gar
- Bomba ár! HP ProBook 450 G6 - i7-8GEN I 16GB I 256SSD I HDMI I 15,6" FHD I Cam I W10 I Gari!
- AKCIÓ! Gigabyte H610M i5 12400F 16GB DDR4 512GB SSD RX 6700XT 12GB Zalman S2 TG Seasonic 650W
- DELL PowerEdge R730xd 26SFF rack szerver - 2xE5-2680v3 (24c/48t, 2.5/3.3GHz), 64GB RAM, 10G, H730p
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest