URGENTE sou iniciante. ledes acenderem conforme valor

Estou tentando inicialmente fazer leds acenderem conforme obtenho o valor do meu relogio comparador com saida de dados, juntei alguns programas mas nao consegui fazer ele funcionar, por favor me ajudem

Este é o codigo que uso para fazer a leitura do relogio comparador

int i;

int sign;

long value;

float result;

int clockpin = 4;  

int datapin = 5;

int ledPin = 8;

unsigned long tempmicros;

 

 

void setup() {

  Serial.begin(9600);

  pinMode(clockpin, INPUT);

  pinMode(datapin, INPUT);

}



 void loop () {

  while (digitalRead(clockpin)==HIGH) {} //if clock is LOW wait until it turns to HIGH

  tempmicros=micros();

  while (digitalRead(clockpin)==LOW) {} //wait for the end of the HIGH pulse

  if ((micros()-tempmicros)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence

    decode(); //decode the bit sequence

  }

}

 

void decode() {

  sign=1;

  value=0;

  for (i=0;i<23;i++) {

    while (digitalRead(clockpin)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed

    while (digitalRead(clockpin)==LOW) {} //wait until clock returns to LOW

    if (digitalRead(datapin)==LOW) {

      if (i<20) {

        value|= 1<<i;

      }

      if (i==20) {

        sign=-1;

      }

    }

  }

  result=(value*sign)/3856.8376068376;    

  Serial.println(result,2); //print result with 2 decimals

  delay(1000);

}

e este é o codigo do arquivo que upei logo abaixo que foi minha tentativa fracassada

int i;

int sign;

long value;

float result;

int clockpin = 4;  

int datapin = 5;

int ledPin1 = 13;

int ledPin2 = 9;

unsigned long tempmicros;

 
int incomingByte = Serial.read(); 
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {

  Serial.begin(9600);

  pinMode(clockpin, INPUT);

  pinMode(datapin, INPUT);
  
  pinMode(ledPin1, OUTPUT);
  
  pinMode(ledPin1, OUTPUT);

}


///////////////////////////////////////////////////////////////////////////////////////////////////////////
 void loop () {
   
   
  
   

  while (digitalRead(clockpin)==HIGH) {} //if clock is LOW wait until it turns to HIGH

  tempmicros=micros();

  while (digitalRead(clockpin)==LOW) {} //wait for the end of the HIGH pulse

  if ((micros()-tempmicros)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence

    decode(); //decode the bit sequence

  }


  
 }
 
    

void decode() {

  sign=1;

  value=0;

  for (i=0;i<23;i++) {

    while (digitalRead(clockpin)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed

    while (digitalRead(clockpin)==LOW) {} //wait until clock returns to LOW

    if (digitalRead(datapin)==LOW) {

      if (i<20) {

        value|= 1<<i;

      }

      if (i==20) {

        sign=-1;

      }

    }

  }

  result=(value*sign)/3856.8376068376;    

  Serial.println(result,2); //print result with 2 decimals

  delay(5);
///////////////////////////////////////////////////////////////////////////////////////////////////////////

  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
   
    // if it's a capital H (ASCII 72), turn on the LED:
    if ( incomingByte == '2.46') {
      digitalWrite(ledPin2, HIGH);
    
    }
    // if it's an L (ASCII 76) turn off the LED:
    if ( incomingByte == '2.19') {
      digitalWrite(ledPin2, LOW);
    delay(5);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
    }

}
         }

sketch_dec17b.ino (2.03 KB)

Na verdade ele precisa movimentar o servo 1 para baixo se apresentar valor entre 2.12 e 2.45 e subir fora desses valores e o servo 2 teria que abaixar entre 2.45 e 3.19 e levantar fora desses valores

Estou tentando inicialmente fazer leds acenderem conforme obtenho o valor do meu relogio comparador com saida de dados

Comparador do que? Que saída de dados?

int incomingByte = Serial.read(); 
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {

  Serial.begin(9600);

Você está lendo do Serial antes de tê-lo inicializado, já que o código em escopo global é executado antes do setup(). Ainda mais: você não lê do Serial em nenhum outro lugar do seu código.

if ( incomingByte == '2.46') {
...
if ( incomingByte == '2.19') {

Aspas simples são para caracteres, os textos 2.46 e 2.19 não são caracteres, então a comparação nunca vai ser igual.

for (i=0;i<23;i++) {

Porque 23?

result=(value*sign)/3856.8376068376;

De onde veio esse número mágico 3856.8376068376?

Na verdade ele precisa movimentar o servo 1 para baixo se apresentar valor entre 2.12 e 2.45 e subir fora desses valores e o servo 2 teria que abaixar entre 2.45 e 3.19 e levantar fora desses valores

Onde estão os servos no seu código? O que são esses números 2.12, 2.45, 2.45 e 3.19?

Explique melhor o projeto, o que o código deveria fazer e o que faz.

boa tarde giova014

giova014:
Comparador do que? Que saída de dados?

int incomingByte = Serial.read(); 

///////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {

Serial.begin(9600);



Você está lendo do Serial antes de tê-lo inicializado, já que o código em escopo global é executado antes do setup(). Ainda mais: você não lê do Serial em nenhum outro lugar do seu código.



if ( incomingByte == ‘2.46’) {

if ( incomingByte == ‘2.19’) {



Aspas simples são para caracteres, os textos 2.46 e 2.19 não são caracteres, então a comparação nunca vai ser igual.



for (i=0;i<23;i++) {



Porque 23?



result=(value*sign)/3856.8376068376;



De onde veio esse número mágico 3856.8376068376?
Onde estão os servos no seu código? O que são esses números 2.12, 2.45, 2.45 e 3.19?

Explique melhor o projeto, o que o código deveria fazer e o que faz.

giova014:
Comparador do que? Que saída de dados?

este é um relogio comparador com saida de dados, é mais ou menos isso que preciso so que com algumas funçoes a mais no codigo do arduino

for (i=0;i<23;i++) {

esse 23 eu nao sei, pois como eu disse eu sou iniciante e peguei o codigo pronto so tentei modificar olhando outros codigos com a funçao que eu precisava e tentei juntalos

result=(value*sign)/3856.8376068376;

esse valor é utilizado para converter o sinal recebido para MM

giova014:
Onde estão os servos no seu código? O que são esses números 2.12, 2.45, 2.45 e 3.19?

Explique melhor o projeto, o que o código deveria fazer e o que faz.

esses valores sao o resultado da conversao do sinal para MM eles no caso estao em MM ja

o que eu preciso é que uma caneta risque uma esteira que o servo 1 movimentara quando o arduino estiver dentro do valor de 2.12 e 2.45 mm e o servo 2 risque entre os valores de 2.45 e 3.19 mm

ainda nao coloquei o codigo dos servos no programa por que nao sei mas estou tentando

por enquanto meu codigo so esta lendo os valores do relogio comparador sem muita precisao nao sei muito bem o porque mas da valores parecidos entao para testes esta bom.

Desde-ja agradeço a resposta e me desculpe pela minha ignorancia quanto a programação, estou tentando aprender mas é dificil

Entendi mais ou menos seu projeto.

No lugar dessa parte, que não sei porque está checando se há dados no Serial:

  result=(value*sign)/3856.8376068376;   

  Serial.println(result,2); //print result with 2 decimals

  delay(5);
///////////////////////////////////////////////////////////////////////////////////////////////////////////

  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
   
    // if it's a capital H (ASCII 72), turn on the LED:
    if ( incomingByte == '2.46') {
      digitalWrite(ledPin2, HIGH);
   
    }
    // if it's an L (ASCII 76) turn off the LED:
    if ( incomingByte == '2.19') {
      digitalWrite(ledPin2, LOW);
    delay(5);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
    }

Pode fazer algo assim:

  result=(value*sign)/3856.8376068376;  

  Serial.println(result,2); //print result with 2 decimals

  if( result > 2.12 && result < 2.45 ){
    // liga motor 1
  }
  else {
    // desliga motor 1
  }

  if( result > 2.45 && result < 3.19 ){
    // liga motor 2
  }
  else {
    // desliga motor 2
  }

Para controlar um servo, veja a seguinte referência:
Arduino - Servo

alterei aqui o que vc me mandou, mas tentando adicionar o codigo do servo esta dando um erro, nem sei se estou fazendo certo tambem, mas é errando que se aprende

Aqui esta o codigo agora:

#include <Servo.h>


int i;

int sign;

long value;

float result;

int clockpin = 4;

int datapin = 5;

int ledPin1 = 13;

int ledPin2 = 9;


      int pos1 = 0
      int pos2 = 180



unsigned long tempmicros;



Servo servo1;
Servo servo2;


                      ///////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {

  servo1.attach(9);
  servo2.attach(10);


  Serial.begin(9600);

  pinMode(clockpin, INPUT);

  pinMode(datapin, INPUT);

  pinMode(ledPin1, OUTPUT);

  pinMode(ledPin1, OUTPUT);

}


///////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop () {





  while (digitalRead(clockpin) == HIGH) {} //if clock is LOW wait until it turns to HIGH

  tempmicros = micros();

  while (digitalRead(clockpin) == LOW) {} //wait for the end of the HIGH pulse

  if ((micros() - tempmicros) > 500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence

    decode(); //decode the bit sequence

  }



}



void decode() {

  sign = 1;

  value = 0;

  for (i = 0; i < 23; i++) {

    while (digitalRead(clockpin) == HIGH) { } //wait until clock returns to HIGH- the first bit is not needed

    while (digitalRead(clockpin) == LOW) {} //wait until clock returns to LOW

    if (digitalRead(datapin) == LOW) {

      if (i < 20) {

        value |= 1 << i;

      }

      if (i == 20) {

        sign = -1;

      }

    }

  }



  ///////////////////////////////////////////////////////////////////////////////////////////////////////////

  result = (value * sign) / 3856.8376068376;

  Serial.println(result, 2); //print result with 2 decimals

  delay(5);

  if ( result > 2.12 && result < 2.45 ) {


    servo1.write(pos2);              // tell servo to go to position in variable 'pos'
    delay(15);

    // liga motor 1
    
  }
  else {

    servo1.write(pos1);              // tell servo to go to position in variable 'pos'
    delay(15);


    // desliga motor 1
  }

  if ( result > 2.45 && result < 3.19 ) {


 servo1.write(pos2);              // tell servo to go to position in variable 'pos'
    delay(15);

    
    // liga motor 2
  }
  else {


 servo1.write(pos1);              // tell servo to go to position in variable 'pos'
    delay(15);

    
    // desliga motor 2
  }

}

ele esta dando o seguinte erro

Arduino: 1.8.5 (Windows 8.1), Placa:"Arduino/Genuino Uno"

sketch_dec17b:24: error: expected ',' or ';' before 'int'

       int pos2 = 180

       ^

C:\Users\3D\Downloads\sketch_dec17b\sketch_dec17b.ino: In function 'void loop()':

sketch_dec17b:65: error: 'tempmicros' was not declared in this scope

   tempmicros = micros();

   ^

C:\Users\3D\Downloads\sketch_dec17b\sketch_dec17b.ino: In function 'void decode()':

sketch_dec17b:124: error: 'pos2' was not declared in this scope

     servo1.write(pos2);              // tell servo to go to position in variable 'pos'

                  ^

sketch_dec17b:142: error: 'pos2' was not declared in this scope

  servo1.write(pos2);              // tell servo to go to position in variable 'pos'

               ^

exit status 1
expected ',' or ';' before 'int'

Este relatório teria mais informações com
"Mostrar a saida detalhada durante a compilação"
opção pode ser ativada em "Arquivo -> Preferências"

e esta marcando esta parte do codigo

int pos2 = 180

desde ja agradeço a ajuda e desculpe-me qualquer coisa, estou bem perdido ainda no mundo do arduino hehehe

esqueci de falar

#include <Servo.h>


int i;

int sign;

long value;

float result;

int clockpin = 4;

int datapin = 5;

int ledPin1 = 13;

int ledPin2 = 12;






unsigned long tempmicros;



Servo servo1;
Servo servo2;


///////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {




  Serial.begin(9600);

  pinMode(clockpin, INPUT);

  pinMode(datapin, INPUT);

  pinMode(ledPin1, OUTPUT);

  pinMode(ledPin1, OUTPUT);

}


///////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop () {





  while (digitalRead(clockpin) == HIGH) {} //if clock is LOW wait until it turns to HIGH

  tempmicros = micros();

  while (digitalRead(clockpin) == LOW) {} //wait for the end of the HIGH pulse

  if ((micros() - tempmicros) > 500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence

    decode(); //decode the bit sequence

  }



}



void decode() {

  sign = 1;

  value = 0;

  for (i = 0; i < 23; i++) {

    while (digitalRead(clockpin) == HIGH) { } //wait until clock returns to HIGH- the first bit is not needed

    while (digitalRead(clockpin) == LOW) {} //wait until clock returns to LOW

    if (digitalRead(datapin) == LOW) {

      if (i < 20) {

        value |= 1 << i;

      }

      if (i == 20) {

        sign = -1;

      }

    }

  }



  ///////////////////////////////////////////////////////////////////////////////////////////////////////////

  result = (value * sign) / 3856.8376068376;

  Serial.println(result, 2); //print result with 2 decimals

  delay(5);

  if ( result > 2.12 && result < 2.45 ) {


    digitalWrite(ledPin2, HIGH);

    // liga motor 1

  }
  else {

    digitalWrite(ledPin2, LOW);

    // desliga motor 1
  }

  if ( result > 2.45 && result < 3.19 ) {


    digitalWrite(ledPin1, HIGH);


    // liga motor 2
  }
  else {


    digitalWrite(ledPin1, LOW);


    // desliga motor 2
  }

}

o codigo acima esta funcionando so que quando o pin 2 é acionado o led fica fraco
inverti os cabos e deu no mesmo (achei q fosse o fio rompido ou o led com problema)
troquei as portas (achei que fosse no arduino o problema)

mas volto a agradecer pela ajuda e pela compreensão, me desculpe ser tao leigo ainda referente a arduino

Consegui achar o erro no led

 Serial.begin(9600);

  pinMode(clockpin, INPUT);

  pinMode(datapin, INPUT);

  pinMode(ledPin1, OUTPUT);

  pinMode(ledPin1, OUTPUT);

esqueci de colocar o ledPin2 como saida e coloquei 2x o ledPin1 com saida :astonished: :astonished:

sketch_dec17b:24: error: expected ',' or ';' before 'int'

       int pos2 = 180

       ^

Leia o erro. Qual a descrição em português?

giova014:

sketch_dec17b:24: error: expected ',' or ';' before 'int'

int pos2 = 180

^



Leia o erro.
Qual a descrição em português?

AAAAHHHHHH sim faltou ‘;’ tinha esquecido, obrigado vou testar aqui