Output don't give 5v

Hola a todos, tengo una situacion bastante curiosa, tengo un codigo que enciende y apaga un led simulando que es un rele, con un boton se enciende por 10s y con otro hace cambio de estado, el asunto esque cuando se ilumina para hacer cambio de estado no ilumina en su totalidad y pero si cuando se enciende por 10s, siendo la misma salida.

// Asignacion de pines
const byte led1=8; 
const byte led2=9;
const byte led3=10;
const byte led4=11;
const byte led5=12;
const byte rele=7;
//Entradas
const byte P1=A0;
const byte P2=A1;
const byte P3=4;
const byte P4=A3;
const byte ST=A5;
//vandera
byte flag=0;
byte flag1=0;
byte flag2=0;
byte flag3=0;
byte flag4=0;
void setup() {
  
  // put your setup code here, to run once:
//configurar pines como salidas
pinMode (led1,OUTPUT);
pinMode (led2,OUTPUT);
pinMode (led3,OUTPUT);
pinMode (led4,OUTPUT);
pinMode (led5,OUTPUT);
pinMode (rele,OUTPUT);  
// configurar pines como entradas
pinMode (P1, INPUT);
pinMode (P2, INPUT);
pinMode (P3, INPUT);
pinMode (P4, INPUT);
pinMode (ST, INPUT);
}
void loop()
{
  
  // EL SISTEMA DEPENDE DEL ESTADO DEL ST
// activar con un pulsador para hacer un cmabio de estado
// predeterminamos la pulsacion en el pulsador
if(digitalRead (ST)==1) {
  flag= !flag;
  //ELIMINAR LOS REBOTES
delay(30);
//esperar para soltar el pulsador
while (digitalRead (ST));
delay(100);
}
//algoritmmo principal
//para pulsador 1 hacer un cabio de estado
if (flag ==1){
  
if(digitalRead (P1)==1) {
  flag1= !flag1;
  //ELIMINAR LOS REBOTES
delay(30);
//esperar para soltar el pulsador
while (digitalRead (P1));
delay(100);
}
  if (flag1 == 1){ 
    
digitalWrite(led1,~led1);
digitalWrite(led2,~led2);
digitalWrite(led3,~led3);
digitalWrite(led4,~led4);
digitalWrite(led5,~led5);

    
  }if (!flag1 == 0){
    
digitalWrite(led1,!led1);
digitalWrite(led2,!led2);
digitalWrite(led3,!led3);
digitalWrite(led4,!led4);
digitalWrite(led5,!led5);

    
  }
  // pulsador dos  es una secuencia predeterminamos la pulsacion en el pulsador
if(digitalRead (P2)==1) {
flag2= !flag2;
  //ELIMINAR LOS REBOTES
delay(30);
//esperar para soltar el pulsador
while (digitalRead (P2));
delay(30);
}

//algoritmmo principal
// se hace la secuencia de menos a mayor  
if(flag2==1){
  for (int i=8;i<=12;i++){
    digitalWrite(i,HIGH);
    delay(50);
  }
  for (int i=12;i>=8;i--){
    digitalWrite(i,LOW);
    delay(50);
  }
 
}else{
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
digitalWrite(led4,LOW);
digitalWrite(led5,LOW);
}
// secuencia del tercer pulsador es predener la lampara por 10 seg
//predeterminamos la pulsacion en el pulsador
  if(digitalRead (P3)==1) {
  flag3= !flag3;
  //ELIMINAR LOS REBOTES
delay(30);
//esperar para soltar el pulsador
while (digitalRead (P3));
delay(100);
}
//algoritmmo principal
//encendemos y apagamos el rele
if (flag3 ==1){
  digitalWrite(rele,HIGH);
  delay(10000);
  digitalWrite(rele,LOW);
  flag3=0;


 //algoritmo principal
 // predeterminamos la pulsacion en el pulsador 
}if(digitalRead (P4)==1) {
  flag4= !flag4;
  //ELIMINAR LOS REBOTES
delay(100);
//esperar para soltar el pulsador
while (digitalRead (P4));
delay(100);
}
//algoritmmo principal
// pulsador 4 enciende y apaga la lampara  
if (flag4 ==1){
  digitalWrite(rele,~digitalRead(rele));
    
}if(!flag4==0){
  digitalWrite(rele,!digitalRead(rele));
 
}
}

I know that the problem is a coding problem because when I simulate I also notice the voltage decrease in the output.
Thank you

it is the same
digitalWrite(led1, 0);

if digitalRead(rele)=1 then ~digitalRead(rele)= B11111110,
if digitalRead(rele)=0 then ~digitalRead(rele)= B11111111,
understand?

at the end digitalWrite(rele,~digitalRead(rele)); is always digitalWrite(rele, HIGH);

there it chances state, that part of the code works

Putting HIGH doesn't change anything

if you explain what this code should do, maybe i can offer some simple solution.

it just turn on and turn off a led, but using ! and ~ in the digitalWrite

the weird thing is that I'm copying the first part of the code but it doesn't work

// Asignacion de pines
const byte leds[] = {8, 9, 10, 11, 12};
//const byte rele = 7;
//Entradas
const byte Ps[] = {A0, A1, A2, A3, A4};

void setup() {
  for (byte i = 0; i < 5; i++)
    pinMode(leds[i], OUTPUT);
  //pinMode(rele, OUTPUT);
  for (byte i = 0; i < 5; i++)  pinMode(Ps[i], INPUT); //not necessery
}
void loop() {
  for (byte i = 0; i < 5; i++)digitalWrite(leds[i], !digitalRead(Ps[i]));
}

But the only which is not working is rele when I do the change of state

you say nothing about rele

I have a code that turns on and off a led simulating that it is a relay, with a button turns on for 10s and with another one makes change of state, the thing is that when it lights to make change of state it does not light in its entirety and but if when it turns on for 10s, being the same output.

i don't understand. draw a flow chart

it is just turn on and turn off a led, I use the same style of code with the five leds in the board but with the led called rele it doesn't give 5v in the output D7

void setup() {
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
}
void loop() {}

Did you use ChatGPT to generate that code ?

If a led is turned on and off every time the loop() runs, then it is dim. You can see the blinking by adding a delay.

I did some cleaning up, but I suggest to re-write the code in the loop().
If you can explain what the buttons and the leds should do in a logical way, then half the sketch is already written.

The sketch with some cleanup:

// Forum: https://forum.arduino.cc/t/output-dont-give-5v/1166296
// This Wokwi project: https://wokwi.com/projects/375255719014195201
// Warning: The sketch does not work. 
//          The code in the loop() has to be rewritten from scratch.

// Asignacion de pines
const int ledPins[] = {8, 9, 10, 11, 12};
const int relePin = 7;

//Entradas
const int psPins[] = {A0, A1, A2, A3};
const int stPin = A4;

//vandera
bool flag  = false;
bool flag1 = false;
bool flag2 = false;
bool flag3 = false;
bool flag4 = false;

void setup()
{
  // put your setup code here, to run once:
  //configurar pines como salidas
  for (int i = 0; i < 5; i++)
  {
    pinMode(ledPins[i], OUTPUT);
  }
  pinMode(relePin, OUTPUT);

  for (int i = 0; i < 4; i++)  
  {
    pinMode(psPins[i], INPUT); //not necessery
  }
  pinMode(stPin, INPUT);
}

void loop()
{
  // EL SISTEMA DEPENDE DEL ESTADO DEL ST
  // activar con un pulsador para hacer un cmabio de estado
  // predeterminamos la pulsacion en el pulsador
  if (digitalRead(stPin) == HIGH) 
  {
    flag = !flag;
    //ELIMINAR LOS REBOTES
    delay(30);
    //esperar para soltar el pulsador
    while (digitalRead(stPin) == HIGH);
    delay(100);
  }

  //algoritmmo principal
  //para pulsador 1 hacer un cabio de estado
  if (flag) 
  {
    if (digitalRead(stPin) == HIGH) 
    {
      flag1 = !flag1;
      //ELIMINAR LOS REBOTES
      delay(30);
      //esperar para soltar el pulsador
      while (digitalRead(stPin) == HIGH);
      delay(100);
    }

    if (flag1) 
    {
      for (int i = 0; i < 5; i++)
      {
        digitalWrite(ledPins[i], LOW);
      }
    } 
    else
    {
      for (int i = 0; i < 5; i++)
      {
        digitalWrite(ledPins[i], HIGH);
      }
    }

    // pulsador dos  es una secuencia predeterminamos la pulsacion en el pulsador
    if (digitalRead(psPins[1]) == HIGH) 
    {
      flag2 = !flag2;
      //ELIMINAR LOS REBOTES
      delay(30);
      //esperar para soltar el pulsador
      while (digitalRead(psPins[1]) == HIGH);
      delay(30);
    }

    //algoritmmo principal
    // se hace la secuencia de menos a mayor
    if (flag2) 
    {
      for (int i = 8; i <= 12; i++) 
      {
        digitalWrite(i, HIGH);
        delay(50);
      }
      for (int i = 12; i >= 8; i--) 
      {
        digitalWrite(i, LOW);
        delay(50);
      }
    } 
    else 
    {
      for (int i = 0; i < 5; i++)
      {
        digitalWrite(ledPins[i], LOW);
      }
    }
    
    // secuencia del tercer pulsador es predener la lampara por 10 seg
    //predeterminamos la pulsacion en el pulsador
    if (digitalRead(psPins[2]) == HIGH) 
    {
      flag3 = !flag3;
      //ELIMINAR LOS REBOTES
      delay(30);
      //esperar para soltar el pulsador
      while (digitalRead(psPins[2]) == HIGH);
      delay(100);
    }
    //algoritmmo principal
    //encendemos y apagamos el rPinele
    if (flag3) 
    {
      digitalWrite(relePin, HIGH);
      delay(10000);
      digitalWrite(relePin, LOW);
      flag3 = false;

      //algoritmo principal
      // predeterminamos la pulsacion en el pulsador
    } 
    
    if (digitalRead(psPins[3]) == HIGH) 
    {
      flag4 = !flag4;
      //ELIMINAR LOS REBOTES
      delay(100);
      //esperar para soltar el pulsador
      while (digitalRead(psPins[3]) == HIGH);
      delay(100);
    }

    //algoritmmo principal
    // pulsador 4 enciende y apaga la lampara
    if (flag4) 
    {
      int releState = digitalRead(relePin);  // HIGH or LOW
      if(releState == HIGH)
        releState = LOW;
      else
        releState = HIGH;

      digitalWrite(relePin, releState);
    }
  }

  delay(250);
}

The sketch in a Wokwi project:

This does not make much sense, and although its results can be predictable it is prone to misunderstanding and hard to debug.

You should use

digitalWrite(led1,!digitalRead(led1));

Instead (in all such cases)

There are other ways to change an LED status

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.