ajuda com pwm

good evening! I need help with a problem I can not solve. I am mounted a controller for a liminary of an aquarium, varying the luminosity of the leds gradually. the problem is, when it comes to certain hours that I hedge the pwm for, say 40, it shows 26. seto for 100 it shows me 38.

asdf.txt (9.28 KB)

I’ve reformatted your code so that it appears more to what we are accustomed to seeing posted. You may want to have another look at it and see if anything looks unusual. Pay close attention to your if statements. The other thing you need to do straight away is change all your EEPROM.write statements to EEPROM.update. As the EEPROM has a limited life with writing, the EEPROM.update statement will only write if the contents are different, thereby preserving the life of the memory.

#include <Thread.h>
#include <ThreadController.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define DS1307_ADDRESS 0x68

//variavel do pino que esta plugado o Sensor
//Neste caso é o pino 2, mais pode usar qualquer pino digital
#define ONE_WIRE_BUS 2

//Instacia o Objeto oneWire e Seta o pino do Sensor para iniciar as leituras
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
//Repassa as referencias do oneWire para o Sensor Dallas (DS18B20)
DallasTemperature sensor(&oneWire);

// Modulo I2C display no endereco 0x27
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

byte zero = 0x00; 

int horas;
int minutos;
int diadasemana;
int diadomes;
int mes;
int ano;
int segundos;

int led = 5;

Thread threadAlarme = Thread();
Thread threadComandos = Thread();
Thread threadIluminacao = Thread();
Thread threadHoras = Thread();
ThreadController master = ThreadController();

void setup()
{
    delay(5000);
    Wire.begin();
    Serial.begin(9600);
    lcd.begin (16,2);
    Serial.println("Sensor de temperatura Dallas DS18b20");
    pinMode(led, OUTPUT);
    sensor.begin();
    threadComandos.onRun(comandos);
    threadComandos.setInterval(500);
    threadAlarme.onRun(alarme);

    threadIluminacao.onRun(intensidadeLed);
    threadIluminacao.setInterval(500);

    threadHoras.onRun(capturaRTC);
    threadHoras.setInterval(1000);

    master.add(&threadComandos);
    master.add(&threadAlarme);
    master.add(&threadIluminacao);
    master.add(&threadHoras);

    display();
}

void loop()
{
    master.run();

    sensor.requestTemperatures();
    float leitura=sensor.getTempCByIndex(0);
    Serial.println(leitura);
    lcd.setCursor(0,0);
    lcd.setCursor(9,0);
    lcd.print(leitura);
    lcd.write(223);
    lcd.print("C");

    // Mostra os dados no display

    lcd.print("     ");
    // Acrescenta o 0 (zero) se a hora for menor do que 10
    lcd.setCursor(0,0);
    if (horas <10) lcd.print("0");
    lcd.print(horas);
    lcd.print(":");

    // Acrescenta o 0 (zero) se minutos for menor do que 10
    if (minutos < 10) lcd.print("0");
    lcd.print(minutos);
    lcd.print(" ");
    // Acrescenta o 0 (zero) se minutos for menor do que 10
    //if (segundos < 10)
    //lcd.print(" ");
    //lcd.print(segundos);
    lcd.setCursor(0,1);

    // Mostra o dia da semana
    switch(diadasemana)
    {
        case 0:
            lcd.print("DOMINGO");
            break;
        case 1:
            lcd.print("SEGUNDA");
            break;
        case 2:
            lcd.print("TERCA");
            break;
        case 3:
            lcd.print("QUARTA");
            break;
        case 4:
            lcd.print("QUINTA");
            break;
        case 5:
            lcd.print("SEXTA");
            break;
        case 6:
            lcd.print("SABADO");
    }
    lcd.setCursor(8,1);
    // Acrescenta o 0 (zero) se dia do mes for menor do que 10
    if (diadomes < 10) lcd.print("0");
    lcd.print(diadomes);
    lcd.print("/");
    // Acrescenta o 0 (zero) se mes for menor do que 10
    if (mes < 10) lcd.print("0");
    lcd.print(mes);
    lcd.print("/");
    lcd.print(ano);
}

void comandos()
{
    String comando = stringEntrada();

    if(comando == "1")
    {
        MostraHoras(); //mostra as horas do modulo
    }
    else if(comando == "2")
    {
        noInterrupts();  // Call to disable interrupts
        Serial.println("Digite as horas");
        interrupts(); // Call to enable interrupts
        threadComandos.enabled = false;
        waitSerial();
        Serial.println(comando);
        threadComandos.enabled = true;
        //setaHora(); //grava horario do codigo no modulo.
    }
    else if(comando == "3")
    {
        VerificaIntensidadeLed();
    }
    else if(comando == "4")
    {
        threadAlarme.enabled = false;
    }
    else
    {
        
    }
}

//Seta horario no modulo.

void setaHora()
{
    byte segundos = 00; //Valores de 0 a 59
    byte minutos = 53; //Valores de 0 a 59
    byte horas = 16; //Valores de 0 a 23
    byte diadasemana = 3; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
    byte diadomes = 7; //Valores de 1 a 31
    byte mes = 6; //Valores de 1 a 12
    byte ano = 17; //Valores de 0 a 99
    Wire.beginTransmission(DS1307_ADDRESS);
    Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

    //As linhas abaixo escrevem no CI os valores de 
    //data e hora que foram colocados nas variaveis acima
    Wire.write(ConverteParaBCD(segundos));
    Wire.write(ConverteParaBCD(minutos));
    Wire.write(ConverteParaBCD(horas));
    Wire.write(ConverteParaBCD(diadasemana));
    Wire.write(ConverteParaBCD(diadomes));
    Wire.write(ConverteParaBCD(mes));
    Wire.write(ConverteParaBCD(ano));
    Wire.write(zero); //Start no CI
    Wire.endTransmission();
}

byte ConverteParaBCD(byte val)
{ //Converte o número de decimal para BCD
    return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  
{ //Converte de BCD para decimal
    return ( (val/16*10) + (val%16) );
}

void display()
{
    Serial.println("============================");
    Serial.println("|(1)Horas                  |");
    Serial.println("|(2)Configurar Horas       |");
    Serial.println("|(3)Verifica Valor PWM     |");
    Serial.println("|(4)Desliga Alarme         |");
    Serial.println("============================");
}

void MostraHoras()
{
    //capturaRTC();
    //Mostra a data no Serial Monitor
    Serial.print("Hora : ");
    Serial.print(horas);
    Serial.print(":");
    Serial.print(minutos);
    Serial.print(":");
    Serial.print(segundos);

    Serial.print(" ");

    Serial.print("Data: ");
    Serial.print(diadomes);
    Serial.print("/");
    Serial.print(mes);
    Serial.print("/");
    Serial.print(ano);

    switch(diadasemana)
    {
        case 0:
            Serial.println(", Domingo");
            break;
        case 1:
            Serial.println(", Segunda");
            break;
        case 2:
            Serial.println(", Terca");
            break;
        case 3:
            Serial.println(", Quarta");
            break;
        case 4:
            Serial.println(", Quinta");
            break;
        case 5:
            Serial.println(", Sexta");
            break;
        case 6:
            Serial.println(", Sabado");
    }
}

//canal 0

Second part of code as it is too long.

void alarme()
{
    if(horas == 9 && minutos < 30){
        EEPROM.write(0,30 ); 
    }else if(horas == 9 && minutos >= 30){
        EEPROM.write(0,60 ); 
    }else if(horas == 10 && minutos < 30){
        EEPROM.write(0,90); 
    }else if(horas == 10 && minutos >= 30){
        EEPROM.write(0,120 ); 
    }else if(horas == 11 && minutos < 30){
        EEPROM.write(0,150 ); 
    }else if(horas == 11 && minutos >= 30){
        EEPROM.write(0,180 ); 
    }else if(horas == 12 && minutos  < 30){
        EEPROM.write(0,255 ); 
    }else if(horas == 12 && minutos >= 30){
        EEPROM.write(0,255 ); 
    }else if(horas == 13 && minutos < 30){
        EEPROM.write(0,255 );
    }else if(horas == 13 && minutos >= 30){
        EEPROM.write(0,255 );
    }else if(horas == 14 && minutos < 30){
        EEPROM.write(0,255  );
    }else if(horas == 14 && minutos >= 30){
        EEPROM.write(0,255 );  
    }else if(horas == 15 && minutos < 30){
        EEPROM.write(0,255 ); 
    }else if(horas == 15 && minutos >= 30){
        EEPROM.write(0,255); 
    }else if(horas == 16 && minutos < 30){
        EEPROM.write(0,255 ); 
    }else if(horas == 16 && minutos >= 30){
        EEPROM.write(0,255 ); 
    }else if(horas == 17 && minutos < 30){
        EEPROM.write(0,180 ); 
    }else if(horas == 17 && minutos >= 30){
        EEPROM.write(0,150 ); 
    }else if(horas == 18 && minutos < 30){
        EEPROM.write(0,120 ); 
    }else if(horas == 18 && minutos >= 30){
        EEPROM.write(0,90 ); 
    }else if(horas == 19 && minutos < 30){
        EEPROM.write(0,60 );
    }else if(horas == 19 && minutos >= 30){
        EEPROM.write(0,30 );
    }else if(horas == 20){
        EEPROM.write(0,LOW );
    }else if(horas == 21){
        EEPROM.write(0,LOW );
    }else if(horas == 22){
        EEPROM.write(0,LOW );
    }else if(horas == 23){
        EEPROM.write(0,LOW ); 
    }else if(horas == 0){
        EEPROM.write(0,LOW ); 
    }else if(horas == 1){
        EEPROM.write(0,LOW ); 
    }else if(horas == 2){
        EEPROM.write(0,LOW ); 
    }else if(horas == 3){
        EEPROM.write(0,LOW ); 
    }else if(horas == 4){
        EEPROM.write(0,LOW ); 
    }else if(horas == 5){
        EEPROM.write(0,LOW ); 
    }else if(horas == 6){
        EEPROM.write(0,LOW ); 
    }else if(horas == 7){
        EEPROM.write(0,LOW ); 
    }else if(horas == 8){
        EEPROM.write(0,LOW ); 
    }
}

void capturaRTC()
{
    Wire.beginTransmission(DS1307_ADDRESS);
    Wire.write(zero);
    Wire.endTransmission();
    Wire.requestFrom(DS1307_ADDRESS, 7);
    segundos = ConverteparaDecimal(Wire.read());
    minutos = ConverteparaDecimal(Wire.read());
    horas = ConverteparaDecimal(Wire.read() & 0b111111); 
    diadasemana = ConverteparaDecimal(Wire.read()); 
    diadomes = ConverteparaDecimal(Wire.read());
    mes = ConverteparaDecimal(Wire.read());
    ano = ConverteparaDecimal(Wire.read());
}

void intensidadeLed()
{
    int valorIntensidadeLed = EEPROM.read(0);
    analogWrite(led, valorIntensidadeLed);
}

void VerificaIntensidadeLed()
{
    int valor = EEPROM.read(0);
    Serial.print("Valor PWM:");
    Serial.println(valor);
}

//Metodo para capturar string do terminal.

String stringEntrada()
{
    String conteudo = "";
    char valor;

    while(Serial.available() > 0)
    {
        valor = Serial.read();
        if(valor != '\n')
        {
            conteudo.concat(valor);
        }
        delay(10);
    }
    return conteudo;
}


void waitSerial()
{
    while (!Serial.available());
    delay(10);
    while (Serial.available() && Serial.read());
}