CODIGO BLOQUES Y JAVASCRIPT
ESCRITO
function showOnOLED (soilPct: number, levelPct: number, airQuality: string, dustVal: number) {
OLED.clear()
// Línea 1
OLED.writeStringNewLine("Humedad: " + Math.round(soilPct) + "%")
// Línea 2
OLED.writeStringNewLine("Nivel: " + Math.round(levelPct) + "%")
// Línea 3
OLED.writeStringNewLine("Polvo: " + dustVal)
// Línea 4 (Calidad del aire en español)
OLED.writeStringNewLine("Calidad Aire: " + airQuality)
}
// Mapea la lectura analógica de la tierra (0=Húmedo, 1023=Seco) a porcentaje.
function analogToSoilPercent (reading: number) {
// Mapeo inverso: 0 (Mojado) -> 100%, 1023 (Seco) -> 0%
pct = Math.map(reading, 0, 1023, 100, 0)
return Math.constrain(pct, 0, 100)
}
// Clasifica la calidad del aire basándose en el valor ADC del sensor de polvo.
// El resultado se presenta en español.
function classifyAir (dustVal: number) {
// Clasificaciones:
if (dustVal <= 200) {
return "Buena"
} else if (dustVal <= 400) {
return "Regular"
} else {
return "Mala"
}
}
let levelPct = 0
let soilPct = 0
let airQuality = ""
let dustVal = 0
let levelVal = 0
let soilVal = 0
let pct = 0
// --- CONFIGURACIÓN DE PINES ---
// Humedad Capacitiva
let SOIL_PIN = AnalogPin.P3
// Nivel de Agua
let LEVEL_PIN = AnalogPin.P1
// Sensor de Polvo (Vout Analógica)
let DUST_PIN = AnalogPin.P2
// Relé
let PUMP_PIN = DigitalPin.P8
// --- UMBRALES DE RIEGO Y CLASIFICACIÓN (¡DEBES CALIBRAR ESTOS VALORES!) ---
let soilDryThreshold = 600
let waterLowThreshold = 400
let pumpDurationMs = 5000
// --- INICIALIZACIÓN ---
OLED.init(128, 64)
OLED.clear()
// Apaga la bomba al inicio
pins.digitalWritePin(PUMP_PIN, 0)
// Apaga la bomba al inicio
// --- BUCLE PRINCIPAL (Ejecutándose Continuamente) ---
basic.forever(function () {
// 1. Lectura de Sensores
soilVal = pins.analogReadPin(SOIL_PIN)
levelVal = pins.analogReadPin(LEVEL_PIN)
dustVal = pins.analogReadPin(DUST_PIN)
// 2. Procesamiento
airQuality = classifyAir(dustVal)
soilPct = analogToSoilPercent(soilVal)
// Mapeo de nivel a porcentaje
levelPct = Math.map(levelVal, 0, 1023, 0, 100)
levelPct = Math.constrain(levelPct, 0, 100)
// 3. Mostrar Resultados en OLED
showOnOLED(soilPct, levelPct, airQuality, dustVal)
// 4. Lógica de Riego (CONDICIONAL)
if (soilVal > soilDryThreshold && levelVal > waterLowThreshold) {
// Activa el relé
pins.digitalWritePin(PUMP_PIN, 1)
basic.pause(pumpDurationMs)
// Desactiva el relé
pins.digitalWritePin(PUMP_PIN, 0)
}
// Espera 1 segundo
basic.pause(1000)
})
No hay comentarios:
Publicar un comentario