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
1
3
// 21/01/2017 => versão 1.4 => melhorar o trigger: informar valor e sentido (subindo/descendo)
2
4
// 13/03/2016 => versão 1.3 => alterar o clock do ADC para ler maiores frequencias
3
5
// 14/09/2015 => implementei TimerOne.h pin9(pwm) e pino10(2*periodo) output
4
6
// 03/08/2016 => versão 1.2 => ler resistor em A5
5
7
// 26/07/2015 => versão 1.1 => ler em microsegundos
6
8
// String versao="1.2"; // versão do programa -
7
- #define versao " 1.4 "
9
+ #define versao " 1.5 "
8
10
9
11
/* trabalhando com TimerOne
10
12
Timer1.initializa(us); // inicializa o timer1 (chamar primeiro)
@@ -40,16 +42,34 @@ boolean pwmOn=true;
40
42
unsigned long pwmP=100000 ; // Periodo 100000u=100m=0.1s => 10Hz
41
43
byte pwmPon=25 ; // % do pwmP em HIGH
42
44
43
- byte q= 100 ; // quantidade de leituras
45
+ /* -- 07/May/2017 --
44
46
int v0[100];
45
47
int v1[100];
46
48
int v2[100]; // guarda os valores das leituras
47
49
int 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
53
73
boolean Ch[]={true ,true ,true ,true }; // ativa/desativa canais
54
74
unsigned int dt=4 ; // 100us a 1000us(1ms) a 3000ms(3s)
55
75
char unidade=' m' ; // unidade: m=milisegundo, u=microsegundo
@@ -103,6 +123,10 @@ void setup() {
103
123
// Timer1.stop();
104
124
105
125
// 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
106
130
/*
107
131
* pinMode(A0,INPUT_PULLUP);
108
132
* pinMode(A1,INPUT_PULLUP);
@@ -114,7 +138,7 @@ void setup() {
114
138
Serial.begin (115200 );
115
139
// Serial.begin(250000);
116
140
printHelp ();
117
- printConfig ();
141
+ printConfig ();
118
142
119
143
// ler Resistor e Capacitor
120
144
// pinMode(pinCarga,OUTPUT);
@@ -180,12 +204,13 @@ void lerSerial(){
180
204
case ' q' : // alterar valor do q.(ponto no final) (quantidade de leituras)
181
205
k=Serial.parseInt (); // inteiro de 0 a 32767
182
206
c=Serial.read (); // para ir mais rápido colocar um . no final ex: q150.
183
- if (k>=1 && k<=100 ) {
207
+ if (k>=1 && k<=qmax ) {
184
208
q=k;
185
209
}
210
+ calcBuffer ();
186
211
// Serial.print("=> q="); Serial.println(q);
187
212
break ;
188
- case ' c' : // (1 )ativa/(0 )desativa canal n exemplo: c01 , c10
213
+ case ' c' : // cnm : n=0-3, m=(o )ativa/(x )desativa canal n exemplo: c0x , c2o
189
214
delay (100 );
190
215
c=Serial.read ();
191
216
delay (100 );
@@ -196,6 +221,11 @@ void lerSerial(){
196
221
}else if (c2==' x' ){
197
222
Ch[c-' 0' ]=false ;
198
223
}
224
+ // recalcular o buffer para cada canal e colocar o indice
225
+ // inicial para cada canal
226
+ // Serial.println("entrar calcBuffer");
227
+ calcBuffer ();
228
+ // Serial.println("saiu calcBuffer");
199
229
/* Serial.print("=> Canais: ");
200
230
for (k=0; k<3;k++){
201
231
Serial.print("Ch"); Serial.print(k); Serial.print("="); Serial.print(Ch[k]);
@@ -223,7 +253,7 @@ void lerSerial(){
223
253
// Serial.print("=> canalTrigger="); Serial.println(canalTrigger);
224
254
break ;
225
255
case ' ?' :
226
- printConfig ();
256
+ printConfig ();
227
257
break ;
228
258
case ' 1' : // enviar Uma Amostra (q leituras)
229
259
if (!uma) uma=true ;
@@ -330,9 +360,60 @@ void lerSerial(){
330
360
}
331
361
}
332
362
363
+ void calcBuffer (){
364
+ // Serial.println("entrou calcBuffer");
365
+ chq=0 ;
366
+ // conta a quantidade de canais ativos
367
+ for (int k=0 ;k<4 ;k++){
368
+ if (Ch[k]) {chq+=1 ;}
369
+ }
370
+ // calc size of each channel
371
+ switch (chq){
372
+ case 0 :
373
+ qmax=0 ;
374
+ break ;
375
+ case 1 :
376
+ qmax=400 ;
377
+ break ;
378
+ case 2 :
379
+ qmax=200 ;
380
+ break ;
381
+ case 3 :
382
+ qmax=130 ;
383
+ break ;
384
+ case 4 :
385
+ qmax=100 ;
386
+ break ;
387
+ }
388
+ /*
389
+ if (chq<=0) {
390
+ qmax=0;
391
+ } else {
392
+ qmax=408/chq; // chq-qmax; 4-102; 3-136; 2-204; 1-408
393
+ }
394
+ */
395
+ if (q>qmax) {
396
+ q=qmax;
397
+ }
398
+ // Serial.print("q=408/chq=");Serial.print("408/");Serial.print(chq);Serial.print("=");Serial.println(q);
399
+ int chInit=0 ;
400
+ for (int k=0 ; k<4 ; k++){
401
+ if (Ch[k]) {
402
+ chi[k]=chInit;
403
+ chInit+=q;
404
+ }
405
+ }
406
+
407
+ Serial.print (" chq=" ); Serial.print (chq); Serial.print (" q=" ); Serial.print (q); Serial.print (" qmax=" ); Serial.println (qmax);
408
+ for (int k=0 ; k<4 ; k++){
409
+ Serial.print (" k=" );Serial.print (k); Serial.print (" chi[k]=" ); Serial.println (chi[k]);
410
+ }
411
+
412
+ }
413
+
333
414
void printHelp (){
334
415
Serial.println (" -----------------------" );
335
- Serial.print (" ! GaraginOscopio v" ); Serial.print (versao); Serial.println (" - RB !" );
416
+ Serial.print (" ! BegOscopio v" ); Serial.print (versao); Serial.println (" - rogerio.bego@hotmail.com !" );
336
417
Serial.println (" -----------------------" );
337
418
/*
338
419
Serial.println("----------- help ---------------------");
@@ -359,15 +440,23 @@ void printHelp(){
359
440
*/
360
441
}
361
442
443
+
444
+
362
445
void printConfig (){
363
446
Serial.println (" ------ configuracoes -------" );
364
447
Serial.print (" >? q=" ); Serial.println (q);
448
+ Serial.print (" >? qmax=" ); Serial.println (qmax);
365
449
Serial.print (" >? dt=" ); Serial.print (dt); Serial.print (unidade); Serial.println (" s" );
366
450
float t=(float )q * (float )dt;
367
451
Serial.print (" -> T=(q*dt)= " ); Serial.print (t); Serial.print (unidade); Serial.println (" s " );
368
452
Serial.print (" >? Canais: " );
369
453
for (int k=0 ; k<4 ; k++){
370
- Serial.print (" Ch" ); Serial.print (k); Serial.print (" =" ); Serial.print (Ch[k]);
454
+ Serial.print (" Ch" ); Serial.print (k); Serial.print (" =" );
455
+ if (Ch[k]) {
456
+ Serial.print (" o" );
457
+ } else {
458
+ Serial.print (" x" );
459
+ }
371
460
}
372
461
Serial.println ();
373
462
Serial.print (" >? canalTrigger=" ); Serial.println (canalTrigger);
@@ -380,6 +469,7 @@ void printConfig(){
380
469
Serial.print (" >? pwmPon=" ); Serial.print (pwmPon); Serial.println (" %" );
381
470
}
382
471
472
+
383
473
unsigned long microsOuMillis (){
384
474
if (unidade==' u' ){
385
475
return micros ();
@@ -425,25 +515,56 @@ boolean trigger(){ // a variavel canalTrigger indica qual canal fará o trigger:
425
515
426
516
427
517
void lerEnviar (){
518
+
519
+ /*
520
+ // enviar quais canais serao enviados. ex: >ch=1<\t>3<\t>
521
+ Serial.print(">chq="); Serial.print(chq); Serial.print("\t");
522
+ for (int k=0; k<4; k++){
523
+ if (Ch[k]){Serial.print(k); Serial.print("\t");}
524
+ }
525
+ Serial.println("");
526
+
527
+ //enviar os valores dos canais
528
+ for (int k=0; k<q; k++){
529
+ Serial.print(">v="); Serial.print(k); Serial.print("\t");
530
+ if (Ch[0]) {Serial.print(chi[0]+k); Serial.print("\t");}
531
+ if (Ch[1]) {Serial.print(chi[1]+k); Serial.print("\t");}
532
+ if (Ch[2]) {Serial.print(chi[2]+k); Serial.print("\t");}
533
+ if (Ch[3]) {Serial.print(chi[3]+k); Serial.print("\t");}
534
+ Serial.println("");
535
+ }
536
+
537
+
538
+ return;
539
+
540
+ */
541
+
542
+
428
543
unsigned long tFim; // contador do tempo Final
429
544
unsigned long tTotalReal; // tempo Total da leitura dos valores.
430
545
if (canalTrigger>=' 0' && canalTrigger<=' 3' ){
431
546
// Serial.print("canalTrigger=");Serial.println(canalTrigger);
432
547
Serial.print (" trigger=" ); Serial.println (trigger ());
433
548
}
434
549
tTotalReal=microsOuMillis ();
550
+
435
551
for (int k=0 ; k<q; k++){
436
552
tFim=microsOuMillis ()+dt;
553
+ /*
437
554
if (Ch[0]) {v0[k]=analogRead(A0);}
438
555
if (Ch[1]) {v1[k]=analogRead(A1);}
439
556
if (Ch[2]) {v2[k]=analogRead(A2);}
440
557
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;}
558
+ */
559
+
560
+ if (Ch[0 ]) {vb[chi[0 ]+k]=analogRead (A0);}
561
+ if (Ch[1 ]) {vb[chi[1 ]+k]=analogRead (A1);}
562
+ if (Ch[2 ]) {vb[chi[2 ]+k]=analogRead (A2);}
563
+ if (Ch[3 ]) {vb[chi[3 ]+k]=analogRead (A3);}
445
564
while (microsOuMillis ()<tFim){}
446
565
}
566
+
567
+
447
568
tTotalReal=microsOuMillis ()-tTotalReal; // total de tempo para ler todas as amostras
448
569
dtReal=tTotalReal/q; // calcular o tempo médio de cada leitura
449
570
Serial.println ();
@@ -455,14 +576,40 @@ void lerEnviar(){
455
576
}else if (unidade==' u' ){
456
577
Serial.println (" e-6" );
457
578
}
579
+
580
+ // enviar quais canais serao enviados. ex: >ch=1<\t>3<\t>
581
+ Serial.print (" >chq=" ); Serial.print (chq); Serial.print (" \t " );
582
+ for (int k=0 ; k<4 ; k++){
583
+ if (Ch[k]){Serial.print (k); Serial.print (" \t " );}
584
+ }
585
+ Serial.println (" " );
586
+
587
+ // enviar os valores dos canais
588
+ for (int k=0 ; k<q; k++){
589
+ Serial.print (" >v=" ); Serial.print (k); Serial.print (" \t " );
590
+ if (Ch[0 ]) {Serial.print (vb[chi[0 ]+k]); Serial.print (" \t " );}
591
+ if (Ch[1 ]) {Serial.print (vb[chi[1 ]+k]); Serial.print (" \t " );}
592
+ if (Ch[2 ]) {Serial.print (vb[chi[2 ]+k]); Serial.print (" \t " );}
593
+ if (Ch[3 ]) {Serial.print (vb[chi[3 ]+k]); Serial.print (" \t " );}
594
+ Serial.println (" " );
595
+
596
+ if (Ch[0 ]) {Serial.print (chi[0 ]+k); Serial.print (" \t " );}
597
+ if (Ch[1 ]) {Serial.print (chi[1 ]+k); Serial.print (" \t " );}
598
+ if (Ch[2 ]) {Serial.print (chi[2 ]+k); Serial.print (" \t " );}
599
+ if (Ch[3 ]) {Serial.print (chi[3 ]+k); Serial.print (" \t " );}
600
+ Serial.println (" " );
601
+
602
+ }
603
+ /* -- eliminado em 07/May/2017 - criei buffer dinamico vb[408] --
458
604
for (int k=0; k<q; k++){
459
605
Serial.print(">v=");
460
606
Serial.print(k); Serial.print("\t");
461
607
Serial.print(v0[k]); Serial.print("\t");
462
608
Serial.print(v1[k]); Serial.print("\t");
463
609
Serial.print(v2[k]); Serial.print("\t");
464
610
Serial.println(v3[k]);
465
- }
611
+ }
612
+ */
466
613
Serial.print (" >tTotalReal=" ); Serial.print (tTotalReal); // Serial.print(unidade); Serial.println("s");
467
614
if (unidade==' m' ){
468
615
Serial.println (" e-3" );
0 commit comments