-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSADI_Alimentador.ino
209 lines (188 loc) · 6.46 KB
/
SADI_Alimentador.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include "Arduino_FreeRTOS.h"
#include "task.h"
#include "ArduinoJson.h"
#include <EEPROM.h>
#include "tasks_commom.h"
#include "Motor_Alimentador.h"
#include "Ultrassom_Alimentador.h"
#include "Led_Alimentador.h"
#include "Ldr_Alimentador.h"
#include "Relogio_Alimentador.h"
#include "Alimentador.h"
#include "BuzzerAtivo_Alimentador.h"
#define NMAX_HORARIOS_PARA_ALIMENTAR 20
//Tasks
//TaskHandle_t ledTaskH;
Alimentar dar_alimento[NMAX_HORARIOS_PARA_ALIMENTAR];
int porcentagem_lampada = 100;
double tensao_ldr = 2.5;
//BUZZER
int n_beeps = 2;
int tempo_beep = 100;
int tempo_entre_beeps = 100;
void setup() {
Serial.begin(9600);
Serial.setTimeout(10);
inicializar_motor();
inicializar_ultrassom();
inicializar_luz();
inicializar_ldr();
inicializar_buzzer_ativo();
//Recuperando última hora definida
int hora = 0, minuto = 0, segundo = 0;
EEPROM.get(0, hora);
EEPROM.get(sizeof(int), minuto);
EEPROM.get(2 * sizeof(int), segundo);
definir_horario(hora, minuto, segundo);
fechar_recipiente();
xTaskCreate(task_relogio, "task_relogio", TASK_STACK_SIZE_RELOGIO, NULL, TASK_PRIORITY_RELOGIO, NULL);
xTaskCreate(task_serial, "task_serial", TASK_STACK_SIZE_SERIAL, NULL, TASK_PRIORITY_SERIAL, NULL);
xTaskCreate(alimentador_main, "alimentador_main", TASK_STACK_SIZE_ALIMENTADOR, NULL, TASK_PRIORITY_ALIMENTADOR, NULL);
}
void loop() {
// Nada é feito aqui, Todas as funções são feitas em Tasks
}
void alimentador_main(void *arg) {
vTaskDelay(200 / portTICK_PERIOD_MS);
while (true) {
for (int i = 0; i < NMAX_HORARIOS_PARA_ALIMENTAR; i++) {
if (passou_do_horario(dar_alimento[i].hora, dar_alimento[i].minuto, 0) && (!dar_alimento[i].ja_alimentou) && dar_alimento[i].id > 0) {
despejar_alimento();
vTaskDelay(dar_alimento[i].tempo_vazao_ms / portTICK_PERIOD_MS);
if (verificar_tampa_despejando()) {
dar_alimento[i].ja_alimentou = true;
n_beeps_aviso(n_beeps,tempo_beep,tempo_entre_beeps);
} else {
dar_alimento[i].ja_alimentou = false;
}
fechar_recipiente();
}
}
if (luminosidade_ambiente() > tensao_ldr) {
acender_luz_como_dimer(porcentagem_lampada);
} else {
desligar_luz();
}
if (novo_dia) {
novo_dia = false;
for (int i = 0; i < NMAX_HORARIOS_PARA_ALIMENTAR; i++) {
dar_alimento[i].ja_alimentou = false;
}
}
//Serial.println(distancia_ultrassom());
vTaskDelay(120 / portTICK_PERIOD_MS);
}
}
void task_serial(void *arg) {
while (true) {
if (Serial.available() > 0) {
String receber_json = Serial.readStringUntil("\n");
DynamicJsonDocument valores_do_json(256);
DeserializationError err = deserializeJson(valores_do_json, receber_json);
if (err)
{
String erro_json;
erro_json.concat("{\"erro\":");
erro_json.concat("\"");
erro_json.concat(err.c_str());
erro_json.concat("\"");
erro_json.concat("}");
Serial.println(erro_json);
}
else
{
switch ((int)valores_do_json["tipo_msg"])
{
case 1: {//Nova Alimentação
int id = (int)valores_do_json["id"];
if (id == 0 || id > NMAX_HORARIOS_PARA_ALIMENTAR) {
Serial.println("{\"erro\":\"id_errado\"}");
} else {
dar_alimento[id - 1] = Json_para_alimentar(valores_do_json);
}
break;
}
case 2: {//Enviar Alimentação
Alimentar alimentar_get;
int id = (int)valores_do_json["id"];
if ( id == 0 || id > NMAX_HORARIOS_PARA_ALIMENTAR) {
Serial.println("{\"erro\":\"id_errado\"}");
} else {
alimentar_get = dar_alimento[id - 1];
Serial.println(Alimentar_para_json(alimentar_get));
}
break;
}
case 3: {//Enviar Máximo ID's
String nmax_id_json;
nmax_id_json.concat("{\"nmax_id\":");
nmax_id_json.concat(NMAX_HORARIOS_PARA_ALIMENTAR);
nmax_id_json.concat("}");
Serial.println(nmax_id_json);
break;
}
case 4: {//Set Relogio Arduino
definir_horario(valores_do_json["hora"], valores_do_json["minuto"], valores_do_json["segundo"]);
break;
}
case 5: { //Get Relogio Arduino
Serial.println(horario_para_json());
break;
}
case 6: {//Receber % de ilumincação da lampada
porcentagem_lampada = valores_do_json["porcentagem"];
break;
}
case 7: {//Receber % de clareza para ligar a lampada(LDR)
double V_ldr = valores_do_json["tensao_ldr"];
if(V_ldr<=5&&V_ldr>=0){
tensao_ldr = V_ldr;
}
break;
}
case 8: {//Enviar status do LED
String led_json;
led_json.concat("{\"led_status\":");
led_json.concat(led_status);
led_json.concat(",\"porcentagem\":");
led_json.concat(porcentagem_lampada);
led_json.concat("}");
Serial.println(led_json);
break;
}
case 9: {//Enviar claridade do ambiente
double V_ldr = luminosidade_ambiente();
String ldr_json;
ldr_json.concat("{\"tensao_ldr\":");
ldr_json.concat(V_ldr);
ldr_json.concat(",\"limite_ldr\":");
ldr_json.concat(tensao_ldr);
ldr_json.concat("}");
Serial.println(ldr_json);
break;
}
case 10: {//Enviar ping de conectado (OK)
String ping_json;
ping_json.concat("{\"status\":");
ping_json.concat("\"");
ping_json.concat("OK");
ping_json.concat("\"");
ping_json.concat("}");
Serial.println(ping_json);
break;
}
case 11: {//Excluir Alimentação
int id = (int)valores_do_json["id"];
if (id == 0 || id > NMAX_HORARIOS_PARA_ALIMENTAR) {
Serial.println("{\"erro\":\"id_errado\"}");
} else {
dar_alimento[id - 1].id = 0;
}
break;
}
}
}
}
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}