RotaryEncoder - Ultimos ajustes en programacion

Hola compañeros, el programa que he realizado es muy basico… se trata de un rotary encoder que tiene 16 niveles de iluminacion. Hasta ahi todo correcto, el problema me viene que la iluminacion cuando llega a 16, se empieza a imprimir por puerto serie continuamente, no con cada “click” del rotary, y aunque se queda la cifra en 16, si aumento 4 puntos mas, no sube de 16, sin embargo a la hora de bajar la iluminacion, debe recorrer esos 4 puntos de mas, y a partir de ahi es cuando empieza a bajarla. No se si me he explicado bien. Os dejo el codigo haber si veis algo que yo no he visto

#include <RotaryEncoder.h>

RotaryEncoder encoder(2, 3);

int luminosidad=0;
int newPos;
int Led = 13;

void setup()
{
  Serial.begin(9600);
  pinMode (13, OUTPUT);  
}

void loop()
{
  static int pos = 0;
  encoder.tick();

  luminosidad = (255/16*newPos);
  
  newPos = encoder.getPosition();
  if (pos != newPos) 
  {
    if(newPos < 0) newPos = 0;
    if(newPos > 16) nowPos = 16;
    Serial.print(newPos);
    Serial.println();
    pos = newPos;
  }
  analogWrite(13, luminosidad);
}

Si no me he explicaco bien comentadmelo, haber si podeis ayudarme mejor. Gracias

Corregía tu programa cuando descubrí que tienes newPos y nowPos dos variables parecidas.

void loop() {
  static int pos = 0; // porque static?
  encoder.tick();

  newPos = encoder.getPosition();
  if (pos != newPos)  {
    if (newPos < 0) 
        newPos = 0;
    if (newPos > 16) 
        nowPos = 16;
    Serial.print(newPos);
    Serial.println();
    pos = newPos;
  }
  luminosidad = map(newPos, 0, 16, 0,255);
  analogWrite(13, luminosidad);
}

Prueba asi.

surbyte:
Corregía tu programa cuando descubrí que tienes newPos y nowPos dos variables parecidas.

void loop() {

static int pos = 0; // porque static?
  encoder.tick();

newPos = encoder.getPosition();
  if (pos != newPos)  {
    if (newPos < 0)
        newPos = 0;
    if (newPos > 16)
        nowPos = 16;
    Serial.print(newPos);
    Serial.println();
    pos = newPos;
  }
  luminosidad = map(newPos, 0, 16, 0,255);
  analogWrite(13, luminosidad);
}




Prueba asi.

Hola amigo gracias por responder, la variable es que la copie mal… si no no me dejaba compilar y me daba error. Voy a probar, corregiste algo más si llegaste a ver algo?? Es que la librería esta nos la proporcionó un profesor y es de un ejemplo, por eso viene lo de estatic. Lo que hace es que según le demos al rotary, vaya aumentando la cuenta en 1 o disminuyéndola en 1. Pero si llega a los 16 y le das 2 veces más son 18, y para que empiece a descender la cuenta tiene que llegar a los 16. Creo que lo que he hecho es limitar lo que imprime por puerto serie de 0 a 16. Pero la cuenta real no he conseguido…

Mira el código y analiza si corregí algo mas, porque me parece que copias y pegas sin mirar nada.

surbyte:
Mira el código y analiza si corregí algo mas, porque me parece que copias y pegas sin mirar nada.

El codigo le faltaban unas partes que encontre en libreria, con el mapeo me lo hacia exactamente igual. Lo lei y probe antes de contestarte compañero. Aqui dejo el funcional por si a alguien le sirviese

#include <RotaryEncoder.h>

RotaryEncoder encoder(2, 3);

int luminosidad=0;
int newPos;
int Led = 13;

void setup()
{
  Serial.begin(9600);
  pinMode (13, OUTPUT);  
}

void loop() {
  static int pos = 0;
  encoder.tick();

  newPos = encoder.getPosition();
  if (pos != newPos)  
  {
    if (newPos <= -1) encoder.setPosition(0);
    if (newPos >= 17) encoder.setPosition(16);
    if (newPos < 0) 
        newPos = 0;
    if (newPos > 16) 
        newPos = 16;
    Serial.print(newPos);
    Serial.println();
    pos = newPos;
  }
  luminosidad = map(newPos, 0, 16, 0,255);
  analogWrite(13, luminosidad);
}