- Luck Dragon: Asszociációs játék. :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Argos: Szeretem az ecetfát
- vrob: Az IBM PC és a játékok a 80-as években
- Magga: PLEX: multimédia az egész lakásban
- sziku69: Fűzzük össze a szavakat :)
- zebra_hun: Hűthető e kulturáltan a Raptor Lake léghűtővel a kánikulában?
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- gban: Ingyen kellene, de tegnapra
- sziku69: Szólánc.
-
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
-
Janos250
őstag
A kérdéséből ítélve, lehet, az is túl bonyolult.
Lehet, hogy kihagyva a hibakezeléseket, egyszerűen sor olvasássalWEBserverClient.readStringUntil('\n')
beolvasni a tablet böngészőjéből érkező sorokat
például PC Firefox ezt küldi:GET /?t=125 HTTP/1.1
Host: 192.168.0.140
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: hu-HU,hu;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflateConnection: keep-alive
Upgrade-Insecure-Requests: 1Ha vezérelni akar, akkor ki tudja szedni azt, amit a hívásban
(pl: http://192.168.0.140/?t=125)
odaírt, és megcsinálja, amit akar.
Vagy a lapra gombokat, stb. rak, miegymás.
Lehet, holnap - ha nem jut addig előbbre - írok egy egyszerúbbet. -
Wolfram
aktív tag
Janos250 hozzászólásának az alján: "Ezt használtam fel:
https://randomnerdtutorials.com/esp32-web-server-arduino-ide/" -
Gergosz2
veterán
válasz
JozsBiker #19090 üzenetére
Nos, nem kell feladni, szoftversen is lehet rajta szűrni:
#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];
volatile bool CalcRMS = false;
volatile uint16_t FilterCoeffInv = 5u;
uint16_t ADC_BUFFER_CALC[ADC_BUFFER_SIZE];
float RMS_Current;
unsigned long SerialTimer = 0u;
unsigned long SerialPrintTimeout = 1000;
void setup()
{
//Gergosz2 2023
Serial.begin(51200);
bufferIterator = 0;
SerialTimer = millis();
memset(ADC_BUFFER, (uint16_t)0, ADC_BUFFER_SIZE*sizeof(uint16_t));
setupPWMInterrupt();
}
void loop()
{
if (true == CalcRMS)
{
CalcRMS = false;
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);
}
if ((millis() - SerialTimer) > SerialPrintTimeout)
{
SerialTimer = millis();
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)
{
uint16_t prevSample = 0u;
if(bufferIterator == 0u)
{
prevSample = ADC_BUFFER_SIZE - 1u;
}
else
{
prevSample = bufferIterator - 1u;
}
ADC_BUFFER[bufferIterator] = ADC_BUFFER[prevSample] - (uint16_t)(ADC_BUFFER[prevSample]/FilterCoeffInv) + (uint16_t)(analogRead(ADC_PIN)/FilterCoeffInv);
bufferIterator ++;
if (bufferIterator > ( ADC_BUFFER_SIZE - 1u) )
{
CalcRMS = true;
bufferIterator = 0u;
}
}Gaineket ne felejts beírni
-
válasz
tibi-d #19089 üzenetére
Egy rém egyszerű példa kód Janos250 kolléga jóvoltából.
Ezt könnyen tudod módosítani, a felület pedig egyszerű HTML, csak arra figyelj, hogy ha JS-t, CSS-t használsz, lehetőleg integráld bele az oldalba, ne külön fájlként töltsd fel, csak komplikálja a dolgokat -
ViZion
félisten
19076 Wolfram
Ahogy Aryes írta, led tápokat keress, vannak brutál példányok is. Viszont a zavar az zavar... igaz nálam nem tápra, hanem GPIO-ra adott 3,3 V-ot zavarta a 230 V közelsége, a lakásban meg van wifi, telefonok 4G, mittudomén. De majd kiderül, elsőre én a legtávolabbin kísérleteznék, minimális befektetéssel. Csak van oka, hogy nincs mindenhol ilyesmi.Lehet valahogy domain nevet adni lokális hálózaton egy lapnak?
igen, vagy a routeredben vagy windowsban ac:\Windows\System32\Drivers\etc\hosts
ezt így kimásolod az asztalra, szerkeszted, és visszarakod, felülírva az eredetit. Esetleg egy flushdns is kellhet.
Linuxon Debian/Buguntunálsudo nano /etc/hosts
Fedoránál megint variáltak, vi a szerkesztő, utálom. -
JozsBiker
aktív tag
válasz
Gergosz2 #19063 üzenetére
Először is 0 terhelésnél a kép ( AC állásban van a szkóp ):
Eléggé szőrös, de kis nyomozás után megállapítottam hogy a tápfeszültségtől ilyen. ( Számítógép USB portjára van rádugva az UNO és azon lóg az ACS712, próbáltam 47 aztán 100 nanos kondival javítani a helyzetet, de nem sok látszatja volt. ) Kíváncsiságképpen megnéztem hogy ezekből a "szőrökből" mit érzékel az UNO. Nyersen beolvasva az A0 -t 509 és 517 között szórnak az értékek, vagyis ennyi hibája egész biztos lesz. Ez azért elgondolkodtató, mert ez az AD átalakítás szempontjából 0,0626 V -nak felel meg, ami az ACS712 -nél már marha sok, hiszen ott 0,185 V felel meg 1 A -nek, vagyis a 0,626 V kb. 0,3 A mérési pontatlanságot jelent ha jól számoltam :-(.A programod a következőket írja ( ADC_GAIN 0.09775 ): 0.17 - 0.20 - 0.24 - 0.16 - 0.16 - 0.21 - 0.14 - 0.17 - 0.26 - 0.18 - 0.19 - 0.20 - 0.19 - 0.23 - 0.18 - 0.18 - 0.17 - 0.20 - 0.22 - 0.16 ...
Bekapcsolva a terhelést ( műszer szerint 0,3 A ):
1.30 - 1.29 - 1.29 - 1.31 - 1.30 - 1.25 - 1.26 - 1.31 - 1.35 - 1.35 - 1.33 - 1.37 - 1.34 - 1.41 - 1.40 - 1.23 - 1.19 - 1.21 - 1.24 - 1.23 ... -
tibi-d
tag
Tudnátok-e néhány linket mellékelni, hogy hol lelhető fel információ ESP32-re írható, tableten megjeleníthető grafikus felület szerkesztésével kapcsolatban, nem túl bonyolult leírás formájában. Ezt megfogalmazni sem volt egy piskóta feladat. Köszi
-
Janos250
őstag
-
daninet
veterán
Sziasztok!
Motor sebességet akarok vezérelni egy enkóderrel. Ez így elég egyszerű, megy is a dolog. A gondom az, hogy első indításnál szeretném ha finoman felpörögne nem pedig ráadná a kakaót és szétcsavarná a motort. Ez is egyszerű elméletben, void start-ba egy for loop és annyi.
Viszont a következő a gondom:
Áram alá helyezem a tápot, egy fél másodpercre megindul a motor teljes sebességgel, majd megáll és akkor kezd el a void setup-ban levő első for loop lefutni.
Gyanítom nem szoftver eredetű a gond, az elektronikából eredhet inkább, a kódban nem látok gondot (majd megerősítitek).
A motor H híd 0-5Vot kér a sebesség beállításához, 10%tól mozdul meg a motor. Arduval csinálok PWM-et és egy RC taggal fix feszültséggé alakítom ( a kondi és az ellenállás az ardura van direk forrasztva nem tudom mennyire látszik)A kis zöld bigyó egy 5V step-down konverter mert 19V a táp ami a motort is hajtja (laptop táp a háttérben)
/A képen már nincs rajta az enkóder mert beépítettem már a végső dobozába, a szürke és fehér kábel volt az/
-
Wolfram
aktív tag
Lehet valahogy domain nevet adni lokális hálózaton egy lapnak? (pl.: 192.168.10.111 -> nappali.smarthome.hu, 192.168.10.112 -> konyha.smarthome.hu stb)
-
válasz
Wolfram #19076 üzenetére
Hogy mekkora a veszteség, az elsősorban a felvett áramerősségtől függ. Kis áramfelvételnél viszont a légköri zavarra lesz nagyon érzékeny a cucc.
Esetleg talán egy köztes megoldás: 12V-os vezeték, és helyben egy konverter? Ezzel a káposzta is jóllakik, meg a kecske is megmarad.Valamilyen LED tápot lehetne használni erre.
-
Wolfram
aktív tag
Mikro feszültségű hálózat (ki)építésének van szakirodalma?
Amikor a lakásban sok eszközt telepít az ember, elég gyorsan kifogy a konnektorból, valamilyen saját elektromos hálózat kellene. -
-
válasz
JozsBiker #19060 üzenetére
Sima rezisztív fogyasztót csak egy 75 W -os izzót találtam, a műszer szerint 0,3 A -t vesz fel. A szkóp szerint az ACS712 kimenetén a szinusz jel 2,4 - 2,6 V között mozog ( ez mondjuk nem tudom hogyan egyeztethető össze a fenti 0,185mV/A -rel ), bár elég szőrös a jelalak.
0,3 Aeff = 2 * 0,3 * 1,41 = 0,846 Apeak-peak
2,6 - 2,4 = 200 mVpeak-peak / 185 mV/A = 1,08 Apeak-peakHa elég hunyorítva nézed, kijön az.
-
JozsBiker
aktív tag
válasz
Gergosz2 #19055 üzenetére
Számomra új dolgot olvastam az ACS712 modul leírásában. 5A -es modul esetén a felbontás 185 mV/A. Ez azt jelenti, hogy 5 A (RMS ?) terhelés esetén a kimenő feszültsége 2,5 - 5 * 0,185 és 2,5 + 5 * 0,185 V között változik, azaz 1,575 - 3,425 V között. Vagyis nem húzza szét a teljes 0 - 5 V tartományra. Ekkor viszont ha jól gondolom az 5 A -nek megfelelő 5 * 0,185 V -ra is csak 189,4 -es tartomány jut az 1023 -ból. Ez talán változtat a számítási módon.
0 terhelés esetén 2,5 V az ACS712 kimenete ezért az ADC_OFFSET -et nem bántottam. A soros kimeneten is 0,0 -t írt aminek először örültem, de aztán rájöttem hogy az ADC_GAIN = 0,0 miatt.
Sima rezisztív fogyasztót csak egy 75 W -os izzót találtam, a műszer szerint 0,3 A -t vesz fel. A szkóp szerint az ACS712 kimenetén a szinusz jel 2,4 - 2,6 V között mozog ( ez mondjuk nem tudom hogyan egyeztethető össze a fenti 0,185mV/A -rel ), bár elég szőrös a jelalak. A képletbe behelyettesítve: (5/1023)* 2 /(2.6-2.5) = 0,09775. Ezzel az értékkel 0 terhelés esetén sem 0 -t ír a sorosra.
Terhelés nélkül:
0.25
0.16
0.19
0.17
0.23
Bekapcsolva az izzót:
1.31
1.36
1.39
1.45
1.39
1.39 -
-
Gergosz2
veterán
válasz
JozsBiker #19050 üzenetére
Ennyit finomítanék a kódon :
#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];
volatile bool CalcRMS = false;
uint16_t ADC_BUFFER_CALC[ADC_BUFFER_SIZE];
float RMS_Current;
unsigned long SerialTimer = 0u;
unsigned long SerialPrintTimeout = 1000;
void setup()
{
//Gergosz2 2023
Serial.begin(51200);
setupPWMInterrupt();
bufferIterator = 0;
SerialTimer = millis();
memset(ADC_BUFFER, (uint16_t)0, ADC_BUFFER_SIZE*sizeof(uint16_t));
}
void loop()
{
if (true == CalcRMS)
{
CalcRMS = false;
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);
}
if ((millis() - SerialTimer) > SerialPrintTimeout)
{
SerialTimer = millis();
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) )
{
CalcRMS = true;
bufferIterator = 0u;
}
}Láttam hogy van szkópod szóval ezeket így lehetne kalibrálni:
ADC_OFFSET : egyszerűen nulla terheléssel, értsd nincs rajta semmilyen fogyasztó, mekkora feszültség értéket ad vissza a szkóp? Tegyük fel, hogy 2.5V, akkor az ADC_OFFSET értéke (2.5/5)*1023 lesz, ami 512-re jön ki kerekítve.
ADC_GAIN : ha megvan az ADC_OFFSET, akkor ismert terhelésre megkéne nézni mit ad vissza a mérőműszer a kimenetén. Ehhez kéne a szkóp és multiméter is. Célszerű itt egy sima izzót használni, semmi fancy LED dolgot. Tegyük fel hogy az ADC_OFFSET 2.5V lett és mondjuk 2A csúcs folyt izzón amit a multiméterről olvastál le, amire 3V csúcsfeszültséget mértél a szópon. Ilyenkor az ADC_GAIN nem lesz más mint (5/1023)* 2 /(3-2.5).
Ha ezekről adsz képet és vagy mérési eredményt kiszámolom neked.
RMS_GAIN : ehhez nem nyúlj, kivéve ha a megszakítást akarod változtatni.
Az interrupt kezelő rész fontos bele ? Mit csinál tulajdonképpen ?
1kHz mintavételezési időt valósít meg , így gyakorlatilag 20 mintát vesz 1 hálózati periódusból. -
Szancsó
aktív tag
válasz
Wolfram #19051 üzenetére
Vannak rá honlapok: régebben találtam használhatót, csak nem mentettem el, de most ráguglizva leltem egy érdekeset: https://gchq.github.io/CyberChef
Itt a fenti tömböt bemásolva és bal oldalt az input formátumot megadva (From decimal, Gunzip) visszafejtette rendesen HTML-re.
(Visszafelé is megvan minden parancs megfelelője.) -
-
Wolfram
aktív tag
Ezeket a beágyazott fájl tömböket hogy gyártják -> (PROGMEM) [link] ?
Van valamilyen export/import generátor amit használnak hozzá, vagy ezt mindenki házilag csinálja? -
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
Hirdetés
- Fotók, videók mobillal
- Kecskemét és környéke adok-veszek-beszélgetek
- Lakáshitel, lakásvásárlás
- Azonnali notebookos kérdések órája
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- iPhone topik
- Beárazták az projektoros Ulefone-t
- AMD Navi Radeon™ RX 9xxx sorozat
- Luck Dragon: Asszociációs játék. :)
- Projektor topic
- További aktív témák...
- Samsung Galaxy A52s 128GB, Kártyafüggetlen, 1 Év Garanciával
- Bomba ár! Dell Latitude E6540 - i5-4GEN I 8GB I 320GB I DVDRW I 15,6" FHD I HDMI I W10 I Gari
- BESZÁMÍTÁS! ASUS ROG STRIX X570-E Gaming alaplap garanciával hibátlan működéssel
- Apple iPhone 14 Pro Max 128GB, Kártyafüggetlen, 1 Év Garanciával
- BESZÁMÍTÁS! Gigabyte B760M i7 12700K 16GB DDR4 512GB SSD RX 6700 XT 12GB Rampage SHIVA Enermax 750W
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: PC Trade Systems Kft.
Város: Szeged