Lixeira Inteligente com Sensor de Proximidade e Botões

Olá pessoal, tudo bem?
Eu tinha em casa uma lixeira automática com sensor de presença que queimou as placas e enferrujou os motores, e como tinha alguns componentes de Arduino em casa, decidi trocar o sistema e fazer eu mesmo o projeto.
Vi pela internet inúmeros projetos com esse intuito, mas todos utilizam um sensor de proximidade ultrassônico e não possuem botões para auxiliar no processo. O que gostaria de fazer é o seguinte:

  1. Possuir 2 botões, 1 abrir e um fechar;
  2. Ao invés de usar um sensor de proximidade ultrassônico, quero usar um sensor de proximidade IR;
  3. Quando pressionar o botão abrir, a lixeira deve permanecer aberta indefinidamente, quando pressionar o botão fechar, ela fecha e aguarda o comando para abrir novamente ou abre com o sensor de proximidade, aguarda 10 segundos e fecha novamente;

Aí vem meu problema, escrevi o seguinte código:
#include <Servo.h> // Incluir Biblioteca do Servo

#define SensorIR 7 // Definir variável para Pino 7 (Sensor IR)
#define pinServo 9 // Definir variável para Pino 9 (Servo)
#define pinButt1 4 // Definir variável para Botão 1 (Abrir)
#define pinButt2 3 // Definir variável para Botão 2 (Fechar)
int tempo;
int SensorLigado; // Definir Tipo Integer para variável SensorLigado

Servo myservo; // Definir Variável com o nome myservo

void setup() {
// put your setup code here, to run once:

pinMode (pinButt1,INPUT); // Definir Botão 1 como Entrada;
pinMode (pinButt2,INPUT); // Definir Botão 2 como Entrada;
pinMode (SensorIR,INPUT); // Definir Sensor IR como Entrada;
myservo.attach(pinServo); // Ligar o Servo e atribuir ao Pino referente a variável pinServo
myservo.write(0); // Colocar o Servo em 0º para iniciar
SensorLigado == 0;
tempo == 0;
}

void loop() {
if (digitalRead(pinButt1) == 1 ) // Lê o Botão 1 para Abrir
{
do myservo.write(90);
while (digitalRead(pinButt2) !=1 );{
delay(100);
myservo.write(0);
}
}
else{
SensorLigado = digitalRead(SensorIR);
if (SensorLigado == 1){
myservo.write(90);
if (tempo < 10000 || digitalRead(pinButt2 !=1)){
delay (500);
tempo = tempo + 1000;
}
if (pinButt2 !=1){
myservo.write(0);
}
}
}
}

Situação:
Quando utilizo apenas o primeiro bloco, os botões funcionam normalmente, quando utilizo o código inteiro, os botões só funcionam com o sensor detectando obstáculo. E quando utilizo apenas o segundo bloco, ignorando os botões, a tampa abre quando identifica obstáculo, porém fecha assim que tiro a mão, ela não aguarda o tempo que deveria.
Poderiam me ajudar a ver o motivo meu código não funcionar quando está completo?
Muito obrigado

Ola,

sua lógica está confusa e complicada sem necessidade.

quando for criar lógicas, principalmente simples assim, escreva de forma simples o que vc quer fazer e depois codifique, exemplo:

  • Abrir a lixeira quando o sensor de IR detectar algo
  • Abrir a lixeira quando o botão de abrir for apertado
  • Fechar a lixeira quando o botão de fechar for acionado

se quiser, num segundo passo, tente validar “conflitos” e talvez incrementar funcionalidades:

  • Abrir a lixeira quando o sensor de IR detectar algo

    • se já estiver aberto, tem algum problema? faço algo coisa?
    • seria legal fechar automaticamente após 5 segundos?
  • Abrir a lixeira quando o botão de abrir for apertado

    • se já estiver aberto, tem algum problema? faço algo coisa?
    • seria legal fechar automaticamente após 5 segundos?
  • Fechar a lixeira quando o botão de fechar for acionado

    • se já estiver fechado, tem algum problema? faço algo coisa?

e ai, vá para o código

// - Abrir a lixeira quando o sensor de IR detectar algo
//   - se já estiver aberto, tem algum problema? faço algo coisa? acho que não
SensorLigado = digitalRead(SensorIR);

if (SensorLigado == 1) {
  myservo.write(90)
}
//   - seria legal fechar automaticamente após 5 segundos? Sei não, depois penso e implemento

// - Abrir a lixeira quando o botão de abrir for apertado
//   - se já estiver aberto, tem algum problema? faço algo coisa? acho que não

if (digitalRead(pinButt1) == 1) {
  myservo.write(90)
}

//   - seria legal fechar automaticamente após 5 segundos? Sei não, depois penso e implemento

// - Fechar a lixeira quando o botão de fechar for acionado
//   - se já estiver fechado, tem algum problema? faço algo coisa? acho que não
if (digitalRead(pinButt2) == 1) {
  myservo.write(90)
}

no seu código, vc não lê os sensores em alguns momento por falha na lógica. E lembre, o void loop()faz a coisa toda ficar lendo várias vezes em “circulos”. 1, 2 3, volta pro 1, 2 e 3, e por ai vai. delay(500) para o código ali por meio segundo e depois continua.

não tenho servos aqui e não tenho nem compilador arduino para tentar testar o código. mas a ideia simplifica é esta.

tente também manter padrões, exemplo, se vc é o estado/valor de um sensor e joga para uma variaveĺ, faça para todos (no caso do pinButt1, use int BotaoAbrir; e BotaoAbrir = digitalRead(pinButt1);e depoisif(BotaoAbrir == 1)`, facará mais legível tb.