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 " v1.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
@@ -59,7 +79,7 @@ char unidade='m'; // unidade: m=milisegundo, u=microsegundo
59
79
// 1 canal deve dar 120us
60
80
61
81
boolean varias=false ; // v = varias
62
- boolean uma=true ; // u = uma
82
+ boolean uma=false ; // u = uma
63
83
boolean fluxo=false ; // f = fluxo de dados (envia cada leitura sem guardar na memoria)
64
84
// velocidade limitada pela serial 115200
65
85
unsigned long dtReal, tIni, tFim; // contador de final de tempo para o fluxo
@@ -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);
@@ -113,8 +137,10 @@ void setup() {
113
137
// Serial.begin(9600);
114
138
Serial.begin (115200 );
115
139
// Serial.begin(250000);
116
- printHelp ();
117
- printConfig ();
140
+ Serial.println ();
141
+ Serial.print (" >init=" ); Serial.println (versao);
142
+ // printHelp();
143
+ // printConfig();
118
144
119
145
// ler Resistor e Capacitor
120
146
// pinMode(pinCarga,OUTPUT);
@@ -180,12 +206,13 @@ void lerSerial(){
180
206
case ' q' : // alterar valor do q.(ponto no final) (quantidade de leituras)
181
207
k=Serial.parseInt (); // inteiro de 0 a 32767
182
208
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 ) {
184
210
q=k;
185
211
}
186
- // Serial.print("=> q="); Serial.println(q);
212
+ // calcBuffer(); //não precisa pois será usado o qmax
213
+ Serial.print (" => q=" ); Serial.println (q);
187
214
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
189
216
delay (100 );
190
217
c=Serial.read ();
191
218
delay (100 );
@@ -196,6 +223,11 @@ void lerSerial(){
196
223
}else if (c2==' x' ){
197
224
Ch[c-' 0' ]=false ;
198
225
}
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");
199
231
/* Serial.print("=> Canais: ");
200
232
for (k=0; k<3;k++){
201
233
Serial.print("Ch"); Serial.print(k); Serial.print("="); Serial.print(Ch[k]);
@@ -223,7 +255,7 @@ void lerSerial(){
223
255
// Serial.print("=> canalTrigger="); Serial.println(canalTrigger);
224
256
break ;
225
257
case ' ?' :
226
- printConfig ();
258
+ printConfig ();
227
259
break ;
228
260
case ' 1' : // enviar Uma Amostra (q leituras)
229
261
if (!uma) uma=true ;
@@ -330,9 +362,61 @@ void lerSerial(){
330
362
}
331
363
}
332
364
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
+
333
417
void printHelp (){
334
418
Serial.println (" -----------------------" );
335
- Serial.print (" ! GaraginOscopio v " ); Serial.print (versao); Serial.println (" - RB !" );
419
+ Serial.print (" ! BegOscopio " ); Serial.print (versao); Serial.println (" - rogerio.bego@hotmail.com !" );
336
420
Serial.println (" -----------------------" );
337
421
/*
338
422
Serial.println("----------- help ---------------------");
@@ -359,15 +443,23 @@ void printHelp(){
359
443
*/
360
444
}
361
445
446
+
447
+
362
448
void printConfig (){
363
449
Serial.println (" ------ configuracoes -------" );
364
450
Serial.print (" >? q=" ); Serial.println (q);
451
+ Serial.print (" >? qmax=" ); Serial.println (qmax);
365
452
Serial.print (" >? dt=" ); Serial.print (dt); Serial.print (unidade); Serial.println (" s" );
366
453
float t=(float )q * (float )dt;
367
454
Serial.print (" -> T=(q*dt)= " ); Serial.print (t); Serial.print (unidade); Serial.println (" s " );
368
455
Serial.print (" >? Canais: " );
369
456
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
+ }
371
463
}
372
464
Serial.println ();
373
465
Serial.print (" >? canalTrigger=" ); Serial.println (canalTrigger);
@@ -380,6 +472,7 @@ void printConfig(){
380
472
Serial.print (" >? pwmPon=" ); Serial.print (pwmPon); Serial.println (" %" );
381
473
}
382
474
475
+
383
476
unsigned long microsOuMillis (){
384
477
if (unidade==' u' ){
385
478
return micros ();
@@ -425,25 +518,56 @@ boolean trigger(){ // a variavel canalTrigger indica qual canal fará o trigger:
425
518
426
519
427
520
void 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
+
428
546
unsigned long tFim; // contador do tempo Final
429
547
unsigned long tTotalReal; // tempo Total da leitura dos valores.
430
548
if (canalTrigger>=' 0' && canalTrigger<=' 3' ){
431
549
// Serial.print("canalTrigger=");Serial.println(canalTrigger);
432
550
Serial.print (" trigger=" ); Serial.println (trigger ());
433
551
}
434
552
tTotalReal=microsOuMillis ();
553
+
435
554
for (int k=0 ; k<q; k++){
436
555
tFim=microsOuMillis ()+dt;
556
+ /*
437
557
if (Ch[0]) {v0[k]=analogRead(A0);}
438
558
if (Ch[1]) {v1[k]=analogRead(A1);}
439
559
if (Ch[2]) {v2[k]=analogRead(A2);}
440
560
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);}
445
567
while (microsOuMillis ()<tFim){}
446
568
}
569
+
570
+
447
571
tTotalReal=microsOuMillis ()-tTotalReal; // total de tempo para ler todas as amostras
448
572
dtReal=tTotalReal/q; // calcular o tempo médio de cada leitura
449
573
Serial.println ();
@@ -455,14 +579,41 @@ void lerEnviar(){
455
579
}else if (unidade==' u' ){
456
580
Serial.println (" e-6" );
457
581
}
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] --
458
608
for (int k=0; k<q; k++){
459
609
Serial.print(">v=");
460
610
Serial.print(k); Serial.print("\t");
461
611
Serial.print(v0[k]); Serial.print("\t");
462
612
Serial.print(v1[k]); Serial.print("\t");
463
613
Serial.print(v2[k]); Serial.print("\t");
464
614
Serial.println(v3[k]);
465
- }
615
+ }
616
+ */
466
617
Serial.print (" >tTotalReal=" ); Serial.print (tTotalReal); // Serial.print(unidade); Serial.println("s");
467
618
if (unidade==' m' ){
468
619
Serial.println (" e-3" );
@@ -498,10 +649,10 @@ void lerFluxo(){
498
649
Serial.print (" e-6" );
499
650
}
500
651
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 " );}
505
656
}
506
657
}
507
658
0 commit comments