Buenas tardes
Tengo la siguiente consulta, es posible que haya interferencias o valores erraticos si conecto un sensor ultrasonico y un sensor pir?
Estoy haciendo un circuito en el que tengo 5 leds de 3watts con un mosfet irzf44n cada uno con una fuente de pc y un stepdown para regular el voltaje, el circuito prende, funciona, los leds todo ok entiendo, eso ya esta resuelto, creo
Mi consulta es si de alguna forma ese circuito puede no llegar a funcionar con lo que deseo
La propuesta de mi proyecto es que a medida que vos te acerques, 4 de los leds aumenten su potencia luminica segun que tan cerca estas, y que cuando estes muy cerca apaguen el quinto led, pero los valores que me toman los sensores son erraticos
Otra consulta, yo necesito esconder los sensores para el proyecto, el sensor ultrasonico si esta tapado no funciona no?
// ================= PINES =================
const int warmLeds[] = {5, 6, 9, 10};
const int numWarmLeds = 4;
const int coldLedPin = 3;
const int trigPin = 2;
const int echoPin = 12;
const int pirPin = 7;
// ============== PARÁMETROS ===============
const int pwmMinBase = 13; // ~5%
const int pwmMaxNoPresence = 25; // ~10%
const int pwmMaxPresence = 204; // ~80%
const int breathAmplitude = 12; // ±5% PWM
const unsigned long breathPeriod = 4000; // ms
const int distFar = 200; // cm
const int distNear = 40; // cm
const int coldLedOffDist = 100; // cm (umbral apagado LED frío)
// =========================================
void setup() {
for (int i = 0; i < numWarmLeds; i++) {
pinMode(warmLeds[i], OUTPUT);
}
pinMode(coldLedPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pirPin, INPUT);
digitalWrite(trigPin, LOW);
Serial.begin(9600);
Serial.println("Sistema iniciado");
}
// =========================================
void loop() {
bool presence = digitalRead(pirPin);
long distance = measureDistance();
// Filtro básico para lecturas erráticas
if (distance < 20 || distance > 300) {
distance = distFar;
}
// -------- PWM BASE --------
int pwmBase;
if (!presence) {
pwmBase = pwmMinBase;
analogWrite(coldLedPin, 255); // LED frío ON
} else {
pwmBase = map(distance, distFar, distNear,
pwmMaxNoPresence, pwmMaxPresence);
pwmBase = constrain(pwmBase, pwmMaxNoPresence, pwmMaxPresence);
if (distance < coldLedOffDist) {
analogWrite(coldLedPin, 0); // LED frío OFF
} else {
analogWrite(coldLedPin, 255); // LED frío ON
}
}
// -------- RESPIRACIÓN --------
float phase = (millis() % breathPeriod) / (float)breathPeriod;
float breath = sin(phase * TWO_PI);
int pwmFinal = pwmBase + breath * breathAmplitude;
pwmFinal = constrain(pwmFinal, 0, 255);
// -------- SALIDA LEDs CÁLIDOS --------
for (int i = 0; i < numWarmLeds; i++) {
analogWrite(warmLeds[i], pwmFinal);
}
// -------- DEBUG --------
Serial.print("PIR: ");
Serial.print(presence);
Serial.print(" | Distancia: ");
Serial.print(distance);
Serial.print(" cm | PWM calidos: ");
Serial.println(pwmFinal);
delay(50); // solo para estabilizar el monitor serie
}
// =========================================
long measureDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 25000); // timeout ~4m
if (duration == 0) return distFar;
return duration / 58;
}