单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:2246|回复: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

评分

黑币 +100
收起理由
+ 100
共享资料的黑币奖励!

查看全部评分

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

Powered by 单片机教程网