Fórum témák
- • Quad 405-ös erősítő tapasztalatok és hibák
- • Kondenzátor feltöltés
- • Vásárlás, hol kapható?
- • Villanymotor
- • Klíma szervizelés, javítás
- • Mosógép vezérlők és általános problémáik
- • LM1875, LM3875, LM3886, stb. TI végerősítők
- • Számítógép hiba, de mi a probléma?
- • Villanyszerelés
- • Villanypásztor
- • VF3 - 6 végerősítő
- • Folyamatábrás mikrokontroller programozás Flowcode-dal
- • RFID Miértek és hogyanok
- • Li-Po - Li-ion akkumulátor és töltője
- • Audiofil, High End Audio
- • Alternativ HE találkozó(k)
- • PLC alapismeretek
- • PIC - Miértek, hogyanok haladóknak
- • Páratartalom érzékelő
- • Gitár Pickup
- • Kondenzátor
- • Inverteres hegesztőtrafó
- • Erősítő mindig és mindig
- • Westen 240 Fi gázkazán hiba
- • TV hiba, mi a megoldás?
- • Elektromos fűnyíró probléma
- • Li-Ion saját akkucsomag készítése
- • Ki hol gyártatja a NYÁK-ot ?
- • Flip-Flop? Bistabil? Buffer?
- • Egyfázisú motor forgásirány váltása mágneskapcsolóval
- • Indukciós főzőlap javítása
- • Espressif mikrokontrollerek
- • Hörmann kapuk
- • Műveleti erősítő
- • Kombikazán működési hiba
- • Codefon kaputelefon
- • Autóelektronika
- • Porszívó javítás
- • Rádióamatőrök topikja
- • Muzeális készülékek-alkatrészek restaurálása
- • Analóg oszcilloszkóp javítása
- • Elektromos kerékpár, robogó házilag
- • Elektromos távirányítós kapunyitó
- • Érdekességek
- • Sütő javítás
- • DVB-T - Földfelszíni digitális problémák
- • Frekvencia - feszültség átalakító
- • Mosogatógép hiba
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Oszcilloszkóp, avagy hogyan kell használni?
- • Tápegységgel kapcsolatos kérdések
- • Rádió építés a kezdetektől a világvevőig
- • VU meter probléma
- • Végfokozat TDA2030-40-50-el
- • Napelemes kerti világítás
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Ha jól értem, a replace() tagfüggvény csak karaktert karakterre vagy stringet stringre tud cserélni, vegyesen nem.
String input="ABCDEFFGH";
String mit="H";
String mire="\xAB\xCD\xEF";
input.replace(mit, mire);
'mit' és 'mire' megadható karaktertömbként is
char mit[]={'H', 0};
char mire[]={0xAB, 0xCD, 0xEF, 0};
A hozzászólás módosítva: Jan 24, 2017
Méretezd újra a feszültség osztót, hogy az 1.1V-os referenciába bele férjen. Válts át 1.1V-os referenciára. Ezt meg tudod mérni az Aref pin-en, tehát tudsz vele számolni, és nem olyan zajos és ingadozó lesz, mint most az 5V. A feszültség osztóra rakj egy 100nF-ot. Több mérést készíts, 16-32db-ot, és átlagold.
Rendben, Köszi a választ!
Ma este kipróbálom, ha itthon leszek.
Sziasztok!
Szeretnék hőmérőt csinálni arduinoval, 47kohm-os themistorom(NTC, vagyis minél melegebb annál kisebb az ellenállása) van itthon. Azt olvastam, hogy vele megegyező értékű ellenállás kell a plusz ágba, ezt meg is csináltam, feltöltöttem egy elvileg működő kódot, de nem jól működik: ha melegítem, akkor csökken a kiírt hőmérséklet.
Ez a kód 100kohm-os thermisztorral, és 100kohm-os ellenállással íródott. Mi lehet a probléma?
Köszi a segítséget!
#include <math.h>
double ThermistorF(int RawADC) {
double Temp;
Temp = log(10000.0*((1024.0/RawADC-1)));
Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
Temp = Temp - 273.15;
Temp = (Temp * 9.0)/ 5.0 + 32.0;
return Temp;
}
double ThermistorC(int RawADC) {
double Temp;
Temp = log(10000.0*((1024.0/RawADC-1)));
Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
Temp = Temp - 273.15;
return Temp;
}
void setup() {
Serial.begin(9600);
}
void loop() {
int valF, valC;
double tempF, tempC;
valF=analogRead(0);
tempF=ThermistorF(valF);
valC=analogRead(0);
tempC=ThermistorC(valC);
Serial.print("Temperature = ");
Serial.print(tempF);
Serial.print(" F; ");
Serial.print(tempC);
Serial.println(" C");
delay(1000);
}
A hozzászólás módosítva: Jan 25, 2017
A képletedhez fordított bekötés tartozik: az NTC legyen a tápfesz felől, az ellenállás pedig a föld felől. Bővebben: Link
Köszönöm, ennyi volt csak a probléma
Köszönöm szépen a segítségedet!
A karaktertömbös megoldás nagyon jól müködik, teszi a dolgát.
További szép napot!
Az 1-es sorban, én nem A2-öt szoktam írni, hanem egyszerűen 2-öt.
azaz:
int analogInput = 2;
És eddig mindig simán ment az ad.....
Akkutöltőben ritkán van megfelelő szűrőkondenzátor a bemenő tápon.Kezdeném egy soros diódával a + ágban , utána egy pufferkondenzátor, és mehet a stab ic-re.
Így is van pontosan. Majd este megpróbálom a progit megcsinálni, még nem érkeztem eddig.
Nyolc float változót szeretnék lcd-re kiírni egymás után,lehetséges-e a változókat tömbbe szervezni és for ciklussal megoldani,esetleg másképpen?
Közben került még egy probléma: Ha a tömb középére vagy akárhova teszek 0x00-át, akkor az utána lévő karaktereket levágja.
Pl.: char karakterCsillag[]={'*', 0};
char karakterrCsillag[]={0x08, 0x2A, 0x00,0x2A,0x08,0};
input.replace(karakterCsillag,karakterrCsillag);
A fenti példában a * karaktert 0x082A-ra cseréli ki.
Van-e ötletetek arra, hogy hogyan lehetne kijavítani a hibát? A hozzászólás módosítva: Jan 26, 2017
A problémát a C programozási nyelv sajátossága okozza, méghozzá azt, hogy a karakterláncokat a 0 zárja le. Azt is tudni kell, hogy a karakterlánc az nem más, mit a karaktertömb, tehát a következő két kifejezés ugyanazt hozza létre:
char *s1 = "Hello";
char s2[] = {'H', 'e', 'l','l', 'o', 0};
Ebben a két esetben s1 és s2 is csak egy mutató, ami a H betű memóriacímére mutat. Azt pedig onnan tudja a string kezelő könyvtár, hogy hol van a szöveg vége, hogy hol van a 0.
Így, ha 0-t szeretnél tenni egy karakterláncba, akkor után azt a szöveget már a szabvány C függvények a 0-nál vágni fogják, mert mind azt hiszi, hogy ott van a vége.
Összefoglalva: ne kezelj bináris adatot stringként!
Menj végig a stringen karakterenként és másold egy másikba. Ha olyan karakterhez érsz, amit cserélni kell, akkor cseréld és menj tovább. Kb. így, mint az alábbi mintában, de ez emberi felhasználásra nem alkalmas, mert memory leak veszélyes, meg 5 perc alatt írtam így nincs agyon tesztelve, de kiindulásnak jó lehet:
/*
* mit -> mit cseréljünk
* mire -> mire cseréjük
* miben -> miben cseréljük
* len -> a "mire" hossza
* nlen -> mutató, az új karakterlánc hossza
*/
char * replaceChar(char mit, char *mire, char *miben, size_t len, size_t *nlen) {
char *s = miben;
char *s2=mire;
int size = 0;
while(*(s++)) {
if(*s==mit){
size++;
}
}
if(!size) return miben;
int w = strlen(miben)+((len)-1)*size;
*nlen = w;
char *uj = (char *)malloc(w);
char *valasz = uj;
s = miben;
do {
if(*s!=mit){
*uj = *s;
uj++;
} else {
s2 = mire;
for(int i=0;i<len;i++){
*uj = *s2;
uj++;
s2++;
}
}
s++;
w--;
}while(w);
*uj=0;
miben = valasz;
return valasz;
}
void setup() {
char *x = "Hello";
char s1[] = {0x10,0x20,0x0,0x40};
size_t nl = 0;
Serial.begin(9600);
char *cserelt = replaceChar('e', s1, x, 4, &nl);
for(int i=0;i<nl;i++){
Serial.print(i);
Serial.print(": 0x");
Serial.println( cserelt[i], HEX);
}
}
void loop() {
}
És a kiment a soros monitoron:
0: 0x48
1: 0x10
2: 0x20
3: 0x0
4: 0x40
5: 0x6C
6: 0x6C
7: 0x6F
Sziasztok!
Kezdő lennék még, nézzétek el nekem ha pongyola a megfogalmazásom... Adott egy while ciklus és azon belül több if feltétel lenne a hozzá tartozó végrehajtani kívánt programkóddal. Viszont egyszerre több if is igaz lehet és végre kéne hajtani a több if-hez tartozó kódot is. Magyarul van egy if ez teljesül, végrehajtja a kódot amíg a végén lévő else nem lesz igaz mert akkor vége. De közben kéne más dolgokat is csináljon, ezek a közben lévő if-ek teljesülésekor hajtódnak végre...
Valahogy így:
while igaz
if igaz
// végrehajtja a kódot
if ez is igaz
// végrehajtja ezt a kódot is (mást csinál)
if ez is igaz lehet ha az előző nem az
// végrehajtja ezt a kódot is (mást csinál)
else if igaz
// befejezi az eddigi tevékenységeket
Kaphatnék egy példát?
Köszönöm!
Sziasztok!
Arduino nano klónt használtam eddig, egyszer egyik programfeltöltéstől a másikra megadta magad, csak a void setup ciklus fut le, és ezt a hibakódot dobja ki:
Bocsánat hosszú lett, talán a vége az érdekes.(csatalkoztatva van rendesen, jól van minden kiválasztva)
Lehet vele valamit kezdeni, vagy ez a hibakód a halála?
Arduino: 1.8.1 (Windows 7), Alaplap: "Arduino Nano, ATmega328"
Sketch uses 5754 bytes (18%) of program storage space. Maximum is 30720 bytes.
Global variables use 384 bytes (18%) of dynamic memory, leaving 1664 bytes for local variables. Maximum is 2048 bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM4 -b57600 -D -Uflash:w:C:\Users\Tomi\AppData\Local\Temp\arduino_build_419845/lcd_thermistor.ino.hex:i
avrdude: Version 6.3, compiled on Dec 16 2016 at 13:33:19
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"
Using Port : COM4
Using Programmer : arduino
Overriding Baud Rate : 57600
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Programmer Type : Arduino
Description : Arduino
Hardware Version: 2
Firmware Version: 1.16
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "C:\Users\Tomi\AppData\Local\Temp\arduino_build_419845/lcd_thermistor.ino.hex"
avrdude: writing flash (5754 bytes):
Writing | ################################################## | 100% 1.26s
avrdude: 5754 bytes of flash written
avrdude: verifying flash memory against C:\Users\Tomi\AppData\Local\Temp\arduino_build_419845/lcd_thermistor.ino.hex:
avrdude: load data flash data from input file C:\Users\Tomi\AppData\Local\Temp\arduino_build_419845/lcd_thermistor.ino.hex:
avrdude: input file C:\Users\Tomi\AppData\Local\Temp\arduino_build_419845/lcd_thermistor.ino.hex contains 5754 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 1.26s
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0042
0xe3 != 0xd0
avrdude: verification error; content mismatch
kiválasztott
port nem elérhető vagy az alappanel nincs csatlakoztatva
avrdude done. Thank you.
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Köszönöm ezt a nagyszerü kódot, de sajnos nem tudom használni... 
A célom az lett volna ezzel a kicseréljük a betüt hexadecimális karakterekre, hogy: Van egy 48x8-as Led Matrixom amiben a PIC meghalt, programom nincsen hozza, ezért kicseréltem a PIC-et ATmega328-ra. A programot kissebb-nagyobb segítséggel odáig megírtam, hogy egy 48 karakterből álló tömböt megtud jeleníteni a matrixokon (pl.: 0xFF: 11111111, azaz az oszlop világít, 0xE7: 11100111, az alsó 3 pixel és a felső 3 pixel világít stb.), most gondoltam, hogy egyszerüen kicserélek minden betüt a hozzá tartozó 5x8-as karaktertömbre (pl.: a H betüt 0x7F 0x08 0x08 0x08 0x7F-re) és az így kapott tömböket egymásután teszem és kiírom a matrixokra.
Ez idáig müködik szeg76 kódjának a segítségével, de amint írtam 0x00-nál levágja az utána lévő karaktereket.
A void screen_refresh(int count,byte szoveg[]) {...}
függvény segítségével tudok kíirni karaktertömböt a matrixokra. A count-al a sebességet lehet beállítani.
Az alábbi tömb tartalmaz 0x00-át, de rendesen kiírja.
byte data[]={0x00,0x41,0x7f,0x7f,0x49,0x49,0x7f,0x36,0x00,0x3e,0x7f,0x41,0x41,0x41,0x7f,0x3e,0x00,0x7f,0x7f,0x30,0x18,0x0c,0x7f,0x7f,0x00,0x7e,0x7f,0x01,0x01,0x01,0x7f,0x7e,0x00,0x32,0x7b,0x49,0x49,0x49,0x6f,0x26,0x00,0x0c,0x22,0x02,0x02,0x22,0x0C,0x00};
Megprobáltam így, így azt kellene csinálja, hogy kiír egy H betüt, utána egy 0x00-ás oszlopot és az a maradék "ello"-t átalakítsa binárisra és kírja azt (0x65, 0x6C, 0x6C, 0x6F) de ezt csinálja vele size_t nl = 0;
char *x = "Hello";
char s1[]={0x7F, 0x08, 0x8,0x08,0x7F,0x00,0};
char *cserelt = replaceChar('H', s1, x, 4, &nl);
screen_refresh(25, *cserelt);
A hozzászólás módosítva: Jan 26, 2017
Így mit csinál?
char *cserelt = replaceChar('H', s1, x, 6, &nl);
screen_refresh(25, cserelt);
Amúgy nem lenne egyszerűbb a szöveget és a bitképet külön tárolni és kezelni?
szeg76-al egyetértek. Esetleg egy map-al?
byte map[40][5]= // A 40 az persze csak hasraütés, ahány betűt akarsz (meg számot)
{
{0x0,0x1,0x2,0x3,0x5}, // A
{0x0,0x1,0x2,0x4,0x7} // B
// ...
};
void print(char c){
byte b[5] = map[c-'A'];
// itt ird ki b-t, ebben van az 5x8 bitje c-nek, vagy tehetsz vele bármit
}
void printString(char *s){
char *t = s;
while(*t) {
print(*t);
t++
}
}
A hozzászólás módosítva: Jan 26, 2017
Mi lenne ha a switch / case / break utasításokat alkalmaznád?
Bővebben: Link
Szia!
Az általad írt vázlat is azt csinálja, amit írtál...
while (feltetel1_igaz) // ha a feltetel1 igaz, akkor a következő utasításmagot ismétli !
{
if (feltetel2)
{
ut1;
ut2;
ut3; //ezeket csinálja, ha a feltetel2 igaz;
}
if (feltetel3)
{
ut4;
ut5;
ut6; //ezeket csinálja, ha a feltetel3 igaz;
}
if (feltetel4)
{
ut7;
ut8;
ut9; //ezeket csinálja, ha a feltetel4 igaz;
}
else if (feltetel5)
{
ut10;
ut12; //ezeket csinálja, ha az előző if hamis volt és a feltetel5 igaz;
}
}
Idézet: „De közben kéne más dolgokat is csináljon,”
Az egymagos processzorok egyszerre egy dolgot tudnak csinálni, tehát közben nem megy más sajnos  !
Látszólag lehet több dolgot egyszerre csinálni a program megfelelő szervezésével, megszakítással, de ezt a feladat konkrét ismeretében kell átgondolni ( meg először a hozzátartozó ismereteket elolvasni és megérteni  !) ! A hozzászólás módosítva: Jan 27, 2017
Sziasztok. Arduino nano-ra keresném azt a programot ami léptetőmotort vezérel sebesség szabályozva (potméterrel) és a tekercsek kivezetése külön jön ki az arduino-ból ( ULN2803AG-n keresztül hajtom a léptetőt.) Válaszokat előre is köszönöm.
Szia! A példák között van. Pédák -példák könyvtárból- stepper - stepper speed control.
Este megtaláltam,köszönöm.
Szia!
Félreértettük egymást! Azt szeretném hogy ha a feltetel2 igaz akkor hajtsa végre az alatta lévő utasításokat de miközben ezeket végrehajtja (mert a feltétel még mindíg igaz) nézze meg a feltetel3-at is és ha az is igaz (miért is ne lehetna) akkor hajtsa végre azt is sőt ha a feltetel4 is igazzá válik (lehet hogy akkor már a feltetel3 nem igaz de a feltetel2 még mindíg akkor azzal is foglalkozzon). Nyilván nem egyszerre mert arra nem képes, de ne ragadjon le az első if-nél hanem nézze meg a többit is!
Szóval ezt hogyan? A konkrét projektet itt nem vesézném ki, ha nem gond de ha gondolod privátban leírom!
Üdv, Lac
Ilyet nem lehet csinálni, hogy miközben valamit végrehajt, nézzen valami mást is, hacsaknem a megszakításokkal ügyeskedünk, de az is csak egymásután van! Csak a vizsgálatok ciklusba szervezésére tudok gondolni.
Mint ahogy írtam én is egymás után gondoltam természetesen nem egyszerre.
De ami a lényeg hogy megvizsgál egy változót amire ha igaz a feltétel végrehajt egy utasítás sorozatot. Viszont van egy másik változó is amire ha igaz a másik feltétel akkor azzal is foglalkoznia kéne és végrehajtani egy másik utasítás sorozatot "látszólag egy időben"!
Persze az output is más!
Ciklusba szervezed az if-eket? (loopba?) A hozzászólás módosítva: Jan 27, 2017
Ha az if(feltéttel) után csak 1 utasítás szerepel, azt 3 féleképen is leírhatod:
// mind a 3 példa ugyan azt eredményezi:
if (x > 120) digitalWrite(LEDpin, HIGH);
if (x > 120)
digitalWrite(LEDpin, HIGH);
if (x > 120){ digitalWrite(LEDpin, HIGH); }
Ha 1-nél több utasítás szerepel az if ágban akkor a { jelek közti utasítások tartoznak egybe }
if (x > 120){
digitalWrite(LEDpin1, HIGH);
digitalWrite(LEDpin2, HIGH);
} // all are correct
if (x < 120){
digitalWrite(LEDpin1, LOW);
digitalWrite(LEDpin2, LOW);
} // all are correct
És a lehetséges feltétel vizsgálatok:
Comparison Operators:
x == y (x is equal to y)
x != y (x is not equal to y)
x < y (x is less than y)
x > y (x is greater than y)
x <= y (x is less than or equal to y)
x >= y (x is greater than or equal to y)
Bővebben: if
Bővebben: if ... else
|
|