Input y Output a la vez

Hola, estoy empezando a programar con arduino, intento hacer que todos los pines funcionen como input y output a la vez (pero no a la vez), pero tengo varios problemas:

  • Cuando saco la unica linea de Serial que tengo, las salidas quedan como baja potencia,
  • El pin 5 aveces me hace prender el 6 (lo mismo me pasa en algunos otros)
  • Aunque la hoja de descripcion de la placa dice que todos los puertos son configurables como I/O, el puerto 0 y puerto 1 no funcionan como los demas.
  • El pines 4, 11 y 13 no funciona bien con INPUT_PULLUP, me sensa que siempre estan apretados, le puse delay por todos lados y nada me funciona.
  • Aveces no funciona bien, hace unas cientos de vueltas por segundo, pero aveces cada 10-20 alguna luz se prende... Solo para prenderse, si estan todas prendidas no se apaga ninguna (salvo en los pines 4, 11 y 13)

Mi codigo es el siguiente:

int pinArray[] = {2, 5, 7 , 8};
int pinState[] = {0, 0, 0, 0};
int pinChange[] = {0, 0, 0, 0};

void setup(){
  Serial.begin(9600);
}

void loop() {
  for (int count=0;count<4;count++) {
    Serial.print("En ping: "); Serial.println(pinArray[count]); //Si saco esta linea los led nunca se apaga por completo, quedan a medias
    pinMode(pinArray[count], INPUT_PULLUP);
    if (digitalRead(pinArray[count]) == LOW)
      {
        if (pinChange[count] == 0)
        {
        if (pinState[count] == 0)
          { pinState[count] = 1; }
        else
          { pinState[count] = 0; }
        //Serial.println("  - Cambio");
        pinChange[count] = 1;
        }
      }
      else
      { pinChange[count] = 0; }
    pinMode(pinArray[count], OUTPUT);
    if (pinState[count] == 0)
      { digitalWrite(pinArray[count], LOW); }
    else
      { digitalWrite(pinArray[count], HIGH); }
  }
}

NOTA: la placa de prueba tiene solo 4 pines (Obviamente cada uno con sus resistencias, boton y led), no puedo probar todos los puertos a la vez.
Tengo una Arduino UNO con Ethernet Shield

Saludos
Primero los pines digitales 0 y 1 son usados para la comunicación serial, yo aconsejaría no usarlos.
Segundo que pretendes hacer con el sketch?
Piensas sensar unos pulsadores mientras tienes conectados unos leds en los mismos pines? Nunca te va a funcionar bien, ya que siempre se va a ver como su estuviesen puestos a tierra por medio de los leds.

Ok, los pines 0 y 1 no los uso entonces.
Intento prender luces, y a la vez que por el mismo pin leer si el boton para prender/apagar la luz esta activado.

Los pulsadores con los led funcionan, casi perfecto (teniendo en cuenta la cantidad de vueltas que da el loop por segundo, funciona mal 1 de 1000 aprox).
Por ejemplo en los puertos que estube probando antes de hacer el post (2, 3, 5 , 6) un pin se me queda prendido y los otros 3 funcionan perfecto (por varias horas), pero siempre queda uno prendido, si apago este se prende otro...

El tema es que necesito censar unas 35-40 luces mas otra cosas, si tendria que usar 2 pines para cada una seria el doble de gasto, no me molesta ponerle un delay de medio segundo si es necesario, pero necesito entrar y salir por el mismo pin

Saludos
Para ampliar los pines del arduino hay varios métodos. Para otros proyectos he usado el 74165 que te permite conectarlos en serie y usar solo dos pines para leerlos

L0771:
El tema es que necesito censar unas 35-40 luces mas otra cosas, si tendria que usar 2 pines para cada una seria el doble de gasto, no me molesta ponerle un delay de medio segundo si es necesario, pero necesito entrar y salir por el mismo pin

Para empezar 35 a 40 luces usando que ARDUINO, supongo un MEGA aunque por los pines de los que hablas no estas usando un MEGA pero no me parece muy factible.
Usa esto MCP23017 - i2c 16 input/output port expander : ID 732 : Adafruit Industries, Unique & fun DIY electronics and kits MCP23017 16 input/output port expander que puedes usar en cascada asi que 3 para entradas y 3 para salidas te dan 16x3 = 48 entradas y 48 salidas.
Se programa facil.
Otra alternativa es como dijo max_saeta con los 74HC565 como salida y los 74HC165 como entradas, pero ahora necesitas 1 cada 8 entradas o salidas, asi que 6 565 y 6 165.

L0771:

  • Cuando saco la unica linea de Serial que tengo, las salidas quedan como baja potencia.
  • El pin 5 aveces me hace prender el 6 (lo mismo me pasa en algunos otros)
  • El pines 4, 11 y 13 no funciona bien con INPUT_PULLUP, me sensa que siempre estan apretados, le puse delay por todos lados y nada me funciona.

Y algo para arreglar esos 3 problemas?
Aunque cambie de micro, los problemas van a seguir estando, busco saber porque me sucede eso en los pines 4, 11 y 13 mas que nada.

Este es el diagrama del circuito, yo la verdad no se mucho de electronica (De eso se encarga mi papa), en los demas pines funciona perfecto, no se porque tira error en esos 3 pines

Igualmente por algo no consegui mucha info sobre el tema, pero tecnicamente puede funcionar, esta funcionando, pero algunos pines no funcionan de la misma forma.
Lo deje toda la noche funcionando y en el monitor serial me sale que no hubo problema, no se pulsaron solos ni nada por el estilo...

Falla en algunos pines porque no todos los pines son iguales.
Tienes que analizarlos uno a uno y separarlos por sus configuraciones.

Sigo sin entender esto:

El tema es que necesito Sensar unas 35-40 luces mas otra cosas, si tendria que usar 2 pines para cada una seria el doble de gasto, no me molesta ponerle un delay de medio segundo si es necesario, pero necesito entrar y salir por el mismo pin

Cuantos UNOs piensas usar para sensar 35 a 40 luces? Cada UNO te da 19 entradas/salidas digitales (incluidos los 6 ADs), asi que requieres de 3 unos, comunicados entre si de algun modo o algo no va, o te entiendo mal.
Supongamos que los comunicas por 485 entonces hay que sacrificar 1 pin lo que deja 18 pines disponibles.

Bien, mi cerebro funciona cuando comprende las razones por las que se hacen las cosas.
Si explicas para que necesitas 35 a 40 luces sensoras/switches me pongo a pensar en alguna solución viable, si es que puedo encontrarla.

En el proyecto queremos sensar todo lo que pasa en la casa, desde luces hasta alarmas, temperatura, ID de quien abre las puertas, etc.
Calculando son 10 entradas por habitacion, unas 12-14 habitaciones, conectado todo a ethernet , estamos trabajando con una UNO + Ethernet shield, con el programa listo veremos de conseguir Arduino Ethernet o terminar armandola.

Mas alla de que ponga otra placa, el problema que me quedan mal apagados los led me va a seguir pasando, no se porque es unicamente cuando saco la linea de Serial.

Ahora a la espera de la RAZON te hago este comentario de lo que comencé a pensar:
Se requiere de un circuito que respete los umbrales LOW y HIGH de los pines, es decir, si estoy por encima de Vth HIGH o por debajo de Vth LOW donde Vth es tension de umbral o thresold estaré bien.
Es decir, debo diseñar algo que respete eso en ambos casos. Asi tendré un esquema DIGITAL viable.
Un divisor resistivo posible seria tal que R1/R2 fuese tal que asegure esos umbrales que antes indiqué.
Si pongo el switch contra +5v en un contacto, y una R1 de 100k en otro, luego en serie una R2 de 10K a masa, tendré 5V al presionar y cuando libere el switch 0.9 V que sigue siendo LOW.
Ahora debo sumar algo para comandar el led, y nada mejor que un BS170 conectado con su Gate a esa division de resistores y al pin del UNO. El source a GND y el Drain a traves de una R3 al led y a 5V
Veamos si funciona? el único problema es cuando quiera un high o low y este presionado el switch, debo asegurar que siga el FET en su condición anterior o no hace falta? Podría en principio olvidarlo ya que la lectura será muy rápida y luego reestablezco la situación anterior en el LED, algo que dificilmente pueda ver.
Mas tarde hago un esquemita y lo agrego a esta respuesta.
Lo único que me viene a la memoria es que cuando el switch esta abierto habra una corriente Ioh que debe mantenerse limitada.
Esto lo pensé anoche y hoy revisé el tema de Ioh, eso crea un camino de retorno que debe frenarse asi que hay que sumar un diodo que va de las resistencias al gate. Diodo 1n4148 por ejemplo.

agrego el esquema aunque en la simulacion no funciona bien. No tuve tiempo de buscar la falla pero se debe a que la tension Vgs no es suficiente para cambiar el estado del FET

salio con un IRF530 pero la idea era un bs170 o 2n7000.

hay que trabajarlo porque x ahora no funciona. Pero esa es la idea.
Lo unico que falta es que el fet conmute que en el simulador de PROTEUS no funcionó o claro, he cometido un error.
segun lo que he visto en toda la web, y en la hoja de datos,

esto es lo que no entiendo en la simulacion. Vgs = 5 volts y Id = 250mA que es una barbaridad para un led (podría exitar varios leds) pero permitanme la locura, nos daria 0.5 volts de Vds que esta muy bien.
No comprendo porque no va en la simulación.

Mas alla de este problema, vean que el circuito tiene el switch, tiene el LED y ambos son independientes del tipo de pin digital usado.
Pero por ahora es mi deseo de que funcione.
A ver si la practica contradice la simulación.

En el proyecto queremos sensar todo lo que pasa en la casa, desde luces hasta alarmas, temperatura, ID de quien abre las puertas, etc.

Yo me olvidaría, de momento, de los problemas de la placa (pines 1, 2, 13, . . . uso alternativo como entrada/salida), daría un paso atrás y pensaría, lo primero, cuál es el esquema general de cableado: cuantos "HUB" va a haber (¿va a haber?), de qué tipo (arduinos, otra electrónica), qué comunicación va a haber entre ellos porque, espero que a nadie se le esté pasando por la cabeza llevar cables desde cada punto a controlar hasta un arduino "central", verdad . . . . ]:slight_smile: :wink:

Saludos.

Yo lo que no entiendo es que dice querer controlar 35 a 40 luces y habla de arduino UNO que no llega ni loco. Si comenzara hablando de un MEGA que tiene pines suficientes bueno pero con UNO debe usar al menos 3.
ALternativas hay de sobre, integrados io que trabajan por SPI, o por I2C, los propios 595 y 165 para salidas y entradas.
Bueno, cada cual sabe que hacer.

Pero si quieres usar un micro con entradas salidas con el mismo pin, algo como lo que sugerí es la solucion.