1+ // 28/05/2017 => bug v1.5 => qdo aumenta 1 canal dá erro na serial (disabling serial)
2+ // 22/05/2017 => versão 1.5 => dynamic buffer - 1ch=400pt/ch, 2chs=200pt/ch, 3chs=130pt/ch, 4chs=100pt/ch
13// 21/01/2017 => versão 1.4 => melhorar o trigger: informar valor e sentido (subindo/descendo)
24// 13/03/2016 => versão 1.3 => alterar o clock do ADC para ler maiores frequencias
35// 14/09/2015 => implementei TimerOne.h pin9(pwm) e pino10(2*periodo) output
46// 03/08/2016 => versão 1.2 => ler resistor em A5
57// 26/07/2015 => versão 1.1 => ler em microsegundos
68// String versao="1.2"; // versão do programa -
7- #define versao " 1.4 "
9+ #define versao " v1.5 "
810
911/* trabalhando com TimerOne
1012 Timer1.initializa(us); // inicializa o timer1 (chamar primeiro)
@@ -40,16 +42,34 @@ boolean pwmOn=true;
4042unsigned long pwmP=100000 ; // Periodo 100000u=100m=0.1s => 10Hz
4143byte pwmPon=25 ; // % do pwmP em HIGH
4244
43- byte q= 100 ; // quantidade de leituras
45+ /* -- 07/May/2017 --
4446int v0[100];
4547int v1[100];
4648int v2[100]; // guarda os valores das leituras
4749int v3[100]; // acrescentei mais um canal em 15/10/2015
48- int vtrigger=0 ; // tenssao de trigger
49- // byte v0[100];
50- // byte v1[100];
51- // byte v2[100]; // guarda os valores das leituras
52- // byte v3[100]; // acrescentei mais um canal em 15/10/2015
50+ */
51+ /* ------------------------------------------------
52+ /* I changed the 4 buffers (v0[100],v1[],v2[],v3[]) above
53+ * by 1 buffer bellow (vb[408])
54+ * The chq indicates how many channels will use and the buffer
55+ * will be divided by then:
56+ * 4 ch (q=102) => 0-101, 102-203, 204-305, 306-407
57+ * 3 ch (q=136) => 0-135, 136-271, 272-407
58+ * 2 ch (q=204) => 0-203, 204-407
59+ * 1 ch (q=408) => 0-407
60+ * chi[n] indicates the initial position of the buffer
61+ * q indicates the size of channel buffer
62+ ------------------------------------------------
63+ */
64+ int vb[400 ]; // (100*4=400) buffer stores the measure values of all channels
65+ // (old) int chi[]={0,102,204,306}; // channel init position on buffer vb[]
66+ int chi[]={0 ,100 ,200 ,300 }; // channel init position on buffer vb[]
67+ int chq=4 ; // how many channels are ON
68+ int q=100 ; // quantidade de leituras
69+ int qmax=100 ; // qtd maxima permitida para q
70+ // (new) chq-qmax; 4-100; 3-130; 2-200; 1-400
71+ // (old) chq-qmax; 4-102; 3-136; 2-204; 1-408
72+ int vtrigger=0 ; // tensao de trigger
5373boolean Ch[]={true ,true ,true ,true }; // ativa/desativa canais
5474unsigned int dt=4 ; // 100us a 1000us(1ms) a 3000ms(3s)
5575char unidade=' m' ; // unidade: m=milisegundo, u=microsegundo
@@ -59,7 +79,7 @@ char unidade='m'; // unidade: m=milisegundo, u=microsegundo
5979// 1 canal deve dar 120us
6080
6181boolean varias=false ; // v = varias
62- boolean uma=true ; // u = uma
82+ boolean uma=false ; // u = uma
6383boolean fluxo=false ; // f = fluxo de dados (envia cada leitura sem guardar na memoria)
6484 // velocidade limitada pela serial 115200
6585unsigned long dtReal, tIni, tFim; // contador de final de tempo para o fluxo
@@ -103,6 +123,10 @@ void setup() {
103123 // Timer1.stop();
104124
105125 // inicializar A0, A1, A2, A3 com pull_up
126+ // não ficou bom pois qdo não tem nada conectado na porta, ela fica
127+ // com 5v. O melhor é colocar um pull_down com resistor
128+ // A0___|R=20k|___GND
129+ // |__ Vinput
106130 /*
107131 * pinMode(A0,INPUT_PULLUP);
108132 * pinMode(A1,INPUT_PULLUP);
@@ -113,8 +137,10 @@ void setup() {
113137 // Serial.begin(9600);
114138 Serial.begin (115200 );
115139 // Serial.begin(250000);
116- printHelp ();
117- printConfig ();
140+ Serial.println ();
141+ Serial.print (" >init=" ); Serial.println (versao);
142+ // printHelp();
143+ // printConfig();
118144
119145 // ler Resistor e Capacitor
120146 // pinMode(pinCarga,OUTPUT);
@@ -180,12 +206,13 @@ void lerSerial(){
180206 case ' q' : // alterar valor do q.(ponto no final) (quantidade de leituras)
181207 k=Serial.parseInt (); // inteiro de 0 a 32767
182208 c=Serial.read (); // para ir mais rápido colocar um . no final ex: q150.
183- if (k>=1 && k<=100 ) {
209+ if (k>=1 && k<=qmax ) {
184210 q=k;
185211 }
186- // Serial.print("=> q="); Serial.println(q);
212+ // calcBuffer(); //não precisa pois será usado o qmax
213+ Serial.print (" => q=" ); Serial.println (q);
187214 break ;
188- case ' c' : // (1 )ativa/(0 )desativa canal n exemplo: c01 , c10
215+ case ' c' : // cnm : n=0-3, m=(o )ativa/(x )desativa canal n exemplo: c0x , c2o
189216 delay (100 );
190217 c=Serial.read ();
191218 delay (100 );
@@ -196,6 +223,11 @@ void lerSerial(){
196223 }else if (c2==' x' ){
197224 Ch[c-' 0' ]=false ;
198225 }
226+ // recalcular o buffer para cada canal e colocar o indice
227+ // inicial para cada canal
228+ // Serial.println("entrar calcBuffer");
229+ calcBuffer ();
230+ // Serial.println("saiu calcBuffer");
199231/* Serial.print("=> Canais: ");
200232 for (k=0; k<3;k++){
201233 Serial.print("Ch"); Serial.print(k); Serial.print("="); Serial.print(Ch[k]);
@@ -223,7 +255,7 @@ void lerSerial(){
223255// Serial.print("=> canalTrigger="); Serial.println(canalTrigger);
224256 break ;
225257 case ' ?' :
226- printConfig ();
258+ printConfig ();
227259 break ;
228260 case ' 1' : // enviar Uma Amostra (q leituras)
229261 if (!uma) uma=true ;
@@ -330,9 +362,61 @@ void lerSerial(){
330362 }
331363}
332364
365+ void calcBuffer (){
366+ // Serial.println("entrou calcBuffer");
367+ chq=0 ;
368+ // conta a quantidade de canais ativos
369+ for (int k=0 ;k<4 ;k++){
370+ if (Ch[k]) {chq+=1 ;}
371+ }
372+ // calc size of each channel
373+ switch (chq){
374+ case 0 :
375+ qmax=0 ;
376+ break ;
377+ case 1 :
378+ qmax=400 ;
379+ break ;
380+ case 2 :
381+ qmax=200 ;
382+ break ;
383+ case 3 :
384+ qmax=130 ;
385+ break ;
386+ case 4 :
387+ qmax=100 ;
388+ break ;
389+ }
390+ /*
391+ if (chq<=0) {
392+ qmax=0;
393+ } else {
394+ qmax=408/chq; // chq-qmax; 4-102; 3-136; 2-204; 1-408
395+ }
396+ */
397+ if (q>qmax) {
398+ q=qmax;
399+ }
400+ // Serial.print("q=408/chq=");Serial.print("408/");Serial.print(chq);Serial.print("=");Serial.println(q);
401+ // qtdCanais-qmax (chq-qmax) (4-100) (3-130) (2-200) (1-400)
402+ int chInit=0 ;
403+ for (int k=0 ; k<4 ; k++){
404+ if (Ch[k]) {
405+ chi[k]=chInit;
406+ chInit+=qmax;
407+ }
408+ }
409+
410+ // Serial.print("chq="); Serial.print(chq); Serial.print(" q="); Serial.print(q); Serial.print(" qmax="); Serial.println(qmax);
411+ // for (int k=0; k<4; k++){
412+ // Serial.print("k=");Serial.print(k); Serial.print(" chi[k]="); Serial.println(chi[k]);
413+ // }
414+
415+ }
416+
333417void printHelp (){
334418 Serial.println (" -----------------------" );
335- Serial.print (" ! GaraginOscopio v " ); Serial.print (versao); Serial.println (" - RB !" );
419+ Serial.
print (
" ! BegOscopio " ); Serial.
print (versao); Serial.
println (
" - [email protected] !" );
336420 Serial.println (" -----------------------" );
337421/*
338422 Serial.println("----------- help ---------------------");
@@ -359,15 +443,23 @@ void printHelp(){
359443 */
360444}
361445
446+
447+
362448void printConfig (){
363449 Serial.println (" ------ configuracoes -------" );
364450 Serial.print (" >? q=" ); Serial.println (q);
451+ Serial.print (" >? qmax=" ); Serial.println (qmax);
365452 Serial.print (" >? dt=" ); Serial.print (dt); Serial.print (unidade); Serial.println (" s" );
366453 float t=(float )q * (float )dt;
367454 Serial.print (" -> T=(q*dt)= " ); Serial.print (t); Serial.print (unidade); Serial.println (" s " );
368455 Serial.print (" >? Canais: " );
369456 for (int k=0 ; k<4 ; k++){
370- Serial.print (" Ch" ); Serial.print (k); Serial.print (" =" ); Serial.print (Ch[k]);
457+ Serial.print (" Ch" ); Serial.print (k); Serial.print (" =" );
458+ if (Ch[k]) {
459+ Serial.print (" o" );
460+ } else {
461+ Serial.print (" x" );
462+ }
371463 }
372464 Serial.println ();
373465 Serial.print (" >? canalTrigger=" ); Serial.println (canalTrigger);
@@ -380,6 +472,7 @@ void printConfig(){
380472 Serial.print (" >? pwmPon=" ); Serial.print (pwmPon); Serial.println (" %" );
381473}
382474
475+
383476unsigned long microsOuMillis (){
384477 if (unidade==' u' ){
385478 return micros ();
@@ -425,25 +518,56 @@ boolean trigger(){ // a variavel canalTrigger indica qual canal fará o trigger:
425518
426519
427520void lerEnviar (){
521+
522+ /*
523+ // enviar quais canais serao enviados. ex: >ch=1<\t>3<\t>
524+ Serial.print(">chq="); Serial.print(chq); Serial.print("\t");
525+ for (int k=0; k<4; k++){
526+ if (Ch[k]){Serial.print(k); Serial.print("\t");}
527+ }
528+ Serial.println("");
529+
530+ //enviar os valores dos canais
531+ for (int k=0; k<q; k++){
532+ Serial.print(">v="); Serial.print(k); Serial.print("\t");
533+ if (Ch[0]) {Serial.print(chi[0]+k); Serial.print("\t");}
534+ if (Ch[1]) {Serial.print(chi[1]+k); Serial.print("\t");}
535+ if (Ch[2]) {Serial.print(chi[2]+k); Serial.print("\t");}
536+ if (Ch[3]) {Serial.print(chi[3]+k); Serial.print("\t");}
537+ Serial.println("");
538+ }
539+
540+
541+ return;
542+
543+ */
544+
545+
428546 unsigned long tFim; // contador do tempo Final
429547 unsigned long tTotalReal; // tempo Total da leitura dos valores.
430548 if (canalTrigger>=' 0' && canalTrigger<=' 3' ){
431549 // Serial.print("canalTrigger=");Serial.println(canalTrigger);
432550 Serial.print (" trigger=" ); Serial.println (trigger ());
433551 }
434552 tTotalReal=microsOuMillis ();
553+
435554 for (int k=0 ; k<q; k++){
436555 tFim=microsOuMillis ()+dt;
556+ /*
437557 if (Ch[0]) {v0[k]=analogRead(A0);}
438558 if (Ch[1]) {v1[k]=analogRead(A1);}
439559 if (Ch[2]) {v2[k]=analogRead(A2);}
440560 if (Ch[3]) {v3[k]=analogRead(A3);}
441- // if (Ch[0]) {v0[k]=analogRead(A0)/4;}
442- // if (Ch[1]) {v1[k]=analogRead(A1)/4;}
443- // if (Ch[2]) {v2[k]=analogRead(A2)/4;}
444- // if (Ch[3]) {v3[k]=analogRead(A3)/4;}
561+ */
562+
563+ if (Ch[0 ]) {vb[chi[0 ]+k]=analogRead (A0);}
564+ if (Ch[1 ]) {vb[chi[1 ]+k]=analogRead (A1);}
565+ if (Ch[2 ]) {vb[chi[2 ]+k]=analogRead (A2);}
566+ if (Ch[3 ]) {vb[chi[3 ]+k]=analogRead (A3);}
445567 while (microsOuMillis ()<tFim){}
446568 }
569+
570+
447571 tTotalReal=microsOuMillis ()-tTotalReal; // total de tempo para ler todas as amostras
448572 dtReal=tTotalReal/q; // calcular o tempo médio de cada leitura
449573 Serial.println ();
@@ -455,14 +579,41 @@ void lerEnviar(){
455579 }else if (unidade==' u' ){
456580 Serial.println (" e-6" );
457581 }
582+
583+ // enviar quais canais serao enviados. ex: >ch=1<\t>3<\t>
584+ Serial.print (" >chq=" ); Serial.print (chq); Serial.print (" \t " );
585+ for (int k=0 ; k<4 ; k++){
586+ if (Ch[k]){Serial.print (k); Serial.print (" \t " );}
587+ }
588+ Serial.println (" " );
589+
590+ // enviar os valores dos canais
591+ for (int k=0 ; k<q; k++){
592+ Serial.print (" >v=" ); Serial.print (k); Serial.print (" \t " );
593+ if (Ch[0 ]) {Serial.print (vb[chi[0 ]+k]); Serial.print (" \t " );}
594+ if (Ch[1 ]) {Serial.print (vb[chi[1 ]+k]); Serial.print (" \t " );}
595+ if (Ch[2 ]) {Serial.print (vb[chi[2 ]+k]); Serial.print (" \t " );}
596+ if (Ch[3 ]) {Serial.print (vb[chi[3 ]+k]); Serial.print (" \t " );}
597+ Serial.println (" " );
598+
599+ /*
600+ if (Ch[0]) {Serial.print(chi[0]+k); Serial.print("\t");}
601+ if (Ch[1]) {Serial.print(chi[1]+k); Serial.print("\t");}
602+ if (Ch[2]) {Serial.print(chi[2]+k); Serial.print("\t");}
603+ if (Ch[3]) {Serial.print(chi[3]+k); Serial.print("\t");}
604+ Serial.println("");
605+ */
606+ }
607+ /* -- eliminado em 07/May/2017 - criei buffer dinamico vb[408] --
458608 for (int k=0; k<q; k++){
459609 Serial.print(">v=");
460610 Serial.print(k); Serial.print("\t");
461611 Serial.print(v0[k]); Serial.print("\t");
462612 Serial.print(v1[k]); Serial.print("\t");
463613 Serial.print(v2[k]); Serial.print("\t");
464614 Serial.println(v3[k]);
465- }
615+ }
616+ */
466617 Serial.print (" >tTotalReal=" ); Serial.print (tTotalReal); // Serial.print(unidade); Serial.println("s");
467618 if (unidade==' m' ){
468619 Serial.println (" e-3" );
@@ -498,10 +649,10 @@ void lerFluxo(){
498649 Serial.print (" e-6" );
499650 }
500651 Serial.print (" \t " );
501- Serial.print (v0); Serial.print (" \t " );
502- Serial.print (v1); Serial.print (" \t " );
503- Serial.print (v2); Serial.print (" \t " );
504- Serial.println (v3);
652+ if (Ch[ 0 ]) { Serial.print (v0);} else {Serial. print ( " 0 " );} Serial.print (" \t " );
653+ if (Ch[ 1 ]) { Serial.print (v1);} else {Serial. print ( " 0 " );} Serial.print (" \t " );
654+ if (Ch[ 2 ]) { Serial.print (v2);} else {Serial. print ( " 0 " );} Serial.print (" \t " );
655+ if (Ch[ 3 ]) { Serial.println (v3);} else {Serial. println ( " 0 " );}
505656 }
506657}
507658
0 commit comments