#include "wokwi-api.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Hmax 500
#define Hmin 0
float altura=0; //posicion en mm
int P0,P1;
float w2 = 0, w1 = 0, w0 = 0;
float alpha = 0;
long int alphaA1 = 0, alphaA2 = 0;
long int alphaB1 = 0, alphaB2 = 0;
int ENC_A = 0, ENC_B = 0;
typedef struct {
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t a;
} rgba_t;
typedef struct {
pin_t pin_Bomba; // sensor persiana abajo
pin_t pin_Nivel; // sensor persiana arriba
pin_t pin_vp;
pin_t pin_vn;
buffer_t framebuffer;
uint32_t width;
uint32_t height;
uint32_t row;
uint32_t valve_attr;
} chip_state_t;
static void chip_timer_event(void *user_data);
void draw_line(chip_state_t *chip, uint32_t row, rgba_t color) {
uint32_t offset = chip->width * 4 * row;
for (int x = 0; x < chip->width * 4; x += 4) {
buffer_write(chip->framebuffer, offset + x, (uint8_t*)&color, sizeof(color));
}
}
void chip_init(void) {
chip_state_t *chip = malloc(sizeof(chip_state_t));
chip->pin_Nivel = pin_init("Nivel", ANALOG);
chip->pin_vp = pin_init("V+", ANALOG);
chip->pin_vn = pin_init("V-", ANALOG);
chip->pin_Bomba = pin_init("Bomba",ANALOG);
chip->valve_attr = attr_init_float("Salida",100);
chip->framebuffer = framebuffer_init(&chip->width, &chip->height);
const timer_config_t timer_config = {
.callback = chip_timer_event,
.user_data = chip,
};
timer_t timer_id = timer_init(&timer_config);
timer_start(timer_id, 1000, true);
}
void chip_timer_event(void *user_data) {
chip_state_t *chip = (chip_state_t*)user_data;
float vp = pin_adc_read(chip->pin_vp);
float vn = pin_adc_read(chip->pin_vn);
float valve = attr_read_float(chip->valve_attr);
float bomba = pin_read(chip->pin_Bomba);
float q = sqrt(2*9.81*altura/1000.0)/500.0*valve/100.0;
altura = altura + bomba*500.0/60000.0-q; // tarda en llenarse 60 segundos sin salida de agua
if (altura>=Hmax) altura=Hmax;
if (altura<=Hmin) altura=Hmin;
rgba_t black = { .r = 0xff, .g=0xff, .b=0xff, .a=0x00 };
draw_line(chip, Hmax - altura, black);
rgba_t cyan = { .r = 0x0f, .g=0xff, .b=0xff, .a=0xff };
draw_line(chip, Hmax - altura+1, cyan);
pin_dac_write(chip->pin_Nivel, altura*5.0/500.0);
}
Ejercicio Deposito
Referencia