找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1995|回复: 0
收起左侧

4通道示波器及Arduino信号发生代码

[复制链接]
ID:426684 发表于 2019-2-5 15:34 | 显示全部楼层 |阅读模式
原始地址 (自行替换) www点instructables点com/id/Oscilloscope-Arduino-Processing/
[1] Arduino 上 A0 A1 A2 A3 为信号输出口
[2] 示波器是用 Processing 软件编写的

sbq.JPG 162020l6i2z5dljy67t277.jpg

Arduino 信号发生代码(略做修改):

  1. #define versao "v1.5"
  2. #include <TimerOne.h>
  3. const unsigned char PS_16 = (1 << ADPS2);
  4. const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
  5. const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
  6. const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  7. boolean  pwmOn=true;
  8. unsigned long pwmP=20000; //Periodo 20000us=20ms=0.02s => 50Hz
  9. byte pwmPon=25; // % do pwmP em HIGH
  10. int vb[400]; // (100*4=400) buffer stores the measure values of all channels
  11. int chi[]={0,100,200,300}; // channel init position on buffer vb[]
  12. int chq=4; // how many channels are ON
  13. int q=100; // quantidade de leituras
  14. int qmax=100; // qtd maxima permitida para q
  15. int vtrigger=0; // tensao de trigger
  16. boolean Ch[]={true,true,true,true}; // ativa/desativa canais
  17. unsigned int dt=4; // 100us a 1000us(1ms) a 3000ms(3s)
  18. char unidade='m'; // unidade: m=milisegundo, u=microsegundo
  19. boolean varias=false; // v = varias
  20. boolean uma=false;    // u = uma
  21. boolean fluxo=false; // f = fluxo de dados (envia cada leitura sem guardar na memoria)
  22. unsigned long dtReal, tIni, tFim; // contador de final de tempo para o fluxo
  23. char canalTrigger='x'; // de '0','1','2','3' (canal do trigger), 'x'=não tem trigger


  24. //--------------- Ler Resistor/Capacitor ---------
  25. boolean lerRC=false;
  26. #define pinV 5
  27. #define pinA 10 // pino A 10 multiplex
  28. #define pinB 9 // pino B 9 multiplex
  29. byte entrada=0;
  30. int vi, vf, v;
  31. unsigned long dtRC=0;
  32. char unidadeRC=' ';
  33. boolean debug=true;

  34. void setup() {
  35.   ADCSRA &= ~PS_128;  //limpa configuração da biblioteca do arduino
  36.   ADCSRA |= PS_16; // 16 prescaler
  37.   pinMode(10,OUTPUT);
  38.   Timer1.initialize(pwmP); //100000us=100ms=>10Hz
  39.   Timer1.pwm(9,map(pwmPon,0,100,0,1023)); //pwm no pino9 com 25% duty cycle
  40.   Timer1.attachInterrupt(callback); //attaches callback() como timer overflow interrupt
  41.   Serial.begin(9600);
  42.   //Serial.begin(115200);
  43.   //Serial.begin(250000);
  44.   Serial.println();
  45.   Serial.print(">init="); Serial.println(versao);
  46.   pinMode(pinA,OUTPUT);
  47.   pinMode(pinB,OUTPUT);
  48.   selecionar(0);
  49. }

  50. void callback(){
  51.   digitalWrite(10,digitalRead(10)^1); // ^1 = xor (0->1, 1->0)
  52. }

  53. void loop() {
  54.    lerSerial();
  55.    if (varias) {
  56.       lerEnviar();
  57.    } else if (uma) {
  58.       if (canalTrigger=='x'){
  59.         lerEnviar();
  60.         uma=false;
  61.       } else {
  62.         if (trigger()){
  63.           lerEnviar();
  64.           uma=false;
  65.         }
  66.       }
  67.    } else if (fluxo) {
  68.       lerFluxo();
  69.    }
  70.    if (lerRC){
  71.      if (millis()>=dtRC){
  72.        lerResistorCapacitor();
  73.        dtRC=millis()+3000;
  74.      }
  75.    }
  76. }

  77. void lerSerial(){
  78.   int k;
  79.   float kf;
  80.   char c, c2;
  81.   if (Serial.available()>0){
  82.     c=Serial.read();
  83.     switch (c){
  84.        case 'h': // enviar help pela serial
  85.           printHelp();
  86.           break;
  87.        case 'd': //alterar o valor de dt (us/ms)
  88.           k=Serial.parseInt(); // como e inteiro então vai de 0 a 32767 (parseint limita 16bits)
  89.           if (k>=1 && k<=30000) {//28/08/15 deve ser dtmin=400us(3canais) dtmax=30000
  90.              dt=k;
  91.           }
  92.           c=Serial.read();
  93.           if (c=='u' || c=='m'){
  94.             unidade=c;
  95.           } else { // sem unidade é segundo, então converter para mili (x1000)m
  96.             unidade='m';
  97.             dt*=1000;
  98.           }
  99. //          Serial.print("=> dt="); Serial.print(dt); Serial.print(unidade); Serial.println("s");
  100.           break;
  101.        case 'q': // alterar valor do q.(ponto no final) (quantidade de leituras)
  102.           k=Serial.parseInt(); // inteiro de 0 a 32767
  103.           c=Serial.read(); // para ir mais rápido colocar um . no final ex: q150.
  104.           if (k>=1 && k<=qmax) {
  105.              q=k;
  106.           }
  107.           //calcBuffer(); //não precisa pois será usado o qmax
  108.           Serial.print("=> q="); Serial.println(q);
  109.           break;
  110.        case 'c': //cnm : n=0-3, m=(o)ativa/(x)desativa canal n exemplo:  c0x,  c2o
  111.           delay(100);
  112.           c=Serial.read();
  113.           delay(100);
  114.           c2=Serial.read();
  115.           if (c>='0' && c<='3'){
  116.              if (c2=='o'){
  117.                 Ch[c-'0']=true;
  118.              }else if (c2=='x'){
  119.                 Ch[c-'0']=false;
  120.              }
  121.              // recalcular o buffer para cada canal e colocar o indice
  122.              // inicial para cada canal
  123.              //Serial.println("entrar calcBuffer");
  124.              calcBuffer();
  125.              //Serial.println("saiu calcBuffer");
  126. /*            Serial.print("=> Canais: ");
  127.               for (k=0; k<3;k++){
  128.                 Serial.print("Ch"); Serial.print(k); Serial.print("="); Serial.print(Ch[k]);
  129.               }
  130.               Serial.println();
  131. */              
  132.             }  
  133.           break;
  134.        case 't': // trigger: t(canal)
  135.                  // trigger:  t0, t1, t2, t3
  136.                  //           tx   desligado
  137.                  //           tv512.  valor da tensão 0-1024 (5v)
  138.         delay(100);
  139.         c=Serial.read();
  140.         if ((c>='0' && c<='3') || c=='x'){
  141.            canalTrigger=c;      
  142.         } else if (c=='v'){
  143.           k=Serial.parseInt();
  144.           c=Serial.read();
  145.           if (k>=0 && k<=1024) {
  146.             vtrigger=k;
  147.           }
  148.         }

  149. //        Serial.print("=> canalTrigger="); Serial.println(canalTrigger);
  150.         break;
  151.        case '?':
  152.           printConfig();
  153.           break;
  154.         case '1': // enviar Uma Amostra (q leituras)
  155.           if (!uma) uma=true;
  156.           if (uma){
  157.              varias=false;
  158.              fluxo=false;
  159.           }
  160. //          Serial.print("=> uma="); Serial.println(uma);
  161.           break;
  162.         case 'v': // o(on)/x(off) - enviar Varias Amostras (q leituras cada)
  163.            delay(100);
  164.            c=Serial.read();
  165.            if (c=='o') {
  166.               varias=true;
  167.            } else {
  168.               varias=false;
  169.            }
  170.           if (varias){
  171.              uma=false;
  172.              fluxo=false;
  173.           }
  174. //          Serial.print("=> varias="); Serial.println(varias);
  175.           break;
  176.         case 'f': // o(on)/x(off) - enviar Fluxo (ler e enviar - nao armazenar)
  177.            delay(100);
  178.            c=Serial.read();
  179.            if (c=='o') {
  180.               fluxo=true;
  181.            } else {
  182.               fluxo=false;
  183.            }
  184.           if (fluxo){
  185.              varias=false;
  186.              uma=false;
  187.              if (unidade=='u'){ // microsegundo
  188.                tIni=micros(); tFim=tIni+dt;
  189.              } else{ // milisegundo
  190.                tIni=millis(); tFim=tIni+dt;
  191.              }
  192.           }
  193. //          Serial.print("=> fluxo="); Serial.println(fluxo);
  194.           break;
  195.          case 'r': // (on/off) - enviar valor lido do Resistor em A5
  196.            delay(100);
  197.            c=Serial.read();
  198.            if (c=='o') {
  199.               lerRC=true;
  200.            } else {
  201.               lerRC=false;
  202.            }
  203. //           Serial.print("=> lerRC="); Serial.println(lerRC);
  204.            dtRC=0;
  205.            break;
  206.          case 's': // Sinal: Ligar/desligar Gerador de Sinal
  207.           delay(100);
  208.           c=Serial.read();
  209.           if (c=='o'){
  210.             Timer1.restart(); // zera o contador
  211.             Timer1.start(); //inicio
  212. //            Serial.println("Timer1 restart/start");
  213.           }else{
  214.             Timer1.stop();
  215. //            Serial.println("Timer1.stop()");
  216.           }
  217.           break;
  218.          case 'p': // Sinal: alterar Período ex: p100m p343u
  219.           kf=Serial.parseFloat();
  220.           if (kf>0){
  221.             c=Serial.read(); // ler unidade e converter para micro
  222. //            Serial.print(">>kf="); Serial.print(kf); Serial.print(" c="); Serial.println(c);
  223.             switch (c){
  224.               case 'u': //já está em micro (u)
  225.                 pwmP=long(kf);
  226.                 break;
  227.               case 'm': // está em mili (m) então converter para micro (u)
  228.                 pwmP=long(kf*1000.0);
  229. //                Serial.print("kf="); Serial.print(kf); Serial.print("m"); Serial.print(" pwmP=kf*1000="); Serial.println(pwmP);
  230.                 break;
  231.               case ' ': // está em segundo ( ) então converter para micro (u)
  232.                 pwmP=long(kf*1000000.0);
  233.                 break;
  234.                default: // se veio caracter desconhecido faço o pwmP=1s
  235.                 pwmP=1000000l; // coloquei L no final do 100000 para dizer que é long
  236. //                Serial.print("=> erro unidade pwmP, usando padrao(us)="); Serial.println(1000000);
  237.                 break;
  238.             }
  239.             Timer1.setPeriod(pwmP);
  240.             Timer1.setPwmDuty(9,map(pwmPon,0,100,0,1023));
  241. //            Serial.print("=> setPeriod="); Serial.println(pwmP);
  242.           }
  243.           break;
  244.          case 'o': // Sinal: alterar tempo em ON ex: o25% o50%
  245.           k=int(Serial.parseFloat());
  246.           c=Serial.read(); // só ler a % e desprezar (faz o parseInt ficar mais rapido
  247.           if (k>=0 && k<=100){
  248.             pwmPon=k;
  249.             Timer1.setPwmDuty(9,map(pwmPon,0,100,0,1023));
  250. //            Serial.print("=> pwm on="); Serial.print(k); Serial.println("%");         
  251.           }
  252.           break;
  253.          default:
  254.            Serial.print("erro c="); Serial.println(c,HEX);
  255.     }
  256.   }
  257. }

  258. void calcBuffer(){
  259.   //Serial.println("entrou calcBuffer");
  260.   chq=0;
  261.   // conta a quantidade de canais ativos
  262.   for (int k=0;k<4;k++){
  263.     if (Ch[k]) {chq+=1;}
  264.   }
  265.   // calc size of each channel
  266.   switch (chq){
  267.     case 0:
  268.       qmax=0;
  269.       break;
  270.     case 1:
  271.       qmax=400;
  272.       break;
  273.     case 2:
  274.       qmax=200;
  275.       break;
  276.     case 3:
  277.       qmax=130;
  278.       break;
  279.     case 4:
  280.       qmax=100;
  281.       break;
  282.   }
  283.   /*
  284.   if (chq<=0) {
  285.     qmax=0;
  286.   } else {
  287.     qmax=408/chq; // chq-qmax; 4-102; 3-136; 2-204; 1-408
  288.   }
  289. */
  290.   if (q>qmax) {
  291.     q=qmax;
  292.   }
  293.   //Serial.print("q=408/chq=");Serial.print("408/");Serial.print(chq);Serial.print("=");Serial.println(q);
  294.   // qtdCanais-qmax (chq-qmax) (4-100) (3-130) (2-200) (1-400)
  295.   int chInit=0;
  296.   for (int k=0; k<4; k++){
  297.     if (Ch[k]) {
  298.       chi[k]=chInit;
  299.       chInit+=qmax;
  300.     }
  301.   }

  302. // Serial.print("chq="); Serial.print(chq); Serial.print(" q="); Serial.print(q); Serial.print(" qmax="); Serial.println(qmax);
  303. //  for (int k=0; k<4; k++){
  304. //    Serial.print("k=");Serial.print(k); Serial.print(" chi[k]="); Serial.println(chi[k]);
  305. // }

  306. }

  307. void printHelp(){
  308.    Serial.println("-----------------------");
  309.    Serial.print("! BegOscopio "); Serial.print(versao); Serial.println(" - [email]rogerio.bego@hotmail.com[/email] !");
  310.    Serial.println("-----------------------");
  311. /*
  312.    Serial.println("----------- help ---------------------");
  313.    Serial.println(" h    : help");
  314.    Serial.println(" ?    : exibir as configuracoes atuais");
  315.    Serial.println(" -------- controle da amostragem ------");
  316.    Serial.println(" d___ : d[1-3000][un] - ex: d100m, d200u - dt = intervalo de tempo (us/ms) entre as leituras");
  317.    Serial.println(" q___ : q[1-100]. - qtd de leituras");
  318.    Serial.println(" cn_  : (o)ativa,(x)desativa canal: ex:  c2o (ativar Ch2), c0x (desativar Ch0)");
  319.    Serial.println(" t_   : 0,1,2,3(canal),x(off)  ");
  320.    Serial.println(" tv__ : tv512.  valor da tensao 0-1024 (0-5v)");
  321.    Serial.println(" -------- envio das amostras ---------");
  322.    Serial.println(" 1    : enviar uma amostra");
  323.    Serial.println(" v_   : o(on),x(off) enviar varias amostras");
  324.    Serial.println(" f_   : o(on),x(off) enviar fluxo de dados");
  325.    Serial.println("    obs:  1, v, f sao mutuamente excludentes");
  326.    Serial.println(" -------- leitura de Resistor ou Capacitor ----");
  327.    Serial.println(" r_   : o(on),x(off) ler Resistor ou Capacitor");
  328.    Serial.println(" -------- Gerador de Sinal pwm ---------");
  329.    Serial.println(" s_   : o(on),x(off) ativa Ger.Sinal (pwm na porta 9) (porta 10 indica 2*T)");
  330.    Serial.println(" p_   : p[valor][unidade] periodo do sinal de 100u a 8s");
  331.    Serial.println(" o_   : o[0-100][%] Ton em porcentagem");
  332.    Serial.println("----------------------------------------");
  333.    */
  334. }



  335. void printConfig(){
  336.    Serial.println("------ configuracoes -------");
  337.    Serial.print(">? q="); Serial.println(q);
  338.    Serial.print(">? qmax="); Serial.println(qmax);
  339.    Serial.print(">? dt="); Serial.print(dt); Serial.print(unidade); Serial.println("s");
  340.    float t=(float)q * (float)dt;
  341.    Serial.print(" -> T=(q*dt)= "); Serial.print(t); Serial.print(unidade); Serial.println("s ");
  342.    Serial.print(">? Canais: ");
  343.    for (int k=0; k<4; k++){
  344.       Serial.print("  Ch"); Serial.print(k); Serial.print("=");
  345.       if (Ch[k]) {
  346.         Serial.print("o");     
  347.       } else {
  348.         Serial.print("x");
  349.       }
  350.    }
  351.    Serial.println();
  352.    Serial.print(">? canalTrigger="); Serial.println(canalTrigger);
  353.    Serial.print(">? uma="); Serial.println(uma);
  354.    Serial.print(">? varias="); Serial.println(varias);
  355.    Serial.print(">? fluxo="); Serial.println(fluxo);
  356.    Serial.print(">? lerRC="); Serial.println(lerRC);
  357.    Serial.print(">? pwmOn="); Serial.println(pwmOn);
  358.    Serial.print(">? pwmP="); Serial.print(pwmP); Serial.println("us");
  359.    Serial.print(">? pwmPon="); Serial.print(pwmPon); Serial.println("%");
  360. }


  361. unsigned long microsOuMillis(){
  362.    if (unidade=='u'){
  363.       return micros();
  364.    } else {
  365.       return millis();
  366.    }
  367. }

  368. //-- procurar tensão maior que zero no canalTrigger ----
  369. //-- se UMA=true então fica aguardando indefinitivamente
  370. //-- se UMA=false então fica aguardando até o tempo tFIM (q*dt)
  371. boolean trigger(){ // a variavel canalTrigger indica qual canal fará o trigger: 0,1,2 ou 3
  372.   unsigned long tFim; // contador do tempo Final
  373.   int v1=0,v2=0;
  374.   //int c1=0, c2=0;
  375.   boolean achou=false;
  376.     tFim=microsOuMillis()+q*dt;
  377.     // dispara na subida do valor vtrigger+10
  378.     //fica lendo a tensão enquanto for maior que vtrigger
  379.     //   E tempo menor que tFim
  380.     do{
  381.       v1=analogRead(canalTrigger-'0');
  382.       //c1++;
  383.     }while (v1>vtrigger && microsOuMillis()<tFim);
  384.   //  while (v1=analogRead(canalTrigger-'0')>0 && microsOuMillis()<tFim){c1++;}
  385.     if (v1<=vtrigger){
  386.       tFim=microsOuMillis()+q*dt;
  387.       //fica lendo a tensão enquanto for menor ou igual a 10+vtrigger
  388.       // E tempo menor que tFim
  389.       do{
  390.         v2=analogRead(canalTrigger-'0');
  391.         //c2++;
  392.       }while(v2<=10+vtrigger && microsOuMillis()<tFim);
  393.       //while (v2=analogRead(canalTrigger-'0')<=0 && microsOuMillis()<tFim){c2++;}
  394.       if (v2>10+vtrigger){
  395.         achou=true;
  396.       }
  397.       //Serial.print("v1="); Serial.print(v1); Serial.print(" v2=");Serial.println(v2);
  398.       //Serial.print("c1=");Serial.print(c1);Serial.print(" c2=");Serial.println(c2);
  399.     }
  400.     return achou;
  401. }


  402. void lerEnviar(){

  403. /*  
  404.   // enviar quais canais serao enviados. ex: >ch=1<\t>3<\t>
  405.   Serial.print(">chq="); Serial.print(chq); Serial.print("\t");
  406.   for (int k=0; k<4; k++){
  407.     if (Ch[k]){Serial.print(k); Serial.print("\t");}   
  408.   }
  409.   Serial.println("");

  410.   //enviar os valores dos canais
  411.   for (int k=0; k<q; k++){
  412.     Serial.print(">v="); Serial.print(k); Serial.print("\t");
  413.     if (Ch[0]) {Serial.print(chi[0]+k); Serial.print("\t");}
  414.     if (Ch[1]) {Serial.print(chi[1]+k); Serial.print("\t");}
  415.     if (Ch[2]) {Serial.print(chi[2]+k); Serial.print("\t");}
  416.     if (Ch[3]) {Serial.print(chi[3]+k); Serial.print("\t");}
  417.     Serial.println("");
  418.   }


  419.   return;

  420.   */


  421.   unsigned long tFim; // contador do tempo Final
  422.   unsigned long tTotalReal; // tempo Total da leitura dos valores.
  423.     if (canalTrigger>='0' && canalTrigger<='3'){
  424.       //Serial.print("canalTrigger=");Serial.println(canalTrigger);
  425.       Serial.print("trigger="); Serial.println(trigger());
  426.      }
  427.     tTotalReal=microsOuMillis();

  428.     for (int k=0; k<q; k++){
  429.       tFim=microsOuMillis()+dt;
  430. /*
  431.       if (Ch[0]) {v0[k]=analogRead(A0);}
  432.       if (Ch[1]) {v1[k]=analogRead(A1);}
  433.       if (Ch[2]) {v2[k]=analogRead(A2);}
  434.       if (Ch[3]) {v3[k]=analogRead(A3);}
  435. */

  436.       if (Ch[0]) {vb[chi[0]+k]=analogRead(A0);}
  437.       if (Ch[1]) {vb[chi[1]+k]=analogRead(A1);}
  438.       if (Ch[2]) {vb[chi[2]+k]=analogRead(A2);}
  439.       if (Ch[3]) {vb[chi[3]+k]=analogRead(A3);}
  440.       while (microsOuMillis()<tFim){}
  441.     }


  442.     tTotalReal=microsOuMillis()-tTotalReal; // total de tempo para ler todas as amostras
  443.     dtReal=tTotalReal/q; // calcular o tempo médio de cada leitura
  444.   Serial.println();
  445.   Serial.print(">q="); Serial.println(q);
  446.   Serial.print(">dt="); Serial.print(dt); Serial.print(unidade); Serial.println("s");
  447.   Serial.print(">dtReal="); Serial.print(dtReal); //  Serial.print(unidade); Serial.println("s");
  448.     if (unidade=='m'){
  449.       Serial.println("e-3");
  450.     }else if (unidade=='u'){
  451.       Serial.println("e-6");
  452.     }

  453.   // enviar quais canais serao enviados. ex: >ch=1<\t>3<\t>
  454.   Serial.print(">chq="); Serial.print(chq); Serial.print("\t");
  455.   for (int k=0; k<4; k++){
  456.     if (Ch[k]){Serial.print(k); Serial.print("\t");}   
  457.   }
  458.   Serial.println("");

  459.   //enviar os valores dos canais
  460.   for (int k=0; k<q; k++){
  461.     Serial.print(">v="); Serial.print(k); Serial.print("\t");
  462.     if (Ch[0]) {Serial.print(vb[chi[0]+k]); Serial.print("\t");}
  463.     if (Ch[1]) {Serial.print(vb[chi[1]+k]); Serial.print("\t");}
  464.     if (Ch[2]) {Serial.print(vb[chi[2]+k]); Serial.print("\t");}
  465.     if (Ch[3]) {Serial.print(vb[chi[3]+k]); Serial.print("\t");}
  466.     Serial.println("");

  467.   /*
  468.     if (Ch[0]) {Serial.print(chi[0]+k); Serial.print("\t");}
  469.     if (Ch[1]) {Serial.print(chi[1]+k); Serial.print("\t");}
  470.     if (Ch[2]) {Serial.print(chi[2]+k); Serial.print("\t");}
  471.     if (Ch[3]) {Serial.print(chi[3]+k); Serial.print("\t");}
  472.     Serial.println("");
  473.   */
  474.   }
  475. /* -- eliminado em 07/May/2017 - criei buffer dinamico  vb[408] --   
  476.   for (int k=0; k<q; k++){
  477.     Serial.print(">v=");
  478.     Serial.print(k); Serial.print("\t");
  479.     Serial.print(v0[k]); Serial.print("\t");
  480.     Serial.print(v1[k]); Serial.print("\t");
  481.     Serial.print(v2[k]); Serial.print("\t");
  482.     Serial.println(v3[k]);
  483.   }
  484.   */
  485.   Serial.print(">tTotalReal="); Serial.print(tTotalReal); //Serial.print(unidade); Serial.println("s");
  486.     if (unidade=='m'){
  487.       Serial.println("e-3");
  488.     }else if (unidade=='u'){
  489.       Serial.println("e-6");
  490.     }
  491. }

  492. void lerFluxo(){
  493.   int v0, v1, v2, v3; // guarda os valores das leituras
  494.   //byte v0, v1, v2, v3; // guarda os valores das leituras
  495.   boolean leu=false;
  496.     if (microsOuMillis()>=tFim){
  497.       dtReal=microsOuMillis()-tIni;
  498.       tIni=microsOuMillis(); tFim=tIni+dt;
  499.       if (Ch[0]) {v0=analogRead(A0);}
  500.       if (Ch[1]) {v1=analogRead(A1);}
  501.       if (Ch[2]) {v2=analogRead(A2);}
  502.       if (Ch[3]) {v3=analogRead(A3);}
  503.       //if (Ch[0]) {v0=analogRead(A0)/4;}
  504.       //if (Ch[1]) {v1=analogRead(A1)/4;}
  505.       //if (Ch[2]) {v2=analogRead(A2)/4;}
  506.       //if (Ch[3]) {v3=analogRead(A3)/4;}
  507.       leu=true;
  508.     }
  509.   if (leu){
  510.     Serial.print(">f=");
  511.     Serial.print("0"); Serial.print("\t");
  512.     Serial.print(dtReal);
  513.       if (unidade=='m'){
  514.         Serial.print("e-3");
  515.       }else if (unidade=='u'){
  516.         Serial.print("e-6");
  517.       }
  518.       Serial.print("\t");
  519.     if (Ch[0]) {Serial.print(v0);} else {Serial.print("0");} Serial.print("\t");
  520.     if (Ch[1]) {Serial.print(v1);} else {Serial.print("0");} Serial.print("\t");
  521.     if (Ch[2]) {Serial.print(v2);} else {Serial.print("0");} Serial.print("\t");
  522.     if (Ch[3]) {Serial.println(v3);} else {Serial.println("0");}
  523.   }
  524. }

  525. //=========== Rotinas para leitura de Resistor e Capacitor ===========

  526. void lerResistorCapacitor(){
  527.   descarregar();
  528.   lerEntrada(1);
  529.   if (vf-vi>=100) {// e' capacitor
  530.     calcCapacitor();
  531.   } else {
  532.     if (v<900) { // calcular valor do resistor
  533.       calcRx();
  534.     } else { // subir selecionar 2
  535.       // descarregar se for capacitor
  536.       descarregar();
  537.       lerEntrada(2);
  538.       if (vf-vi>=100) { // capacitor - escala 2
  539.         calcCapacitor();
  540.       } else { // resistor
  541.         if (v<900){ // calcular valor do resistor
  542.           calcRx();
  543.         } else { // subir selecionar 3 (nao consegue detectar capacitor corretamente)
  544.           lerEntrada(3);
  545.           if (v<900){
  546.             calcRx();
  547.           } else {
  548.             Serial.println(">rc=3\tColoque RC");
  549.           }
  550.         }
  551.       }
  552.     }
  553.   }
  554. }

  555. void calcCapacitor(){
  556.   float re[]={0.0,145.2,20692.9,1017847.5};
  557.   float cx=0;
  558.   descarregar();
  559.   selecionar(1);
  560.   dtRC=millis();
  561.   while (analogRead(pinV)<647){} // 647 = 63.2% Vcc => (nessa voltagem  t=rc)
  562.   dtRC=millis()-dtRC;
  563.   if (dtRC>=100) { // dentro da faixa Cx>1mF
  564.     cx=(float)dtRC/re[entrada];
  565.     unidadeRC='m';  //resultado em mF
  566.   } else { // fora da faixa, subir para escala 2
  567.     descarregar();
  568.     selecionar(2);
  569.     dtRC=millis();
  570.     while (analogRead(pinV)<647){}
  571.     dtRC=millis()-dtRC;
  572.     if (dtRC>=10) { // dentro da faixa
  573.       cx=(float)dtRC*1000.0/re[entrada];
  574.       unidadeRC='u'; // resultado em uF
  575.     } else { // fora da faixa, então subir escala
  576.       descarregar();
  577.       selecionar(3);
  578.       dtRC=millis();
  579.       while (analogRead(pinV)<647){}
  580.       dtRC=millis()-dtRC;
  581.       cx=(float)dtRC*1000000.0/re[entrada];
  582.       unidadeRC='n'; // resultado em nF
  583.     }
  584.   }
  585.   Serial.print(">c="); Serial.print(entrada); Serial.print("\t"); Serial.print(cx); Serial.print(" "); Serial.print(unidadeRC); Serial.println("F");
  586. }

  587. void lerEntrada(byte e){
  588.   selecionar(e);
  589.   dtRC=micros();
  590.   vi=analogRead(pinV);
  591.   v=0;
  592.   for (int k=0; k<10; k++){
  593.      v+=analogRead(pinV);
  594.   }
  595.   v/=10;
  596.   vf=analogRead(pinV);
  597.   dtRC=micros()-dtRC;
  598. }

  599. void descarregar(){
  600.   selecionar(0);
  601.   while (analogRead(pinV)>0){}
  602. }

  603. void calcRx(){
  604.   float re[]={0.0,145.2,20692.9,1017847.5};
  605.   float vcc[]={0,871.5,1026.3,1027.1};
  606.   float rx=0;
  607.   rx=re[entrada]*(float)v/(vcc[entrada]-(float)v);
  608.   Serial.print(">r="); Serial.print(entrada); Serial.print("\t");
  609.   switch (entrada) {
  610.      case 1:
  611.       if (rx>=1000){
  612.         rx/=1000;
  613.         Serial.print(rx); Serial.println(" Kohm");
  614.       } else {
  615.         Serial.print(rx); Serial.println(" ohm");
  616.       }
  617.       break;
  618.      case 2:
  619.       Serial.print(rx/1000); Serial.println(" Kohm");
  620.       break;
  621.      case 3:
  622.       Serial.print(rx/1000000); Serial.println(" Mohm");
  623.       break;
  624.   }
  625. }

  626. void selecionar(byte e){
  627.   entrada=e;
  628.   digitalWrite(pinA,bitRead(entrada,0));
  629.   digitalWrite(pinB,bitRead(entrada,1));
  630. }

  631. Processing示波器代码(部分修改):
  632. String versao="v1.0";
  633. PFont font;

  634. byte escLinear=0; // Dial com escala linear
  635. byte escLog=1;     // Dial com escala logarítimica (base 10)
  636. byte altMove=2; // mudar o valor ao arrastar o mouse "MouseDragged"
  637. byte altSolta=3; // mudar o valor ao soltar o botão do mouse "MouseReleased"
  638. boolean nInt=true; // n é inteiro (arredondar), ou decimal !nInt
  639. boolean fmt=true; // fmt=true="formatar",  !fmt=false="não formatar"
  640. boolean esperandoTrigger=false;
  641. int vTrigger=0; // valor do trigger (subindo) 0-1024 (0-5v)
  642. color cor[]={color(255, 0, 0), color(0, 255, 0), color(0, 0, 255), color(255,255,0)}; // canais: red,green,blue,yellow
  643. import processing.serial.*;
  644. PrintWriter output;
  645. boolean outputOpen=false;
  646. Botao save;
  647. int qSave=0;
  648. Serial port;
  649. Com com;
  650. Tela tela;
  651. CanalXYZ chXYZ;
  652. Botao resetEixos;
  653. Botao resetMedir;
  654. Canal canal[]=new Canal[4];
  655. //byte chq=4; // qtd de canais ativos
  656. Grupo grupo[]=new Grupo[3]; // usado para alterar v/div e ms/div simultaneamente em todos os canais usando SHIFT
  657. // painel para os controles de Amostragem
  658. Painel pnlAmostra; // painel
  659. Dial dt; // delta t (tempo de cada leitura)
  660. Dial q;  // quantidade de leituras
  661. Botao umaAmostra; // solicita uma Amostra
  662. Botao variasAmostras; // solicita várias Amostras
  663. Botao fluxoContinuo;  // entra com leitura a cada dt
  664. FmtNum tTotal; // tempo total da amostragem dt*q

  665. Botao demo[]=new Botao[3]; // botões para gerar sinais de demonstração
  666. float fase1, fase2, t1, t2; // fase dos DEMO //para noise(t) do demo
  667. CheckBox verPontos; // ver os pontos da amostragem
  668. CheckBox calcFreq; // detectar frequencia
  669. CheckBox grafDif; // (ver) mostrar gráfico Diferença (parecido com a derivada)

  670. //Dial ruido; // usado para melhorar a detecção da frequencia

  671. // painel para medir resistor/capacitor
  672. Painel pnlRC; // o valor é colocado em tex2 do CheckBox RC
  673. CheckBox RC; // ativa/desativa medidor de resistor/capacitor

  674. // painel para o Gerador de Sinal
  675. Painel pnlSinal;
  676. CheckBox sinal; // f e t são dependentes f=1/t, t=1/f
  677. Dial fSinal;    // f (frequencia) do Sinal (10kHz-0.125Hz)
  678. Dial tSinal;    // T (período) do Sinal (100us-8s)
  679. Dial tonSinal;  // tempo em ON (0-100%)

  680. // verificar se o tempo de leitura Real é igual ao desejado
  681. FmtNum tTotalReal, dtReal; // tempos reais de leitura enviados pelo Arduino
  682. boolean dtErro=false;
  683. float Q=45.0; //tamanho do quadrado na tela

  684. int chq=4; // qtd de canais selecionados (visiveis)
  685. //int qMax=102; // chq-qMax: 4-102, 3-136, 2-204, 1-408
  686. int ch[]={0,1,2,3}; // quais canais estão visiveis (ON)


  687. //temporarios
  688. int marg1, marg2; //margem temporaria para ajustar a posição dos objetos

  689. void setup() {
  690.   size(680, 700);
  691.   font = createFont("宋体.vlw",48);
  692.   textFont(font);
  693.   //size(800,700);
  694.   frameRate(10);
  695.   tela=new Tela(30+10, 60, 10*Q, 12*Q);  //horizontal 10divisoes , vertical 12divisoes
  696.   marg1=tela.x+tela.w+10;
  697.   marg2=marg1+200;
  698.   com=new Com(port, tela.x+tela.w-250, 5, 250, 55);
  699.      for (byte k=0; k<3; k++){ // deve estar antes do canal
  700.       grupo[k]=new Grupo();
  701.    }

  702.   resetEixos=new Botao("eixos",marg1+50,tela.y,45,20);
  703.   resetMedir=new Botao("medir",resetEixos.x+resetEixos.w+2,tela.y,45,20);

  704.   //demo & canais
  705.   for (byte k=0; k<4; k++) {
  706.     if (k<3) {demo[k]=new Botao(str(k+1), marg1+50+k*30, tela.y/2-10, 30, 20);}
  707.     canal[k]=new Canal(k, cor[k], marg1, tela.y+27+k*110, 143, 100); //h115
  708.   }
  709.    chXYZ=new CanalXYZ(color(255,0,255),marg1,canal[3].y+canal[3].h+10,143,80);
  710.   chXYZ.verCanais.clicado=true;

  711.   verPontos=new CheckBox("ver pontos", chXYZ.x, chXYZ.y+chXYZ.h+5, 15);
  712.   calcFreq=new CheckBox("detectar freq.", verPontos.x, verPontos.y+verPontos.h+5, 15);
  713.   grafDif=new CheckBox("ver",calcFreq.x+calcFreq.w,calcFreq.y,15);
  714.   save=new Botao("salvar datax.txt",calcFreq.x,calcFreq.y+calcFreq.h+5,150,20);
  715.   //medidor de resistor/capacitor
  716.   pnlRC=new Painel("", tela.x, tela.y+tela.h+10, 125, 40);
  717.   RC=new CheckBox("medir res./cap.", pnlRC.x, pnlRC.y, 15);
  718.   //Gerador de Sinais - agora só gera onda quadrada, depois vai gerar triangulo, denteDeSerra, e senidal
  719.   pnlSinal=new Painel("", pnlRC.x+pnlRC.w+10, pnlRC.y, 100, 85);
  720.   sinal=new CheckBox("Ger.Sinal", pnlSinal.x, pnlSinal.y, 15);
  721.   fSinal=new Dial(escLog, altSolta, !nInt, fmt, "f", "Hz", 50f, 125e-3f, 10e3f, pnlSinal.x+5, sinal.y+sinal.h+2, pnlSinal.w-10, 20);
  722.   tSinal=new Dial(escLog, altSolta, !nInt, fmt, "T", "s", 20e-3f, 100e-6f, 8f, fSinal.x, fSinal.y+fSinal.h+2, fSinal.w, fSinal.h);
  723.   tonSinal=new Dial(escLinear, altSolta, nInt, !fmt, "Ton", "%", 25f, 0f, 100f, tSinal.x, tSinal.y+tSinal.h+2, tSinal.w, tSinal.h);
  724.   // posicionamento da Amostragem
  725.   pnlAmostra=new Painel("Amostragem", pnlSinal.x+pnlSinal.w+10, pnlSinal.y, 200, 85);
  726.   dt=new Dial(escLog, altSolta, nInt, fmt, "dt", "s", 1e-3f, 10e-6f, 2f, pnlAmostra.x+5, pnlAmostra.y+20, 100, 20);
  727.   dtReal=new FmtNum(0,nInt,fmt);
  728.   q=new Dial(escLinear, altSolta, nInt, !fmt, "q", "", 100, 1, 100, dt.x+dt.w+5, dt.y, 60, 20);
  729.   tTotal=new FmtNum(dt.v.getV()*q.v.getV(), !nInt);
  730.   tTotalReal=new FmtNum(0,!nInt);
  731.   umaAmostra=new Botao("uma", dt.x, dt.y+dt.h+5, 50, 20);
  732.   variasAmostras=new Botao("varias", umaAmostra.x+umaAmostra.w+5, umaAmostra.y, umaAmostra.w, umaAmostra.h);
  733.   fluxoContinuo=new Botao("fluxo", variasAmostras.x+variasAmostras.w+5, variasAmostras.y, variasAmostras.w, variasAmostras.h);
  734. }

  735. void draw() {
  736.   //==== Construir a tela e mostrar os controles =========
  737.   background(100);
  738.   fill(0, 255, 255);
  739.   textAlign(LEFT, TOP);
  740.   textSize(18);
  741.   text("四通道示波器 "+versao, tela.x, 12);
  742.   fill(0);
  743.   textSize(12);
  744.   text("    DiscoverySoft.com", tela.x, tela.y-15);
  745.   tela.display();
  746.   textSize(15);
  747.   fill(0);
  748.   textAlign(RIGHT, CENTER);
  749.   text("演示", demo[0].x-5, demo[0].y+demo[0].h/2); //tela.x+tela.w+10,tela.y);
  750.   text("重置",resetEixos.x-5,resetEixos.y+resetEixos.h/2);
  751.    chXYZ.display();
  752.     for (byte k=0; k<4; k++) {
  753.     if (k<3){demo[k].display();}
  754.         canal[k].display();
  755.   }
  756.    verPontos.display();
  757.   calcFreq.display();
  758.   grafDif.display();
  759.   //ruido.display();
  760.   save.display();
  761.   com.display();
  762.   resetEixos.display();
  763.   resetMedir.display();

  764.   tTotal.setV(dt.v.getV()*q.v.getV());
  765.   pnlAmostra.tex2="("+tTotal.printV()+"s)";
  766.   pnlAmostra.display();
  767.   dt.display();
  768.   q.display();  
  769.   umaAmostra.display();
  770.   variasAmostras.display();
  771.   fluxoContinuo.display();
  772.   //== mostrar o dtReal, tTotalRea e o erro
  773.   textAlign(LEFT);
  774.   if (dtErro){ fill(255,0,0); } else {fill(0,20,0); }
  775.   String tex="Real: dt"+dtReal.printV()+"s";
  776.   if (fluxoContinuo.clicado==false){
  777.      tex+="  total"+tTotalReal.printV()+"s";
  778.   }
  779.   text(tex,pnlAmostra.x+5,pnlAmostra.y+pnlAmostra.h-2);
  780.   fill(0);
  781.   pnlRC.display();
  782.   RC.display();
  783.   pnlSinal.display();
  784.   sinal.display();
  785.   fSinal.display();
  786.   tSinal.display();
  787.   tonSinal.display();

  788.   //=== se DEMO estiver ativado, então, gerar os dados ===
  789.   if (demo[0].clicado){
  790.         float mf=second()/10; // de 10 em 10 segundos faz multiplos da frequencia mf*freq
  791.         for (int k=0; k<q.v.v; k++){
  792.            canal[0].buffer[k]=(int)(512.0*(1+sin(2.0*PI*fSinal.v.v*((float)k*dt.v.v))));
  793.            canal[1].buffer[k]=(int)(512.0*(1+sin(fase1+2.0*PI*tonSinal.v.v/10.0*fSinal.v.v*((float)k*dt.v.v))));
  794.            canal[2].buffer[k]=(canal[0].buffer[k]+canal[1].buffer[k])/2;
  795.            canal[3].buffer[k]=(int)(512.0*(1+sin(2.0*PI*fSinal.v.v*(k*dt.v.v)+sin(2*PI*mf*fSinal.v.v*(k*dt.v.v)))));
  796.         }
  797.            fase1+=2*PI/100;
  798.         canal[0].atualizou=true;
  799.         canal[1].atualizou=true;
  800.         canal[2].atualizou=true;
  801.         canal[3].atualizou=true;
  802.   } else if (demo[1].clicado){
  803.         float qmax=1/(fSinal.v.v*2*dt.v.v);
  804.         float qmin=qmax*tonSinal.v.v/100.0;
  805.         float qc=0.0;
  806.         float fator=0;
  807.         float vq=0;        
  808.         float f0=(fase1/(2.0*PI*fSinal.v.v*dt.v.v))%qmax;
  809.         float f1=((fase1+radians(120))/(2.0*PI*fSinal.v.v*dt.v.v))%qmax;
  810.         float f2=((fase1+radians(240))/(2.0*PI*fSinal.v.v*dt.v.v))%qmax;

  811.         for (int k=0; k<q.v.v; k++){
  812.            qc=k % qmax;
  813.            if (qc<qmin) fator=0; else fator=1.0;
  814.                t2=((float)k+f0) % qmax;
  815.            if (t2<qmin) vq=0; else vq=1.0;
  816.            canal[0].buffer[k]=(int)(vq*512.0*(sin(fase1+2.0*PI*fSinal.v.v*((float)k*dt.v.v))));
  817.            canal[3].buffer[k]=(int)(vq*1023.0);

  818.            t2=((float)k+f1)%qmax;
  819.            if (t2<qmin) vq=0; else vq=1.0;
  820.            canal[1].buffer[k]=(int)(vq*512.0*(sin(fase1+radians(120)+2.0*PI*fSinal.v.v*((float)k*dt.v.v))));

  821.            t2=((float)k+f2)%qmax;
  822.            if (t2<qmin) vq=0; else vq=1.0;
  823.            canal[2].buffer[k]=(int)(vq*512.0*(sin(fase1+radians(240)+2.0*PI*fSinal.v.v*((float)k*dt.v.v))));

  824.          }

  825.         canal[0].atualizou=true;
  826.         canal[1].atualizou=true;
  827.         canal[2].atualizou=true;
  828.         canal[3].atualizou=true;

  829.   } else if (demo[2].clicado){

  830.         float qmax=1.0/(2*dt.v.v*fSinal.v.v);
  831.         float qmin=qmax*tonSinal.v.v/100.0;
  832.         float qc=0.0;
  833.         float fator=0;
  834.         for (int k=0; k<q.v.v; k++){
  835.            qc=k % qmax;
  836.                   if (qc<qmin) fator=1; else fator=0;
  837.            canal[0].buffer[k]=(int)(fator*1023.0);
  838.            if (qc<qmin) {
  839.              canal[1].buffer[k]=(int)(512.0*(1.0-exp(-qc*100.0*dt.v.v)));
  840.            } else {
  841.              canal[1].buffer[k]=(int)(512.0*(exp(-(qc-qmin+1)*100.0*dt.v.v)));
  842.            }
  843.            canal[2].buffer[k]=(int)(512.0+512.0*(sin(radians(240)+2.0*PI*fSinal.v.v*((float)k*dt.v.v))));
  844.            canal[3].buffer[k]=(int)(fator*512.0*(sin(2.0*PI*fSinal.v.v*((float)k*dt.v.v))));
  845.            }
  846.            fase1+=2*PI/100;
  847.         canal[0].atualizou=true;
  848.         canal[1].atualizou=true;
  849.         canal[2].atualizou=true;
  850.         canal[3].atualizou=true;

  851.   }


  852. }


  853. void mouseClicked() {
  854.   //-- verificar se é para abrir Serial --
  855.   int r=com.mouseClicado();
  856.   if (r==1) { // retornou 1 então abrir serial
  857.     try {
  858.       //port=new Serial(this,com.ports[com.indPort],int(com.speeds[com.indSpeed]));
  859.       port=new Serial(this, com.ports[com.indPort], int(com.speeds[com.indSpeed]));
  860.       port.bufferUntil(10); //configurado para pegar linhas inteiras
  861.       com.conectado=true;
  862.       com.erro=false;


  863.     }
  864.     catch(Exception e) {
  865.       println("erro abrindo Serial:", e);
  866.       com.conectado=false;
  867.       com.erro=true;
  868.     }

  869.     if (com.conectado){      // start default was placed when eventSerial receives >init=v1.5
  870.       /*
  871.       //initProgram();
  872.       println("init delay 5000");
  873.       delay(5000);
  874.       println("end delay 5000");
  875.       for (int k=0;k<4;k++){
  876.         canal[k].chN.clicado=true;
  877.       }
  878.       // ligar uma amostra
  879.      variasAmostras.clicado=true;
  880.      if (variasAmostras.clicado) {
  881.         port.write("vo");
  882.       } else {
  883.         port.write("vx");
  884.       }
  885.       println("Abri Serial");
  886.       println("variasAmostra.clicado=",variasAmostras.clicado);
  887.       */
  888.     }

  889.   } else if (r==-1) { //retornou -1 então fechar serial
  890.     port.stop();
  891.     com.conectado=false;
  892.     com.versionArduino.tex="";
  893.     com.erro=false;
  894.   }

  895.   if (resetEixos.mouseClicado()){
  896.     for (int k=0; k<4;k++){
  897.      canal[k].p0=tela.y+3*Q*(k+1);//posição da tensão zero
  898.     }
  899.     resetEixos.clicado=false;
  900.   }

  901.   if (resetMedir.mouseClicado()){
  902.      for (int k=0; k<4;k++){
  903.         canal[k].telaClicou=false;
  904.      }
  905.      resetMedir.clicado=false;
  906.   }


  907.   /*
  908.   if (XYZ.mouseClicado()) {
  909.     if (XYZ.clicado) {
  910.       canal[0].chN.clicado=true;
  911.       canal[1].chN.clicado=false;
  912.       canal[2].chN.clicado=false;
  913.       canal[3].chN.clicado=false;
  914.     } else {
  915.       canal[1].chN.clicado=true;
  916.       canal[2].chN.clicado=true;
  917.       canal[3].chN.clicado=true;
  918.     }
  919.   }
  920.   */
  921.   chXYZ.mouseClicado();
  922.   //XYZ.mouseClicado();
  923.   // canais selecionados do XYZ
  924.   /*
  925.   for (int k=0;k<3;k++){
  926.      if(selXYZ[k].mouseClicado()){
  927.         int j=10-4-(parseInt(selXYZ[0].tex)+parseInt(selXYZ[1].tex)+parseInt(selXYZ[2].tex));
  928.         selXYZ[k].tex=str(j);
  929.         selXYZ[k].cor_ativo=cor[j];
  930.         selXYZ[k].clicado=true;
  931.      }
  932.    }
  933.    */
  934.   // habilitar XYZ
  935.   //XYZ.mouseClicado();  

  936.   for (int k=0; k<4; k++) {
  937.     if (canal[k].mouseClicado()){ // se alterou o Chn para visível ou não visível
  938.        if (com.conectado){                           // enviar comando para o Arduino não ler esse canal
  939.          if (canal[k].chN.clicado){
  940.             port.write("c"+str(k)+"o");
  941.          } else {
  942.             port.write("c"+str(k)+"x");
  943.          }
  944.        }
  945.        verificarQ();
  946.     }
  947.   }

  948.   for (int k=0; k<3;k++){
  949.     if (demo[k].mouseClicado()) { // Acionar o DEMO e desmarcas os outros 2
  950.       if (demo[k].clicado) {
  951.         int total=0;
  952.         for (int k2=0; k2<3;k2++){
  953.           if (demo[k2].clicado) total++;         
  954.         }
  955.         if (total<=1) {
  956.           tonSinal.salvar();
  957.           fSinal.salvar();
  958.           tSinal.salvar();
  959.         }
  960.         for (int j=0; j<k; j++) {
  961.           demo[j].clicado=false;
  962.         }
  963.         for (int j=2; j>k; j--) {
  964.           demo[j].clicado=false;
  965.         }
  966.         tonSinal.alterar=altMove;
  967.         fSinal.alterar=altMove;
  968.         tSinal.alterar=altMove;
  969.       } else {
  970.         tonSinal.restaurar();
  971.         tonSinal.alterar=altSolta;
  972.         fSinal.restaurar();
  973.         fSinal.alterar=altSolta;
  974.         tSinal.restaurar();
  975.         tSinal.alterar=altSolta;
  976.       }
  977.     }
  978.   }



  979.   // botões para medir tempo x tensão nos 4 canais (e botão de limpar x)
  980.   /*
  981.   for (int k=0;k<5;k++){
  982.     if (medir[k].mouseClicado()){
  983.        if (medir[k].clicado){
  984.           for (int j=0; j<k;j++){
  985.              medir[j].clicado=false;
  986.           }
  987.           for (int j=3;j>k;j--){
  988.             medir[j].clicado=false;
  989.           }
  990.        }
  991.        if (k==4){ // limpar os retangulos
  992.          for (int i=0; i<4; i++){
  993.             canal[i].telaClicou=false;
  994.          }
  995.        }
  996.     }
  997.   }
  998.   */

  999.   // botões para acionar o trigger nos canais
  1000.   /*
  1001.   for (int k=0;k<5;k++){
  1002.     if (trigger[k].mouseClicado()){
  1003.        if (trigger[k].clicado){
  1004.           for (int j=0; j<k;j++){
  1005.              trigger[j].clicado=false;
  1006.           }
  1007.           for (int j=4;j>k;j--){
  1008.             trigger[j].clicado=false;
  1009.           }
  1010.           //enviar comando para o Arduino
  1011.           if (com.conectado) {
  1012.             port.write("t"+trigger[k].tex);
  1013.           }      
  1014.        } else{
  1015.          if (com.conectado){
  1016.             port.write("tx");
  1017.          }
  1018.        }
  1019.     }
  1020.   }
  1021.   */

  1022.   verPontos.mouseClicado();
  1023.   calcFreq.mouseClicado();
  1024.   grafDif.mouseClicado();

  1025.   //08-Jun-2017 write data to file
  1026.   if (save.mouseClicado()){
  1027.         // 14-Jun-2017 save fluxo or save memory
  1028.         //println("fluxoContinuo.clicado=",fluxoContinuo.clicado);
  1029.         if (fluxoContinuo.clicado){
  1030.           if (outputOpen==false){ // não está gravando, então iniciar a gravação
  1031.             //println("outputOpen==false => ",outputOpen);
  1032.             String fileName ="dataf"+nf(year(),4)+nf(month(),2)+nf(day(),2)+nf(hour(),2)+nf(minute(),2)+nf(second(),2)+".txt";
  1033.             output=createWriter(fileName);
  1034.             outputOpen=true;
  1035.             save.tex="salvando";
  1036.             // cabeçalho
  1037.             //output.println("BegOscopio v"+versao+" "+nf(year())+"-"+nf(month())+"-"+nf(day())+" "+nf(hour())+":"+nf(minute())+":"+nf(second()));
  1038.             output.print("dt(");output.print(dt.v.printV());output.print(dt.unidade);output.print(")");
  1039.             for (int k=0; k<4; k++){
  1040.                if (canal[k].chN.clicado){
  1041.                  output.print('\t');output.print("ch");output.print(k);output.print("(mV)");
  1042.                }
  1043.             }
  1044.             output.println();
  1045.             qSave=0;
  1046.             // ao entrar cada dado no fluxo gravar em output.print()
  1047.             // gravar na rotina de entrada
  1048.           } else { // save já está gravando, então parar a gravação
  1049.             //println("outputOpen==true => ",outputOpen);
  1050.             output.close();
  1051.             outputOpen=false;
  1052.             qSave=1;
  1053.             if (qSave>10) {qSave=1;}
  1054.             save.tex="salvar datax.txt" + "-"+qSave;
  1055.             save.clicado=false;
  1056.           }
  1057.         } else {
  1058.           String fileName ="data"+nf(year(),4)+nf(month(),2)+nf(day(),2)+nf(hour(),2)+nf(minute(),2)+nf(second(),2)+".txt";
  1059.           output=createWriter(fileName);
  1060.           // cabeçalho
  1061.           //output.println("BegOscopio v"+versao+" "+nf(year())+"-"+nf(month())+"-"+nf(day())+" "+nf(hour())+":"+nf(minute())+":"+nf(second()));
  1062.           output.print("dt(");output.print(dt.v.printV());output.print(dt.unidade);output.print(")");
  1063.           for (int k=0; k<4; k++){
  1064.              if (canal[k].chN.clicado){
  1065.                output.print('\t');output.print("ch");output.print(k);output.print("(mV)");
  1066.              }
  1067.           }
  1068.           output.println();
  1069.           // dados
  1070.           float f=5000.0/1023.0;
  1071.           for (int k2=0; k2<q.v.v;k2++){
  1072.             output.print(k2);
  1073.             for (int k=0; k<4; k++) {
  1074.               if (canal[k].chN.clicado){
  1075.                 output.print('\t');output.print(int(canal[k].v[k2]*f));
  1076.               }
  1077.             }
  1078.             output.println();
  1079.           }

  1080.           output.close();
  1081.           qSave+=1;
  1082.           if (qSave>10) {qSave=1;}
  1083.           save.tex="salvar datax.txt" + "-"+qSave;
  1084.           save.clicado=false;
  1085.         }
  1086.   }
  1087.   //ruido.mouseClicado();

  1088.   //se clicou em dt ou q então enviar comando para Arduino e ajustar tela
  1089.   if (dt.mouseClicado()) { // se true alterou dt, então ajustarFt() (escala de t na tela)
  1090.     enviarDt();
  1091.     ajustarFt();
  1092.   }
  1093.   if (q.mouseClicado()) { // se true alterou q, então ajustarFt()
  1094.     enviarQ();
  1095.     ajustarFt();
  1096.   }

  1097.   if (RC.mouseClicado()) {
  1098.     if (com.conectado) {
  1099.       if (RC.clicado) {
  1100.         port.write("ro");
  1101.       } else {
  1102.         port.write("rx");
  1103.         RC.tex2="";
  1104.       }
  1105.     } else {
  1106.       RC.clicado=false;
  1107.     }
  1108.   }

  1109.   if (umaAmostra.mouseClicado()) { // receber apenas Uma Amostra
  1110.     variasAmostras.clicado=false;
  1111.     fluxoContinuo.clicado=false;
  1112.     if (outputOpen) {
  1113.       fecharDados();
  1114.     }
  1115.     if (com.conectado) {
  1116.       port.write("1");
  1117.     }
  1118.     umaAmostra.clicado=false;
  1119.     // verificar se tem algum trigger acionado para que ele fique esperando o disparo
  1120.     // vai ficar piscando para indicar que está aguardando o disparo.
  1121.     int k2=-1;
  1122.     for (int k=0; k<4;k++){
  1123.       if (canal[k].trigger.clicado) {
  1124.          k2=k;
  1125.          break;
  1126.       }
  1127.     }
  1128.     //println("k2=",k2);

  1129.     if (k2>=0 && k2<=3){
  1130.        pnlAmostra.piscar=true;
  1131.        canal[k2].trigger.piscar=true;
  1132.        esperandoTrigger=true;
  1133.     } else {
  1134.        pnlAmostra.piscar=false;
  1135.        esperandoTrigger=false;
  1136.      }
  1137.   }
  1138.   if (variasAmostras.mouseClicado()) {
  1139.     umaAmostra.clicado=false;
  1140.     fluxoContinuo.clicado=false;
  1141.     if (outputOpen) {
  1142.       fecharDados();
  1143.     }
  1144.     if (com.conectado) {
  1145.       if (variasAmostras.clicado) {
  1146.         port.write("vo");
  1147.       } else {
  1148.         port.write("vx");
  1149.       }
  1150.     } else {
  1151.       variasAmostras.clicado=false;
  1152.     }
  1153.   }
  1154.   if (fluxoContinuo.mouseClicado()) {
  1155.     umaAmostra.clicado=false;
  1156.     variasAmostras.clicado=false;
  1157.     if (com.conectado) {
  1158.       if (fluxoContinuo.clicado) {
  1159.         port.write("fo");

  1160.       } else {
  1161.         port.write("fx");
  1162.         if (outputOpen){
  1163.           fecharDados();
  1164.         }
  1165.       }
  1166.     } else {
  1167.       fluxoContinuo.clicado=false;
  1168.     }
  1169.   }

  1170.   if (sinal.mouseClicado()){
  1171.      if (com.conectado){
  1172.         if (sinal.clicado){
  1173.            port.write("so");
  1174.         } else {
  1175.            port.write("sx");
  1176.         }
  1177.      }
  1178.   }

  1179.   if (fSinal.mouseClicado()){
  1180.     tSinal.setV(1/fSinal.v.v);
  1181.     enviarCmd("tSinal");
  1182.   }
  1183.   if (tSinal.mouseClicado()){
  1184.      fSinal.setV(1/tSinal.v.v);
  1185.      enviarCmd("tSinal");
  1186.   }
  1187.   if (tonSinal.mouseClicado()){
  1188.     enviarCmd("tonSinal");
  1189.   }
  1190. }

  1191. void verificarQ(){
  1192.   chq=0; // contar qtd de canais ativos
  1193.   for (int k=0; k<4; k++){
  1194.      if (canal[k].chN.clicado){
  1195.        chq+=1;
  1196.      }
  1197.   }
  1198.   //q.vMax=408.0/chq;
  1199.   switch (chq){
  1200.      case 0:
  1201.        q.vMax=0;
  1202.        break;
  1203.      case 1:
  1204.        q.vMax=400;
  1205.        break;
  1206.      case 2:
  1207.        q.vMax=200;
  1208.        break;
  1209.      case 3:
  1210.        q.vMax=130;
  1211.        break;
  1212.      case 4:
  1213.        q.vMax=100;
  1214.        break;
  1215.   }
  1216.   if (q.v.v>q.vMax) {
  1217.     q.setV(q.vMax);
  1218.     ajustarFt();
  1219.   } else {
  1220.     q.setV(q.v.v);
  1221.   }
  1222. }

  1223. void mousePressed() {
  1224.   //d.mousePressionou();
  1225.   for (int k=0; k<4; k++) {
  1226.     canal[k].mousePressionou();
  1227.   }
  1228.   chXYZ.mousePressionou();
  1229.   dt.mousePressionou();
  1230.   q.mousePressionou();
  1231.   //ruido.mousePressionou();

  1232.   // só para aparecer o verde do pressionado
  1233.   umaAmostra.mousePressionou();
  1234.   variasAmostras.mousePressionou();
  1235.   fluxoContinuo.mousePressionou();

  1236.   fSinal.mousePressionou();
  1237.   tSinal.mousePressionou();
  1238.   tonSinal.mousePressionou();

  1239.   for (int k=0; k<3;k++){
  1240.      demo[k].mousePressionou();
  1241.   }
  1242.   resetEixos.mousePressionou();
  1243.   resetMedir.mousePressionou();

  1244. }

  1245. void mouseReleased() {
  1246.   // d.mouseSoltou();
  1247.   for (int k=0; k<4; k++) {
  1248.     canal[k].mouseSoltou();
  1249.   }
  1250.   chXYZ.mouseSoltou();

  1251.   for (int k=0; k<3;k++){
  1252.      demo[k].mouseSoltou();
  1253.   }
  1254.   resetEixos.mouseSoltou();
  1255.   resetMedir.mouseSoltou();
  1256.   // só para aparecer o verde do pressionado
  1257.   umaAmostra.mouseSoltou();
  1258.   variasAmostras.mouseSoltou();
  1259.   fluxoContinuo.mouseSoltou();


  1260.   //se soltar o mouse no dt ou q, então enviar os dados para o Arduino
  1261.   if (dt.mouseSoltou()) {
  1262.     enviarDt();
  1263.     ajustarFt();
  1264.   }
  1265.   if (q.mouseSoltou()) {
  1266.     enviarQ();
  1267.     // acertar as escalas ft de cada canal
  1268.     ajustarFt();
  1269.   }


  1270.   //ruido.mouseSoltou();

  1271.   if (fSinal.mouseSoltou()) {
  1272.     tSinal.setV(1/fSinal.v.v);
  1273.     enviarCmd("tSinal");
  1274.   }
  1275.   if (tSinal.mouseSoltou()) {
  1276.     fSinal.setV(1/tSinal.v.v);
  1277.     enviarCmd("tSinal");
  1278.   }
  1279.   if (tonSinal.mouseSoltou()){
  1280.     enviarCmd("tonSinal");
  1281.   }


  1282.   // controle do y do XYZ
  1283.   //if (XYZ.clicado){
  1284.   //    XYZyPegou=false;
  1285.   //}


  1286. }

  1287. void mouseMoved() {
  1288.   //teste
  1289.   //  canal[0].cor=get(mouseX,mouseY);
  1290.   //    println("cor=",canal[0].cor);
  1291.   com.mouseMoveu();

  1292.   for (int k=0; k<4; k++) {
  1293.     canal[k].mouseMoveu();
  1294.   }
  1295.   chXYZ.mouseMoveu();
  1296.   dt.mouseMoveu();
  1297.   q.mouseMoveu();
  1298.   //ruido.mouseMoveu();

  1299.   fSinal.mouseMoveu();
  1300.   tSinal.mouseMoveu();

  1301.   tonSinal.mouseMoveu();
  1302. }

  1303. void mouseDragged() {
  1304.   //d.mouseArrastou();
  1305.   for (int k=0; k<4; k++) {
  1306.     canal[k].mouseArrastou();
  1307.   }
  1308.   chXYZ.mouseArrastou();
  1309.   dt.mouseArrastou();
  1310.   q.mouseArrastou();
  1311.   //ruido.mouseArrastou();

  1312.   if (fSinal.alterar==altSolta){
  1313.     fSinal.mouseArrastou();
  1314.     tSinal.mouseArrastou();
  1315.   } else {
  1316.     if (fSinal.mouseArrastou()){
  1317.        tSinal.setV(1/fSinal.v.v);
  1318.     }
  1319.     if (tSinal.mouseArrastou()){
  1320.       fSinal.setV(1/tSinal.v.v);
  1321.     }
  1322.   }


  1323.   tonSinal.mouseArrastou();

  1324.   // controle do y do XYZ
  1325.   //if (XYZ.clicado){
  1326.   //   if (XYZyPegou){
  1327.   //    XYZy=constrain(mouseY,tela.y,tela.y+10*Q)-mouseOffSet;
  1328.   //   }
  1329.   //}
  1330. }


  1331. void keyReleased(){
  1332.   keyPressed=false;
  1333. }


  1334. void fecharDados(){
  1335.       output.close();  
  1336.       outputOpen=false;
  1337.       if (qSave>10) {qSave=1;}
  1338.       save.tex="salvar datax.txt" + "-"+qSave;
  1339.       save.clicado=false;
  1340. }


  1341. /* ==========================================
  1342.      Comando enviados para o Arduino
  1343.    ========================================== */

  1344. //=== Ger.Sinal - Se alterou f/T/Ton - enviar comando para Arduino ==
  1345. void enviarCmd(String cmd){
  1346.   if (cmd.equals("tSinal")){
  1347.     if (com.conectado){
  1348.          port.write("p"+tSinal.v.printV());
  1349.          println("p"+tSinal.v.printV());
  1350.      }
  1351.   } else if (cmd.equals("tonSinal")){
  1352.     if (com.conectado){
  1353.          port.write("o"+tonSinal.v.printV()+"%");
  1354.          println("o"+tonSinal.v.printV()+"%");
  1355.       }
  1356.   }
  1357. }

  1358. //==Se alterou dt ou q enviar comando para Arduino e ajustar a escala da tela ==
  1359. void enviarDt() {
  1360.   if (com.conectado) {
  1361.     port.write("d"+dt.v.printV());
  1362.   }
  1363.   // acertar as escalas ft de cada canal
  1364.   ajustarFt();
  1365. }
  1366. void enviarQ() {
  1367.   if (com.conectado) {
  1368.     port.write("q"+q.v.printV()+".");
  1369.   }
  1370. }

  1371. void ajustarFt() {
  1372.   float ftNew=dt.v.getV()*q.v.getV()/10.0;
  1373.   println("ftNew=",ftNew," dt=",dt.v.getV()," q=",q.v.getV());
  1374.   for (int k=0; k<4; k++) {
  1375.     canal[k].ft.setV(ftNew);
  1376.   }
  1377. }

  1378. /*=====================================
  1379.       Entrada do Evento Porta Serial
  1380.   =====================================*/
  1381. void serialEvent(Serial p) {
  1382.   //if (p.available()>0) {}
  1383. try {
  1384.   String cmd="", val="";
  1385.   String tex=p.readStringUntil(10);
  1386.   //print(">>>> ",tex); //eliminar
  1387.   if (tex.charAt(0)=='>') { //comando: >cmd=v1(tab)v2(tab)v3(tab)
  1388.     int i=tex.indexOf("=");
  1389.     if (i>=0) { // encontrou sinal "=" (igual)  obs: i=-1 => não encontrou o sinal '='
  1390.       cmd=tex.substring(1, i); // pegar o comando obs: substring(inclusive,exclusive)
  1391.       val=tex.substring(i+1); // pegar o valor
  1392.       //println("cmd=",cmd," val=",val);
  1393.       if (cmd.equals("init")) { // init
  1394.         println("versionArduino=<",val,">");
  1395.         com.versionArduino.tex=".ino "+val.substring(0,val.length()-1);
  1396.         //start all channels
  1397.         for (int k=0;k<4;k++){
  1398.           canal[k].chN.clicado=true;
  1399.         }
  1400.        // enviar dt
  1401.         enviarDt();
  1402.        // verificar e enviar q
  1403.        verificarQ();
  1404.         enviarQ();

  1405.         // send command to Arduino -> start Signal Gennerator 60Hz tOn25%
  1406.         enviarCmd("tSinal");
  1407.         enviarCmd("tonSinal");
  1408.         sinal.clicado=true;
  1409.         port.write("so");

  1410.         // ligar varias amostra
  1411.        variasAmostras.clicado=true;
  1412.        port.write("vo");

  1413.        //if (variasAmostras.clicado) {
  1414.        //   port.write("vo");
  1415.        // } else {
  1416.        //   port.write("vx");
  1417.        // }
  1418.         println("Abri Serial");
  1419.         println("variasAmostra.clicado=",variasAmostras.clicado);

  1420.       } else if (cmd.equals("f")) { // entra fluxo de dados - deslocar dados e armazenar no final
  1421.         String tex2[]=splitTokens(val); //val = "0(t)dtReal(t)ch0(t)ch1(t)ch2"
  1422.         //deslocar os dados para baixo, para incluir o novo dado no final
  1423.         for (int j=0; j<4; j++) {
  1424.           for (int k=1; k<q.v.v; k++) {
  1425.             canal[j].v[k-1]=canal[j].v[k];
  1426.           }
  1427.         }
  1428.         canal[0].v[int(q.v.v-1)]=int(tex2[2]);
  1429.         canal[1].v[int(q.v.v-1)]=int(tex2[3]);
  1430.         canal[2].v[int(q.v.v-1)]=int(tex2[4]);
  1431.         canal[3].v[int(q.v.v-1)]=int(tex2[5]);
  1432.         dtReal.setV(float(tex2[1]));
  1433.         if (dtReal.v-dt.v.v>1.1*dt.v.v){ dtErro=true;} else {dtErro=false;}

  1434.         // salvar em arquivo
  1435.         if (outputOpen) {
  1436.           float f=5000.0/1023.0;
  1437.           //for (int k2=0; k2<q.v.v;k2++){
  1438.             int k2=int(q.v.v-1);
  1439.             output.print(qSave);
  1440.             qSave+=1;
  1441.             for (int k=0; k<4; k++) {
  1442.               if (canal[k].chN.clicado){
  1443.                 output.print('\t');output.print(int(canal[k].v[k2]*f));
  1444.               }
  1445.             }
  1446.             output.println();
  1447.             if (qSave % 100==0) { // de 100 em 100
  1448.               save.tex="salvando "+nf(qSave);
  1449.               output.flush();
  1450.             }
  1451.           //}
  1452.         }

  1453.         //println("cmd=",cmd," val=",val," dtReal=",dtReal.printV());


  1454.       } else if (cmd.equals("chq")) {       // entra qtd e quais canais serão recebidos
  1455.         int v[]=int(splitTokens(val));
  1456. //voltar        //        println("========================");
  1457. //voltar        //        println("cmd=",cmd," val=",val);
  1458.         chq=v[0];
  1459.         for (int k=0;k<chq;k++){
  1460.           ch[k]=v[k+1];
  1461.         }
  1462. //voltar        //        println("chs=",chq);
  1463.         for (int k=0;k<chq;k++){
  1464. //voltar        //           println("ch[",k,"]=",ch[k]);
  1465.         }
  1466. //voltar        //        println("========================");
  1467.       } else if (cmd.equals("v")) { // entrada de Varias Amostra
  1468.         int v[]=int(splitTokens(val));
  1469. //voltar        //        println("tex=",tex);
  1470.         //println("cmd=",cmd," val=",val);
  1471.         //println("v.length=",v.length," chq=",chq);
  1472.         //for (int k=0; k<v.length; k++){
  1473.         //   print(" v[",k,"]=",v[k]);
  1474.         //}
  1475.         //println("");

  1476.         if (v.length==chq+1){ // >v=1 1024 100 300 300
  1477.           for (int k=0; k<chq; k++){
  1478.              canal[ch[k]].buffer[v[0]]=v[k+1];
  1479.           }
  1480.         }
  1481. /*   
  1482.         int kk=v[0]; // indice da matriz
  1483.         canal[0].buffer[v[0]]=v[1];
  1484.         canal[1].buffer[v[0]]=v[2];
  1485.         canal[2].buffer[v[0]]=v[3];
  1486.         canal[3].buffer[v[0]]=v[4];
  1487. */
  1488.     } else if (cmd.equals("q")) { // quantidade de variaveis
  1489.        // q.setV(float(val));
  1490.       } else if (cmd.equals("dt")) { // tamanho do dt (ms)
  1491.         //dt.val=float(val);
  1492.       } else if (cmd.equals("tTotalReal")) { // tempo total da amostra
  1493.         //println("atualizou");
  1494.         tTotalReal.setV(float(val));
  1495.         //text(tTotalReal,pnlAmostra.x+2,pnlAmostra.y+pnlAmostra.h);
  1496. //voltar        //        println("cmd=",cmd," val=",val," tTotalReal=",tTotalReal.printV());
  1497.         canal[0].atualizou=true;  // terminou de entrar os dados então
  1498.         canal[1].atualizou=true;  //  carregar do buffer
  1499.         canal[2].atualizou=true;
  1500.         canal[3].atualizou=true;
  1501.         if (esperandoTrigger){
  1502.            esperandoTrigger=false;
  1503.            pnlAmostra.piscar=false;
  1504.            for (int k=0; k<4;k++){
  1505.              canal[k].trigger.piscar=false;
  1506.            }

  1507.         }
  1508.       } else if (cmd.equals("dtReal")){
  1509.         dtReal.setV(float(val));
  1510.         if (dtReal.n>dt.v.n+10){ dtErro=true;} else {dtErro=false;}
  1511.         //text(dtReal,pnlAmostra.x+2,pnlAmostra.y+pnlAmostra.h-12);
  1512. //voltar        //        println("cmd=",cmd," val=",val," dtReal=",dtReal.printV());

  1513.       } else if (cmd.equals("r") || cmd.equals("c") || cmd.equals("rc")) { // valor do resistor
  1514.         String tex2[]=splitTokens(val, "\t\r");
  1515.         //i=val.indexOf("\t");
  1516.         //for (int k=0; k<tex2.length; k++){
  1517.         //   print("tex2[",k,"]=",tex2[k]);
  1518.         //}
  1519.         //println();
  1520.         if (cmd.equals("rc")) cmd="";
  1521.         RC.tex2=cmd.toUpperCase()+" "+tex2[1]+" ("+tex2[0]+")";

  1522.       } else if (cmd.charAt(0)=='?') {  // carregando as configurações do Arduino (ao conectar)
  1523.         cmd=cmd.substring(2); // eliminar 2 caracteres iniciais "? comando"
  1524.         val=val.substring(0,val.length()-2); // eliminar 2 caracteres finais:  \n\r(13,10)(^M^J) (retorno de linha)        
  1525. //voltar        //        println("cmd=",cmd," val=",val);
  1526.         if (cmd.equals("q")){ // val=100
  1527.           q.v.v=float(val);
  1528.         } else if (cmd.equals("dt")){
  1529.           char unid=val.charAt(val.length()-2);
  1530.           val=val.substring(0,val.length()-2);
  1531. //voltar        //          println("unid=",unid," val=",val);
  1532.           if (unid=='u'){
  1533.             val=val+"e-6";            
  1534.           }else{
  1535.             val=val+"e-3";
  1536.           }
  1537. //voltar        //          println("val=",val);
  1538.           dt.setV(float(val));
  1539.           ajustarFt();

  1540.         }else if (cmd.equals("canalTrigger")){ // val= 0,1,2,x
  1541.            for (int k=0;k<4;k++){canal[k].trigger.clicado=false;}
  1542.            if (!val.equals("x")){
  1543.               canal[int(val)].trigger.clicado=true;   
  1544.            }
  1545.         } else if (cmd.equals("uma")){ // val= 0 ou 1
  1546.           //umaAmostra.clicado=boolean(int(val));
  1547.         }else if (cmd.equals("varias")){ // val= 0 ou 1
  1548.           //variasAmostras.clicado=boolean(int(val));
  1549.         }else if (cmd.equals("fluxo")){ // val= 0 ou 1
  1550.           fluxoContinuo.clicado=boolean(int(val));
  1551.         }else if (cmd.equals("lerRC")){ // val= 0 ou 1
  1552.           RC.clicado=boolean(int(val));
  1553.         }else if (cmd.equals("pwmOn")){ // val=0 ou 1 (false/true)
  1554.           sinal.clicado=boolean(int(val));
  1555.           //println("sinal.clicado=",sinal.clicado," val=",val," boolean(val)=",boolean(val));
  1556.           //for (int k=0; k<val.length();k++){
  1557.           //   println(k," - ",val.charAt(k)," - ",byte(val.charAt(k)));
  1558.           //}
  1559.           //println("int(val)=",int(val)," int(''0'')",int("0")," int(''1'')",int(1));
  1560.           //println("b(''0'')=",boolean("0")," b(''1'')=",boolean("1")," b('0')=",boolean('0')," b('1')=",boolean('1'));
  1561.         }else if (cmd.equals("pwmP")){ // cmd="pwmP", val=" 100000us"
  1562.           val=val.substring(0,val.length()-2)+"e-6"; // remover "us" e colocar "e-6" (microsegundos)
  1563.           tSinal.setV(float(val));
  1564.           fSinal.setV(1/tSinal.v.v);
  1565.           //println("pwmP=",float(val));
  1566.         }else if (cmd.equals("pwmPon")){  // cmd="pwmPon", val="25%"
  1567.           val=val.substring(0,val.length()-1);
  1568.           tonSinal.setV(float(val));
  1569. //voltar        //          println("pwmPon=",float(val));
  1570.         }else {
  1571.            print("else >>>> ",tex);
  1572.          }
  1573.       }
  1574.     }
  1575.     //println("cmd=",cmd);
  1576.     //println("val=",val);
  1577.   }
  1578. }
  1579. catch(RuntimeException e){
  1580.     e.printStackTrace();

  1581. }
  1582. }
复制代码

* Processing 版本3.5.3

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表