hauerit Postat Aprilie 6, 2020 Partajează Postat Aprilie 6, 2020 salut ! am o mare nelamurire ..am folosit codul asta de pe net si nu prea functioneaza .. ideea e simpla ,poti comanda cele 8 relee din serial monitor,,cu comenzile ,,-1,,+1,, on/off prin arduino mega2560 1 fiind nr releului ..zis si facut doar ca de la releul 1 la 6 nu primeste comanda iar la -8 porneste releul 7 si la -7 releul 8 orice alta comanda anuleaza celelalte comenzi ..multumesc mult daca ma poate ajuta cineva . #define RELAY1 52 #define RELAY2 50 #define RELAY3 48 #define RELAY4 46 #define RELAY5 44 #define RELAY6 42 #define RELAY7 40 #define RELAY8 38 void setup() { // Initialize the Arduino data pins for OUTPUT pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); pinMode(RELAY3, OUTPUT); pinMode(RELAY4, OUTPUT); pinMode(RELAY5, OUTPUT); pinMode(RELAY6, OUTPUT); pinMode(RELAY7, OUTPUT); pinMode(RELAY8, OUTPUT); //setting all pins to high so that all relays are off at start digitalWrite(RELAY1,HIGH); digitalWrite(RELAY2,HIGH); digitalWrite(RELAY3,HIGH); digitalWrite(RELAY4,HIGH); digitalWrite(RELAY5,HIGH); digitalWrite(RELAY6,HIGH); digitalWrite(RELAY7,HIGH); digitalWrite(RELAY8,HIGH); //wait for serial connect from COM Port while (!Serial); Serial.begin(19200); } void loop() { String command; char charBuf[5]; //waiting for data command if(Serial.available() > 0) { command = Serial.readStringUntil('\r'); command.toCharArray(charBuf, 5); } else return; //-1 - off relay 01 //+1 - on relay 01 if (charBuf[0]=='+') //relay off SetStatus(true, charBuf[1]); else if (charBuf[0]=='-') //relay on SetStatus(false, charBuf[1]); } void SetStatus(boolean on,char relayNumber) { int relayState =0;//off if (on) relayState =1;//on switch (relayNumber) { case '1': digitalWrite(RELAY1,relayState); break; case '2': digitalWrite(RELAY2,relayState); break; case '3': digitalWrite(RELAY3,relayState); break; case '4': digitalWrite(RELAY4,relayState); break; case '5': digitalWrite(RELAY5,relayState); break; case '6': digitalWrite(RELAY6,relayState); break; case '7': digitalWrite(RELAY7,relayState); break; case '8': digitalWrite(RELAY8,relayState); break; } } Link spre comentariu
Liviu M Postat Aprilie 6, 2020 Partajează Postat Aprilie 6, 2020 (editat) Mie singura chestie neclara mi-e formatul lui charBuf[1]. 1 oră în urmă, hauerit a spus: if (charBuf[0]=='+') //relay off SetStatus(true, charBuf[1]); else if (charBuf[0]=='-') //relay on SetStatus(false, charBuf[1]); } In conditiile in care charBuf[0] e un caracter ('+' sau '-'), ma intreb daca nu cumva si charBuf[1] nu e tot un caracter (ASCII), drept pentru care as incerca cu if (charBuf[0]=='+') //relay off SetStatus(true, charBuf[1] - '0'); //scade codul ascii al lui 0 else if (charBuf[0]=='-') //relay on SetStatus(false, charBuf[1] - '0'); //scade codul ascii al lui 0 } Editat Aprilie 6, 2020 de Liviu M Link spre comentariu
Liviu M Postat Aprilie 6, 2020 Partajează Postat Aprilie 6, 2020 Oricum, constat ca programatorilor de Arduino le place sa scrie linii de cod "fara numar, fara numar". Mai putin cand e cazul sa fie vorbareti (si sa puna acolade). Mie mi-ar fi iesit ceva mai "grupat" #define RELAY1 52 #define RELAY2 50 #define RELAY3 48 #define RELAY4 46 #define RELAY5 44 #define RELAY6 42 #define RELAY7 40 #define RELAY8 38 uint8_t relays[] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6, RELAY7, RELAY8}; void SetStatus(boolean on, char relayNumber); void setup() { // Initialize the Arduino data pins for OUTPUT //setting all pins to high so that all relays are off at start for(uint8_t i = 0; i < 8; i++) { pinMode(relays[i], OUTPUT); digitalWrite(relays[i],HIGH); } //wait for serial connect from COM Port while (!Serial); Serial.begin(19200); } void loop(){ String command; char charBuf[5]; //waiting for data command if(Serial.available() > 0) { command = Serial.readStringUntil('\r'); command.toCharArray(charBuf, 5); } else { return; } //-1 - off relay 01 //+1 - on relay 01 if (charBuf[0]=='+') { //relay off SetStatus(true, charBuf[1] - '0'); } else if (charBuf[0]=='-') { //relay on SetStatus(false, charBuf[1] - '0'); } } void SetStatus(boolean on, char relayNumber){ int relayState = LOW;//off if (on){ relayState =HIGH;//on } digitalWrite(relays[relayNumber],relayState); } Link spre comentariu
hauerit Postat Aprilie 6, 2020 Autor Partajează Postat Aprilie 6, 2020 Chiar acum, Liviu M a spus: Oricum, constat ca programatorilor de Arduino le place sa scrie linii de cod "fara numar, fara numar". Mai putin cand e cazul sa fie vorbareti (si sa puna acolade). Mie mi-ar fi iesit ceva mai "grupat" #define RELAY1 52 #define RELAY2 50 #define RELAY3 48 #define RELAY4 46 #define RELAY5 44 #define RELAY6 42 #define RELAY7 40 #define RELAY8 38 uint8_t relays[] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6, RELAY7, RELAY8}; void SetStatus(boolean on, char relayNumber); void setup() { // Initialize the Arduino data pins for OUTPUT //setting all pins to high so that all relays are off at start for(uint8_t i = 0; i < 8; i++) { pinMode(relays[i], OUTPUT); digitalWrite(relays[i],HIGH); } //wait for serial connect from COM Port while (!Serial); Serial.begin(19200); } void loop(){ String command; char charBuf[5]; //waiting for data command if(Serial.available() > 0) { command = Serial.readStringUntil('\r'); command.toCharArray(charBuf, 5); } else { return; } //-1 - off relay 01 //+1 - on relay 01 if (charBuf[0]=='+') { //relay off SetStatus(true, charBuf[1] - '0'); } else if (charBuf[0]=='-') { //relay on SetStatus(false, charBuf[1] - '0'); } } void SetStatus(boolean on, char relayNumber){ int relayState = LOW;//off if (on){ relayState =HIGH;//on } digitalWrite(relays[relayNumber],relayState); } salut !multumesc mult.. chiar merge ..comenzile sunt de la 0 la 7 ..macar de atat m,am prins si eu ..sunt la inceputuri Link spre comentariu
hauerit Postat Aprilie 6, 2020 Autor Partajează Postat Aprilie 6, 2020 Chiar acum, Liviu M a spus: Mie singura chestie neclara mi-e formatul lui charBuf[1]. In conditiile in care charBuf[0] e un caracter ('+' sau '-'), ma intreb daca nu cumva si charBuf[1] nu e tot un caracter (ASCII), drept pentru care as incerca cu if (charBuf[0]=='+') //relay off SetStatus(true, charBuf[1] - '0'); //scade codul ascii al lui 0 else if (charBuf[0]=='-') //relay on SetStatus(false, charBuf[1] - '0'); //scade codul ascii al lui 0 } multumesc frumos .. Link spre comentariu
Liviu M Postat Aprilie 7, 2020 Partajează Postat Aprilie 7, 2020 (editat) Cu placere. Acum 9 ore, hauerit a spus: comenzile sunt de la 0 la 7 Ai dreptate, ca sa mearga de la 1 la 8, la ultima linie trebuia sa scad 1 din index: digitalWrite(relays[relayNumber - 1],relayState); A propos, eu as mai pune si o mica intarziere dupa modificarea releelor, sa le dau timp sa se miste: void SetStatus(boolean on, char relayNumber){ int relayState = LOW;//off if (on){ relayState =HIGH;//on } digitalWrite(relays[relayNumber],relayState); delay(5 ms); //asteapta releul sa ajunga in noua pozitie. } Editat Aprilie 7, 2020 de Liviu M Link spre comentariu
Liviu M Postat Aprilie 7, 2020 Partajează Postat Aprilie 7, 2020 (editat) Ca tot vorbeam de scris putin, o varianta echivalenta si mai scurta ar iesi: #define RELAY1 52 #define RELAY2 50 #define RELAY3 48 #define RELAY4 46 #define RELAY5 44 #define RELAY6 42 #define RELAY7 40 #define RELAY8 38 uint8_t relays[] = {RELAY1, RELAY2, RELAY3, RELAY4, RELAY5, RELAY6, RELAY7, RELAY8}; void SetStatus(boolean on, char relayNumber); void setup() { // Initialize the Arduino data pins for OUTPUT //setting all pins to high so that all relays are off at start for(uint8_t i = 0; i < 8; i++) { pinMode(relays[i], OUTPUT); digitalWrite(relays[i],HIGH); } //wait for serial connect from COM Port while (!Serial); Serial.begin(19200); } void loop(){ String command; //waiting for data command if(Serial.available() > 0) { command = Serial.readStringUntil('\r'); boolean bNewState = false; if (command[0]=='+') { //relay off bNewState = true; } else if(command[0]!='-') { //bad data on serial port, return return; } uint8_t relIdx = command[1] - '0'; digitalWrite(relays[relIdx - 1], bNewState); delay(5); } } De compilat se compileaza, de testat n-am cum. Editat Aprilie 7, 2020 de Liviu M Link spre comentariu
Gilbert Sparios Postat Iunie 22, 2020 Partajează Postat Iunie 22, 2020 (editat) nu toti utilizatorii de arduino scriu fara număr. e vorba de începători. oricum arduino in sine e pentru începători dar când depășești stadiul de incepator, garantat apar si codurile de intreruperi, optimizari etc. sa nu fim rai, la toți a fost un început. candva. acei "fara număr" sunt sigur ca nu au astfel de preocupari vreodata. (smile) Editat Iunie 22, 2020 de Gilbert Sparios Link spre comentariu
Blink Postat Iulie 6, 2020 Partajează Postat Iulie 6, 2020 De ce mai dati nume la pini daca oricum nu le folositi? uint8_t relays[] = {52, 50, 48, 46, 44, 42, 40, 38}; Link spre comentariu
Liviu M Postat Iulie 7, 2020 Partajează Postat Iulie 7, 2020 Copy/paste. Numele erau deja definite. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum