// 09_04_2025 // Sist_dezv_uno -- Software pentru modulele: "Multiio", "Gen_uno" si "Modulul aplicatii" realizate cu Arduino Uno // Comenzi: // SG,val_pwm -- Start generatoare Sinus - P6 si Dinfi de fierastrau - P5 cu frecventa proportionala cu val_pwm, Aprindere p7 // PWM,val_pwm -- Generare PWM - P6 cu valoarea val_pwm. Se raspunde cu "AA,val_A0,...,val_A4,DI,val_B" // AX4,val -- Afisare pe 4 digiti 7 segmente a valorii val.Se raspunde cu "A0,val_A0" // C0,val ... C3,val -- Activare coloana din matrice de leduri // M1,val_b -- Citire intrari analogice si comanda led-uri cu val_b (se trimite si suma de control) // AA -- Citire valori analogice si DI // A0 ... A4 -- Citire valoare analogica A0 ... A4 // O,val -- Invalidare generator sinus si df, Activare led-uri cu valoarea val. Se raspunde cu "AO,val_A0" // DI -- Citire intrari digitale si transmitere val=B0+2*B1+4*B2+8*B3 // BT,val_bt -- Setare baza de timp (bt are valori intre 0-2500) // AI0,val_bt,val_pwm -- Citire pachet de date A0,A1, Generare pwm pe p6 cu valoarea val_pwm, Generare frecventa pe p10 cu factorul de umplere val_pwm, Aprindere p7, Invalidare sin // AI1,val_bt,val_pwm -- Citire pachet de date A0,A1 (200 valori A0, 200 valori A1) // AI2,val_bt,val_pwm -- Citire pachet de date A0,A2 (200 valori A0, 200 valori A2) // AI3,val_bt,val_pwm -- Citire pachet de date A0,A3 (200 valori A0, 200 valori A3) // AI4,val_bt,val_pwm -- Citire pachet de date A0,A4 (200 valori A0, 200 valori A4) // D1I,val_bt,val_pwm -- Citire pachet de date B0,B1,B2,B3 (400 de valori zecimale=B0+2*B1+4*B2+8*B3) #include int pin_B0 = 8; int pin_B1 = 11; int pin_B2 = 12; int pin_B3 = 13; int pin_L1 = 9; int pin_L2 = 10; int pin_L3 = 2; int pin_L4 = 3; int pin_L5 = 4; int pin_L6 = 5; int pin_L7 = 6; int pin_L8 = 7; int val_A0,val_A1,val_A2,val_A3,val_A4,val_A5,val_B0,val_B1,val_B2,val_B3,val_B,check; int val_L1,val_L2,val_L3,val_L4,val_L5,val_L6,val_L7,val_L8; int v1,k,index, freqInput = 25; double alfa,val_sin,val_df; String rx,tx,cmd, s_cmd ,str; unsigned short val_cmd, val_bt=0, val_pwm=150; String strs[5]; int vals_c1[200]; int vals_c2[200]; // definire caractere pe 7 segmente int car[12][8]={ {1,0,0,0,1,0,0,0}, {1,1,1,0,1,0,1,1}, {0,1,0,0,1,1,0,0}, {0,1,0,0,1,0,0,1}, {0,0,1,0,1,0,1,1}, {0,0,0,1,1,0,0,1}, {0,0,0,1,1,0,0,0}, {1,1,0,0,1,0,1,1}, {0,0,0,0,1,0,0,0}, {0,0,0,0,1,0,0,1}, {1,1,1,1,1,1,1,1}, {0,0,0,0,0,0,0,0} }; void setup() { // initialize serial communication at 9600 bits per second: // Serial.begin(38400); //Serial.begin(9600); Serial.begin(153600); Serial.setTimeout(10); InitTimersSafe(); pinMode(pin_B0, INPUT); pinMode(pin_B1, INPUT); pinMode(pin_B2, INPUT); pinMode(pin_B3, INPUT); pinMode(pin_L1, OUTPUT); pinMode(pin_L2, OUTPUT); pinMode(pin_L3, OUTPUT); pinMode(pin_L4, OUTPUT); pinMode(pin_L5, OUTPUT); pinMode(pin_L6, OUTPUT); pinMode(pin_L7, OUTPUT); pinMode(pin_L8, OUTPUT); SetPinFrequencySafe(pin_L2, 100 ); // 100Hz frecventa initiala pwmWrite(pin_L2, 125); // factorul de umplere SetPinFrequencySafe(pin_L2, 0 ); // Generez frecventa 0 pentru inceput pe p10 //digitalWrite(pin_L2,0); // initializare matricea de comenzi for (int i=0;i<5;i++){ strs[i]=" "; } } void activ_led() { val_L1=val_cmd%2; val_cmd=val_cmd/2; digitalWrite(pin_L1,val_L1); val_L2=val_cmd%2; val_cmd=val_cmd/2; digitalWrite(pin_L2,val_L2); val_L3=val_cmd%2; val_cmd=val_cmd/2; digitalWrite(pin_L3,val_L3); val_L4=val_cmd%2; val_cmd=val_cmd/2; digitalWrite(pin_L4,val_L4); val_L5=val_cmd%2; val_cmd=val_cmd/2; digitalWrite(pin_L5,val_L5); val_L6=val_cmd%2; val_cmd=val_cmd/2; digitalWrite(pin_L6,val_L6); val_L7=val_cmd%2; val_cmd=val_cmd/2; digitalWrite(pin_L7,val_L7); val_L8=val_cmd%2; digitalWrite(pin_L8,val_L8); } bool act_sin=false; // Invalidare generator sinus si df -- Sist_dezv_uno //bool act_sin=true; // Validare generator sinus si df ---Gen_uno // the loop routine runs over and over again forever: void loop() { val_A0 = analogRead(A0); val_A1 = analogRead(A1); val_A2 = analogRead(A2); val_A3 = analogRead(A3); val_A4 = analogRead(A4); val_A5 = analogRead(A5); val_B0 = digitalRead(pin_B0); val_B1 = digitalRead(pin_B1); val_B2 = digitalRead(pin_B2); val_B3 = digitalRead(pin_B3); val_B=val_B0+2*val_B1+4*val_B2+8*val_B3; tx=""; rx=Serial.readString(); // versiunea 1 -extrag numai 2 comenzi /* s_cmd=rx.substring(4,rx.length()); // Extrag sirul de dupa "D1I," index= s_cmd.indexOf(','); // Pozitia primului separator "," if(index==-1){ cmd=s_cmd; cmd.trim(); val_bt=(short int)cmd.toInt(); val_pwm=0; } else{ cmd=s_cmd.substring(0, index); // Extrag prima valoare -- Baza de timp cmd.trim(); val_bt=(short int)cmd.toInt(); cmd = s_cmd.substring(index+1); // Extrag a doua valoare -- PWM if(index==-1) val_pwm=0; else val_pwm=(short int)cmd.toInt(); } */ // versiunea 2 extrag oricate comenzi (in acest caz 5 comenzi str=rx; // Despachetare comenzi primite if(str.length()>0){ int ult=1; for (int i=0;i<5;i++) { index = str.indexOf(','); if (index == -1) // Nu s-a gasit separatorul ',' { if(ult==1) // este ultima comanda strs[i] = str; else strs[i]=" "; ult=0; } else { strs[i] = str.substring(0, index); str = str.substring(index+1,str.length()); ult=1; } } } // end despachetare comenzi primite cmd=strs[1]; //cmd=rx.substring(3,rx.length()); cmd.trim(); // Pentru Sist_dezv_uno ------------------------------------------------------ val_pwm=(short int)cmd.toInt(); if(act_sin) // Sunt validate generatoarele sin si dinti_f { analogWrite(5,val_df); // se trimite dinte de fierastrau (df) la p5 val_sin=127.0*(1+sin(alfa)); analogWrite(6,val_sin); // se trimite sin la p6 //alfa=alfa+0.01+val_pwm/255; // Timp real alfa=alfa+val_pwm/2550.0; // Timp real //alfa=alfa+0.05; // Pachet de date if(alfa>6.28) { alfa=0; } val_df=val_df+val_pwm/70.0; if(val_df>242) { val_df=0; } } // ---------------------------------------------------------------------------- /* // Pentru Gen_uno ------------------------------------------------------------- act_sin=true; // Validare generator sinus si df ---Gen_uno val_pwm=val_A0/4; if(act_sin) // Sunt validate generatoarele sin si dinti_f { analogWrite(5,val_df); // se trimite dinte de fierastrau (df) la p5 val_sin=127.0*(1+sin(alfa)); analogWrite(6,val_sin); // se trimite sin la p6 if(sin(alfa)>0) // se trimite semnal dreptunghiular (dr) la p9 digitalWrite(9,true); else digitalWrite(9,false); SetPinFrequencySafe(pin_L2, val_pwm+100 ); // Generez frecventa pe p10 alfa=alfa+val_pwm/2550.0; //Timp real if(alfa>6.28) { alfa=0; } val_df=val_df+val_pwm/70.0; if(val_df>242) { val_df=0; } } // ----------------------------------------------------------------------------- */ if(rx.substring(0,2)=="BT") // Setare baza de timp { cmd=rx.substring(3,rx.length()); cmd.trim(); val_bt=(short int)cmd.toInt(); } if(rx.substring(0,2)=="SG") // Start generatoare sin si df { cmd=rx.substring(3,rx.length()); cmd.trim(); val_pwm=(short int)cmd.toInt(); act_sin=true; //analogWrite(6,val_pwm); // se trimite comanda la p6 digitalWrite(7,1); // se aprinde p7 tx="SG,"+String(val_pwm); Serial.print(tx); } if(rx.substring(0,3)=="PWM") // Generare pwm pe p-6 { cmd=rx.substring(4,rx.length()); cmd.trim(); val_pwm=(short int)cmd.toInt(); act_sin=false; analogWrite(6,val_pwm); // se trimite comanda la p6 //digitalWrite(7,1); // se aprinde p7 //tx="PWM,"+String(val_pwm); //tx="A0,"+String(val_A0); tx="AA,"+String(val_A0)+","+String(val_A1)+","+String(val_A2)+","+String(val_A3)+","+String(val_A4)+",DI,"+String(val_B); Serial.print(tx); } if(rx.substring(0,2)=="C0"){ cmd=rx.substring(3,rx.length()); cmd.trim(); val_cmd=(short int)cmd.toInt(); tx="C0,"+cmd; Serial.print(tx); //Activez led-urile corespunzatoare activ_led(); //Validare C0 pinMode(pin_B0, OUTPUT); digitalWrite(pin_B0,0); // invalidare C1,C2,C3,C4 pinMode(pin_B1, INPUT); pinMode(pin_B2, INPUT); pinMode(pin_B3, INPUT); digitalWrite(pin_L8,1); } if(rx.substring(0,2)=="C1"){ cmd=rx.substring(3,rx.length()); cmd.trim(); val_cmd=(short int)cmd.toInt(); tx="C1,"+cmd; Serial.print(tx); //Activez led-urile corespunzatoare activ_led(); //Validare C1 pinMode(pin_B1, OUTPUT); digitalWrite(pin_B1,0); // Invalidare C0,C2,C3,C4 pinMode(pin_B0, INPUT); pinMode(pin_B2, INPUT); pinMode(pin_B3, INPUT); digitalWrite(pin_L8,1); } if(rx.substring(0,2)=="C2"){ cmd=rx.substring(3,rx.length()); cmd.trim(); val_cmd=(short int)cmd.toInt(); tx="C2,"+cmd; Serial.print(tx); //Activez led-urile corespunzatoare activ_led(); //Validare C2 pinMode(pin_B2, OUTPUT); digitalWrite(pin_B2,0); // Invalidare C0,C1,C3,C4 pinMode(pin_B0, INPUT); pinMode(pin_B1, INPUT); pinMode(pin_B3, INPUT); digitalWrite(pin_L8,1); } if(rx.substring(0,2)=="C3"){ cmd=rx.substring(3,rx.length()); cmd.trim(); val_cmd=(short int)cmd.toInt(); tx="C3,"+cmd; Serial.print(tx); //Activez led-urile corespunzatoare activ_led(); //Validare C3 pinMode(pin_B3, OUTPUT); digitalWrite(pin_B3,0); // Invalidare C0,C1,C2,C4 pinMode(pin_B0, INPUT); pinMode(pin_B1, INPUT); pinMode(pin_B2, INPUT); digitalWrite(pin_L8,1); } if(rx.substring(0,2)=="C4"){ cmd=rx.substring(3,rx.length()); cmd.trim(); val_cmd=(short int)cmd.toInt(); tx="C4,"+cmd; Serial.print(tx); //Activez led-urile corespunzatoare activ_led(); //Validare C4 digitalWrite(pin_L8,0); // Invalidare C0,C1,C2,C3 pinMode(pin_B0, INPUT); pinMode(pin_B1, INPUT); pinMode(pin_B2, INPUT); pinMode(pin_B3, INPUT); } if(rx.substring(0,2)=="M1"){ val_cmd=(short int)cmd.toInt(); // Activez led-urile activ_led(); check=(val_A0+val_A1+val_A2+val_A3+val_A4+val_A4+val_A4+val_B)%1024; //Trimit datele masurate tx="M1,"+String(val_A0)+","+String(val_A1)+","+String(val_A2)+","+String(val_A3)+","+String(val_A4)+","+String(val_A5)+","+String(val_B)+","+String(check)+",0"; Serial.print(tx); } if(rx.substring(0,2)=="AA"){ tx="AA,"+String(val_A0)+","+String(val_A1)+","+String(val_A2)+","+String(val_A3)+","+String(val_A4)+",DI,"+String(val_B); cmd=rx.substring(3,rx.length()); cmd.trim(); val_pwm=(short int)cmd.toInt(); Serial.print(tx); } if(rx.substring(0,2)=="A0"){ tx="A0,"+String(val_A0); Serial.print(tx); } if(rx.substring(0,2)=="A1"){ tx="A1,"+String(val_A1); Serial.print(tx); } if(rx.substring(0,2)=="A2"){ tx="A2,"+String(val_A2); Serial.print(tx); } if(rx.substring(0,2)=="A3"){ tx="A3,"+String(val_A3); Serial.print(tx); } if(rx.substring(0,2)=="A4"){ tx="A4,"+String(val_A4); Serial.print(tx); } if(rx.substring(0,2)=="DI"){ pinMode(pin_B0, INPUT); pinMode(pin_B1, INPUT); pinMode(pin_B2, INPUT); pinMode(pin_B3, INPUT); val_B0 = digitalRead(pin_B0); val_B1 = digitalRead(pin_B1); val_B2 = digitalRead(pin_B2); val_B3 = digitalRead(pin_B3); val_B=val_B0+2*val_B1+4*val_B2+8*val_B3; tx="DI,"+String(val_B); Serial.print(tx); } if(rx.substring(0,1)=="O"){ if(rx.substring(1,2)==","){ cmd=rx.substring(2,rx.length()); } else{ cmd=rx.substring(1,rx.length()); } cmd.trim(); val_cmd=(short int)cmd.toInt(); act_sin=false; // Invalidare generator sinus si df // Activez led-urile activ_led(); //tx="O,"+cmd; //Trimit inapoi comanda tx="A0,"+String(val_A0); //Trimit inapoi val_A0 Serial.print(tx); } if(rx.substring(0,3)=="AI0"){ cmd=strs[1]; cmd.trim(); val_bt=(short int)cmd.toInt(); cmd=strs[2]; cmd.trim(); val_pwm=(short int)cmd.toInt(); act_sin=false; analogWrite(6,val_pwm); // se trimite comanda la p6 digitalWrite(7,1); // se aprinde p7 pwmWrite(pin_L2, 125); // factorul de umplere SetPinFrequencySafe(pin_B1, val_pwm+125 ); // Generez frecventa pe p10 for (int i=0;i<200;i++){ vals_c1[i]=analogRead(A0); vals_c2[i]=analogRead(A1); // baza de timp k=0; while(k