|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Igen, de kalkuláld bele a diódákon eső feszt.
(#) |
ALI hozzászólása |
Júl 26, 2015 |
|
/ |
|
|
Sziasztok! Hogy lehet azt megoldani, hogy van egy mért hőmérséklet, szeretnék be állítani egy min
értéket ez a mért lenne és egy max-ot az pedig 10-el felette legyen?
Illetve az LM 35 egész fokban tud csak mérni?
Előre is köszi
Az LM35-nek analóg kimenete van, nem? Miért csak egész fokokban mérne...?
A mért értékedet vegye fel egy "min" nevű változó.
Így: min=mért érték és max=min+10
-ha jól értettem amit akarsz...
Köszi. Igen jól értetted mit akarok. Rossz volt a kód amit használtam ezért mért egészet.
A diódákon eső fesz elèg arra, hogy mivel ugye a trafó 6v-os az arduinó meg 5 hogy ne nyírja ki az ardut? Illetve a trafó után milyen kondi kéne? És ezt program ügyileg hogyan lehetne megoldani, hogy valós érték legyen. A másik kérdés hogy a trafó kissebb feszen is megy, tehát ha mondjuk csak 210v van, akkor is tudom mérni? Előre is köszi!
Nem igazán megy ez a min-max. Be tennéd nekem ebbe a kódba? float temp;
int tempPin = 1;
void setup()
{
Serial.begin(9600);
}
void loop()
{
temp = analogRead(tempPin);
temp = temp * 0.48828125;
Serial.print("TEMPRATURE = ");
Serial.print(temp);
Serial.print("*C");
Serial.println();
delay(1000);
}
float temp;
int tempPin = 1;
float min, max;
void setup()
{
Serial.begin(9600);
}
void loop()
{
temp = analogRead(tempPin);
temp = temp * 0.48828125;
min = temp;
max = min + 10;
Serial.print("TEMPRATURE = ");
Serial.print(temp);
Serial.print("*C");
Serial.println();
delay(1000);
}
Bár az nem világos, hogy a mért érték kell legyen a "min", vagy a számított... Jele esetben a számított értéket veszi fel.
Köszi szépen ez így jó lesz.
Számold ki mekkora felbontásod van az AD bemenetén 5V / 10 bit esetén 1 bitre mekkora feszültség esik.
Ezután számold ki a trafó áttétele alapján mekkora feszültség változásnak felel ez meg a 230V hálózatnál.Persze némi szorzó tényező beleszól , mert egyenirányítás után vagyunk.
Effektívből csúcs értéket fogsz kapni mert a kondenzátor csúcsra töltődik.
Sajnos 6 voltos secunder után pufferelve kb.: 9V lesz a kimeneten tehát oda 1 ellenállás osztó is kell akkor közel 4,5-5V lesz a bemeneten.De a nyitó irányú diódák miatt lesz állandó feszültség esés is.Ezek után vissza lehet számolgatni az arányokat.
Nagyon durván saccolva.
10bit esetén 1024 részre osztod az 5 voltot : 4.8mV
ez 2szer mert 9 voltot osztottunk 2vel ... akkor ~ 10mV van a bemeneten.
Persze ez nem lesz mert erre nem nyit ki a dióda.
greazt esetén kb.: 1.4 V alatt nem nyit ki ... így kb 1.4*(230/6) volt a legkisebb fesz amit mérni tudsz. kb: 50V váltó.Tehát alulról kissé nyomott lesz a skála.
1 utas egyen írányítás esetben kb.: 25V váltót tudsz mérni mert akkor csak Si 1 dióda van.
Schottky esetén jobb lesz akár 10V váltó is mérhető lehet.
Persze ha te inkább a felső értékét méred akkor jobb a viszony... de lehet jobb lenne nagyobb secunder feszültség 12 24 V mert akkor kisebb a hiba a diódákból adódó nyitó feszültség miatt.(persze itt is kell fix ellenállásosztó ami 5 voltra osztja a 12/24 V váltó csúcsértékét ) A hozzászólás módosítva: Júl 26, 2015
Érdemesebb 250-300 Voltra méretezni a feszültség osztókat a trafó szekunder kimenete után és az Arduinó AD bemenet elé.
230 csak névleges érték annál lehet akár több is.
Köszi, és gondolom elég a 2w-os trafó. Még az értékekben tudnál segíteni? Illetve akkor inkább 12v-os legyen?
Csak egy halk megjegyzés. Az unot, miről táplálod? Trafó? Akkor meg is van a trafód. A trafó és az uno közé, ahol még nincs stabilizálva (ha stabilizálod a feszt) mehet az a pont, amit az unohoz vezetsz ad bemenetnek. Gondolom nem mV nagyságrenddel akarod figyelni a 230V-ot.
Az ötlet jó, csak az a gond, hogy az ardut nem onnan táplálom, amit mérni kell, hanem másik hálózatról.
Mivel ezt nem írtad, ezért írtam csak halk megjegyzésnek, opcióként Nálam a hálózat kimaradás így van megoldva.
Igen bármilyen kis teljesítményű trafó jó pár VoltAmperes és nem Watt.
Mivel nem lesz rajta terhelés csak a uC portja.
Ha a fenti leírásomból nem érted mit, miért írtam?
Nem tudod eldönteni mit fogsz kapni a használni kívánt alkatrészek esetén.
Akkor légy szíves további elektrotechnikai ismereteknek utána nézni!
Fogalmak: Váltakozó áram és feszültség jellemzői , tulajdonságai, 1 és 2 utas egyenírányítás , félvezetők nyitó /záró irányú karakterisztikája, üzemi jellemzői , transzformátor működése, jellemzői.
Milyen pontosságú mérésre van szükséged? Ez is befolyásolja a mérőátalakítód kivitelét. A hozzászólás módosítva: Júl 27, 2015
(#) |
saua hozzászólása |
Júl 28, 2015 |
|
/ |
|
|
Sziasztok,
Az eredeti kód itt található Bővebben: Link
a késleltetés kódot szeretném úgy módosítani, hogy mikor a 6-os lábon levő LED világít, akkor egyszer lefusson a blink5 függvény.
/*
Debounce
Nyomógomb megnyomásával tudjuk be-, majd újbóli megnyomásával kikapcsolni a LED fényét.
Áramkör:
* LED a 6 pinbe és a földbe kötve
* LEDB az 7 pinbe és a földbe kötve (blink5)
* nyomógomb 2 pinből az 5 V-ba megy
* 10 kiloohmos ellenállás a 2 pinből
created 21 November 2006 by David A. Mellis
modified 30 Aug 2011 by Limor Fried
*/
// állandókkal megadjuk a pin értékeket:
const int buttonPin = 2; // nyomógomb pin
const int ledPin = 6; // LED pin
int ledBPin = 7;
// változókat hozunk létre:
int ledState = HIGH; // kimeneti pin aktuális állapota
int buttonState; // bemeneti pin aktuális állapota
int lastButtonState = LOW; // bemeneti pin előző értéke
/* a következő változók long típusúak lesznek, mivel az időt milliszekundumban mérjük, ezért értéke gyorsan nagyra nő, akkorára, amit integerben nem tudunk tárolni */
long lastDebounceTime = 0;
// a kimeneti pin átkapcsolásának utolsó időértéke
long debounceDelay = 50;
// késleltetési idő; ha a kimenet vibrál, meg kell növelni
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledBPin, OUTPUT);
// adjuk meg a LED állapotának kezdő értékét
digitalWrite(ledPin, ledState);
}
void loop() {
// helyi változóba kiolvassuk a kapcsoló állapotát:
int reading = digitalRead(buttonPin);
// leellenőrizzük, hogy elég idő telt-e el a két kiolvasás között:
// Ellenőrizzük, hogy megnyomás vagy zaj
// hatására változott-e a kapcsoló:
if (reading != lastButtonState) {
// a késleltetés időzítőt újraindítjuk:
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
/* ha az eltelt időből kivonjuk az utolsó átkapcsolás idejét, és az nagyobb, mint a késleltetési idő, akkor – mivel ez gombnyomásra utal – a reading nevű integer változóban eltárolt adatunkat hozzárendeljük a nyomógomb aktuális értékét tároló változónkhoz */
// ha a nyomógomb állapota megváltozik:
if (reading != buttonState) {
buttonState = reading;
// ha a nyomógomb állapota HIGH, benyomott, akkor
// átkapcsoljuk a LED állapotát az aktuális ellenkezőjére
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
// és ezzel az értékkel beállítjuk a LED állapotát:
digitalWrite(ledPin, ledState);
//beolvasni a ledPin allapotat
if(ledState ==HIGH)
blink5();
// majd elmentjük. A loop következő lefutásánál már
// ez lesz a kezdő értéke ennek a változónak
lastButtonState = reading;
}
void blink5()
{
for(int i=0;i<5;i++){
digitalWrite(ledBPin,HIGH);
delay(500);
digitalWrite(ledBPin,LOW);
delay(500);
}
return;
}
beszúrtam a loop() -ba a függvény meghívást 72. és 73. sor és utána pedig void blink5() függvényt, 79. sor. Most mikor a 6-os láb magas szinten van beindul a blink5() függvény de nem akar leállni, gondolom a delay miatt a nyomógombot se érzékeli.
Ha a függvényből a return utasítást törlöm semmi sem változik.
Tehát hogy lehetne megoldani hogy egy meghívott függvény csak egyszer fusson le? A hozzászólás módosítva: Júl 28, 2015
Ha megérted az 53. sorban alkalmazott késleltetés (inkább időzítés) módszert?
Akkor már tudod alkalmazni a LED villogtatásnál is!
A lényeg, hogy ne használj delajt! Vagy figyeled az idő múlását, (mint fentebb) vagy futás számlálót használsz.
Az eltelt idő érzékelésére.
Ui.: Az a return csak akkor kellene a „blink5”, végére ha valami értéket vissza akarsz adni a függvényből. A hozzászólás módosítva: Júl 28, 2015
köszi a választ.
az most nem is lenne nagy probléma, hogy a dalay miatt nem működik a gomb, hanem hogy állandóan újraindul a blink5 fuggvény. Csak egyszer kellene lefusson. Próbáltam azt a megoldást is, hogy a LED-et a 2-es lábra kötni, és figyelni mikor kerül alacsony szintről magasra és akkor beindítani a blink függvényt
attachInterrupt(0, blink5, RISING);
de nem működik. A hozzászólás módosítva: Júl 28, 2015
itt foglalkoznak a témával ami téged érdekel, de egyenirányítást nem látok benne.
Ötlet?:
Valahol a setup előtt:
char oldLedState = LOW;
a programod
...
// ha a nyomógomb állapota megváltozik:
if (reading != buttonState) {
buttonState = reading;
oldLedState = HIGH; // Elngedélyezük a blink5 hivást
// ha a nyomógomb állapota HIGH, benyomott, akkor
// átkapcsoljuk a LED állapotát az aktuális ellenkezőjére
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
// és ezzel az értékkel beállítjuk a LED állapotát:
digitalWrite(ledPin, ledState);
if((ledState == HIGH) && (oldLedState == HIGH)) blink5(); // !!!
}
void blink5()
{
for(int i=0;i<5;i++){
digitalWrite(ledBPin,HIGH);
delay(500);
digitalWrite(ledBPin,LOW);
delay(500);
}
oldLedState = LOW; // tiljuk a további meghívást
}
A hozzászólás módosítva: Júl 28, 2015
Köszi a segítséget.
Egy probléma csak maradt, a függvény kétszer fut le.
Most így néz ki a kód:
/*
Debounce
Nyomógomb megnyomásával tudjuk be-, majd újbóli megnyomásával kikapcsolni a LED fényét.
Áramkör:
* LED a 6 pinbe és a földbe kötve
* LEDB az 7 pinbe és a földbe kötve (blink5)
* nyomógomb 2 pinből az 5 V-ba megy
* 10 kiloohmos ellenállás a 2 pinből
created 21 November 2006 by David A. Mellis
modified 30 Aug 2011 by Limor Fried
*/
// állandókkal megadjuk a pin értékeket:
const int buttonPin = 2; // nyomógomb pin
const int ledPin = 6; // LED pin
int ledBPin = 7;
// változókat hozunk létre:
int ledState = HIGH; // kimeneti pin aktuális állapota
int buttonState; // bemeneti pin aktuális állapota
int lastButtonState = LOW; // bemeneti pin előző értéke
/* a következő változók long típusúak lesznek, mivel az időt milliszekundumban mérjük, ezért értéke gyorsan nagyra nő, akkorára, amit integerben nem tudunk tárolni */
long lastDebounceTime = 0;
// a kimeneti pin átkapcsolásának utolsó időértéke
long debounceDelay = 50;
// késleltetési idő; ha a kimenet vibrál, meg kell növelni
char oldLedState = LOW;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledBPin, OUTPUT);
// adjuk meg a LED állapotának kezdő értékét
digitalWrite(ledPin, ledState);
}
void loop() {
// helyi változóba kiolvassuk a kapcsoló állapotát:
int reading = digitalRead(buttonPin);
// leellenőrizzük, hogy elég idő telt-e el a két kiolvasás között:
// Ellenőrizzük, hogy megnyomás vagy zaj
// hatására változott-e a kapcsoló:
if (reading != lastButtonState) {
// a késleltetés időzítőt újraindítjuk:
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
/* ha az eltelt időből kivonjuk az utolsó átkapcsolás idejét, és az nagyobb, mint a késleltetési idő, akkor – mivel ez gombnyomásra utal – a reading nevű integer változóban eltárolt adatunkat hozzárendeljük a nyomógomb aktuális értékét tároló változónkhoz */
// ha a nyomógomb állapota megváltozik:
if (reading != buttonState) {
buttonState = reading;
oldLedState = HIGH; // Elngedélyezük a blink5 hivást
// ha a nyomógomb állapota HIGH, benyomott, akkor
// átkapcsoljuk a LED állapotát az aktuális ellenkezőjére
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
// és ezzel az értékkel beállítjuk a LED állapotát:
digitalWrite(ledPin, ledState);
if((ledState == HIGH) && (oldLedState == HIGH)) blink5(); // !!!
// majd elmentjük. A loop következő lefutásánál már
// ez lesz a kezdő értéke ennek a változónak
lastButtonState = reading;
}
void blink5()
{
for(int i=0;i<5;i++){
digitalWrite(ledBPin,HIGH);
delay(500);
digitalWrite(ledBPin,LOW);
delay(500);
}
oldLedState = LOW; // tiljuk a további meghívást
}
Ugyan, legyen már kis bátorságod gondolkozni!
Mi lenne, ha 59. sort, átraknád a 63. közé 64.?
OK ... sajnos csak holnap tudom kipróbóbálni, egyenlőre nem világos ha a 70. sorban semmi sem változik miért javulna a helyzet. Tehát most 10X villan a LED.
Mert most 2* hívod meg a blink5 rutint.
1* Mikor lenyomod a gombot, 2. mikor felengeded!
Neked viszont, Csak az egyik változásra kellene reagálnia.
Köszi még egyszer. Jól működik, már tesztelgetek egy email küldő függvényt a villogó helyett.
Sziasztok! Valaki próbált már arduinóval emailt küldeni? Mert nekem nem akar működni, próbáltam több példaprogit, de nem akar menni, ha pedig nem dhcp-vel csinálom, akkor nem is csatlakozik. Előre is köszi!
Itt van, a jelszavam már megváltozott.
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip( 192, 168, 0, 177 );
char server[] = "smtp.upcmail.hu";
EthernetClient client;
void setup()
{
Serial.begin(9600);
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
Ethernet.begin(mac, ip);
delay(2000);
Serial.println(F(" Ready. Press 'e' to send."));
}
void loop()
{
byte inChar;
inChar = Serial.read();
if(inChar == 'e')
{
if(sendEmail()) Serial.println(F(" Email sent"));
else Serial.println(F(" Email failed"));
}
}
byte sendEmail()
{
byte thisByte = 0;
byte respCode;
if(client.connect(server,587)) {
Serial.println(F(" connected"));
} else {
Serial.println(F(" connection failed"));
return 0;
}
//if(!eRcv()) return 0;
//Serial.println(F("DATA"));
// user name
client.println(F("HELO Peti")); //HELO fontos ez nelkul lebasz a server !!
if(!eRcv()) return 0;
Serial.println(F(" AUTH LOGIN"));
// change to your email address (sender)
client.println(F("AUTH LOGIN"));
if(!eRcv()) return 0;
// change to recipient address
Serial.println(F(" gonda.peter72@upcmail.hu"));
Serial.println(F(" Z29uZGEucGV0ZXI3MkB1cGNtYWlsLmh1")); //base64 encoded
client.println(F("Z29uZGEucGV0ZXI3MkB1cGNtYWlsLmh1")); //base64 encoded
if(!eRcv()) return 0;
Serial.println(F(" 95586245"));
Serial.println(F(" OTU1ODYyNDU=")); //base64 encoded
client.println(F("OTU1ODYyNDU=")); //base64 encoded
if(!eRcv()) return 0;
Serial.println(F(" Sending email"));
// change to recipient address
client.println(F("MAIL FROM: gonda.peter72@upcmail.hu"));
client.println(F("RCPT TO: gonda.peter72@upcmail.hu"));
client.println(F("DATA"));
client.println(F("Subject: Arduino email test\r\n"));
client.println(F("This is from my Arduino!"));
client.println(F("."));
if(!eRcv()) return 0;
Serial.println(F("Sending QUIT"));
client.println(F("QUIT"));
if(!eRcv()) return 0;
client.stop();
Serial.println(F("disconnected"));
return 1;
}
byte eRcv()
{
byte respCode;
byte thisByte;
int loopCount = 0;
while(!client.available()) {
delay(1);
loopCount++;
// if nothing received for 10 seconds, timeout
if(loopCount > 10000) {
client.stop();
Serial.println(F("\r\nTimeout"));
return 0;
}
}
respCode = client.peek();
while(client.available())
{
thisByte = client.read();
Serial.write(thisByte);
}
if(respCode >= '4')
{
efail();
return 0;
}
return 1;
}
void efail()
{
byte thisByte = 0;
int loopCount = 0;
client.println(F("QUIT"));
while(!client.available()) {
delay(1);
loopCount++;
// if nothing received for 10 seconds, timeout
if(loopCount > 10000) {
client.stop();
Serial.println(F("\r\nTimeout"));
return;
}
}
while(client.available())
{
thisByte = client.read();
Serial.write(thisByte);
}
client.stop();
Serial.println(F(" disconnected"));
}
Köszi, kipróbáltam, de nekem ez is megakad, az eRcv()-nél, az egyébként micsoda?
Üdv!
Segítséget szeretnék kérni.
Adott egy arduino uno, egy ir vevő, és egy dc motor controller ( l298d).
Az ir a d2-es, a motor a 0 és 1, a motor enable lába a d11 lábakon.
Külön külön mindkettő remekül működik, ha viszont egyszerre szeretném használni akkor nem megy a motorvezérlő.
#include <EEPROM.h>
#include <IRremote.h>
#define E1 11 // Enable Pin for motor 1
#define I1 0 // Control pin 1 for motor 1
#define I2 1 // Control pin 2 for motor 1
int val = 70; // A motor mozgasa
int step = 20; // Lepes merete
int RECV_PIN = 2; // IR reciver PIN
char debug = 'START'; // A program allapota
byte engine = 1; // A motor allapota
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
//Serial.begin(9600);
pinMode(I1,OUTPUT);
pinMode(I2,OUTPUT);
pinMode(E1,OUTPUT);
irrecv.enableIRIn(); // Start the receiver
val = EEPROM.read(1);
engine = EEPROM.read(2);
}
void loop()
{
motor_works();
ir_works();
delay(500);
}
// motor basic work
void motor_works()
{
val= 90;
engine= 1;
if (engine == 1)
{
analogWrite(E1,val);
digitalWrite(I1, HIGH);
digitalWrite(I2, LOW);
}
else if (engine == 2)
{
analogWrite(E1,val);
digitalWrite(I1, LOW);
digitalWrite(I2, HIGH);
}
else
{
analogWrite(E1,0);
digitalWrite(I1, LOW);
digitalWrite(I2, LOW);
}
}
// Global ir proc
void ir_works()
{
//Serial.println("IR START");
if (irrecv.decode(&results))
{
// BAL
if (results.value == 0xFD8877)
{
engine = 1;
// Serial.println("BAL");
}
// JOBB
else if(results.value == 0xFD48B7)
{
engine = 2;
// Serial.println("JOBB");
}
// STOP
else if(results.value == 0xFD48B7){
engine = 0;
val=0;
// Serial.println("STOP");
}
//+25
else if(results.value == 0xFFE01F)
{
if (val > 230)
{
val = 255;
}
else
{
val = val + step;
}
//Serial.println("+20");
}
else if(results.value == 0xFFA857)
{
if (val - step < 70)
{
val = 70;
}
else
{
val = val - step;
}
//Serial.println("-20");
}
EEPROM.update(1,val);
EEPROM.update(2,engine);
}
irrecv.resume();
//Serial.println("IR END");
}
Ahogy kikommentelem a IRrecv irrecv(RECV_PIN); sort működik a motor. Mi lehet a gond?
A helyes megfejtőnek felajánlok 10db tiny rtc modult A hozzászólás módosítva: Júl 29, 2015
|
|