Felipe Andrade / Mbed 2 deprecated IntelliVase

Dependencies:   mbed Adafruit_GFX

Committer:
kaisen
Date:
Fri Jun 21 05:38:10 2019 +0000
Revision:
2:f54d29f79137
Parent:
1:51508978bad6
Fork Adafruit_GFX

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kaisen 0:30431dd1f3c9 1 #include "mbed.h"
kaisen 0:30431dd1f3c9 2 #include "Adafruit_SSD1306.h"
kaisen 0:30431dd1f3c9 3 #include <string>
kaisen 1:51508978bad6 4 #include <sstream>
kaisen 0:30431dd1f3c9 5
kaisen 0:30431dd1f3c9 6 void Rx_interrupt();
kaisen 0:30431dd1f3c9 7 void writeStringToOLED(string str, int x, int y);
kaisen 0:30431dd1f3c9 8 void showStatus();
kaisen 0:30431dd1f3c9 9 void toggleLED();
kaisen 0:30431dd1f3c9 10 void waterPlant();
kaisen 0:30431dd1f3c9 11 void waterCritical();
kaisen 0:30431dd1f3c9 12
kaisen 0:30431dd1f3c9 13 void drawSmile();
kaisen 0:30431dd1f3c9 14 void drawIdle();
kaisen 0:30431dd1f3c9 15 void drawSleep();
kaisen 0:30431dd1f3c9 16 void drawDead();
kaisen 0:30431dd1f3c9 17
kaisen 0:30431dd1f3c9 18 volatile bool sleepCycle;
kaisen 0:30431dd1f3c9 19
kaisen 0:30431dd1f3c9 20 /*
kaisen 0:30431dd1f3c9 21 OLED
kaisen 0:30431dd1f3c9 22 P5 -> MOSI
kaisen 0:30431dd1f3c9 23 P6 -> aberto
kaisen 0:30431dd1f3c9 24 P7 -> CLK
kaisen 0:30431dd1f3c9 25 Pinos variáveis
kaisen 0:30431dd1f3c9 26 P8 -> RES
kaisen 0:30431dd1f3c9 27 P9 -> DC
kaisen 0:30431dd1f3c9 28 P10 -> CS
kaisen 0:30431dd1f3c9 29
kaisen 0:30431dd1f3c9 30 Configuração SPI entra com (MOSI, MISO, CLK)
kaisen 0:30431dd1f3c9 31 Configuração OLED entra com (SPI, DC, RES, CS, altura, largura)
kaisen 0:30431dd1f3c9 32 */
kaisen 0:30431dd1f3c9 33 SPI spi(p5, p6, p7);
kaisen 0:30431dd1f3c9 34 Adafruit_SSD1306_Spi spiOLED(spi, p9, p8, p10, 32, 128);
kaisen 0:30431dd1f3c9 35
kaisen 0:30431dd1f3c9 36 /*
kaisen 0:30431dd1f3c9 37 BLUETOOTH
kaisen 0:30431dd1f3c9 38 P13 -> TX
kaisen 0:30431dd1f3c9 39 P14 -> RX
kaisen 0:30431dd1f3c9 40
kaisen 0:30431dd1f3c9 41 Configuração serial entra com (RX, TX)
kaisen 0:30431dd1f3c9 42 */
kaisen 0:30431dd1f3c9 43 Serial hc(p14, p13);
kaisen 0:30431dd1f3c9 44
kaisen 0:30431dd1f3c9 45
kaisen 0:30431dd1f3c9 46 /*
kaisen 0:30431dd1f3c9 47 Componentes que utilizam saída PWM:
kaisen 0:30431dd1f3c9 48 P21 a P26
kaisen 0:30431dd1f3c9 49 */
kaisen 0:30431dd1f3c9 50 PwmOut pump(p21);
kaisen 0:30431dd1f3c9 51 PwmOut led(p22);
kaisen 0:30431dd1f3c9 52
kaisen 0:30431dd1f3c9 53 /*
kaisen 0:30431dd1f3c9 54 Componentes que utilizam leitura análogica:
kaisen 0:30431dd1f3c9 55 P15 a P20
kaisen 0:30431dd1f3c9 56 */
kaisen 0:30431dd1f3c9 57 AnalogIn ldr(p15);
kaisen 0:30431dd1f3c9 58 AnalogIn hygroEarth(p16);
kaisen 0:30431dd1f3c9 59 AnalogIn hygroWater(p17);
kaisen 0:30431dd1f3c9 60
kaisen 0:30431dd1f3c9 61 /*
kaisen 0:30431dd1f3c9 62 Componentes que utilizam leitura digital:
kaisen 0:30431dd1f3c9 63 Qualquer pino livre (P5 a P30)
kaisen 0:30431dd1f3c9 64 */
kaisen 0:30431dd1f3c9 65 DigitalIn pres(p30);
kaisen 0:30431dd1f3c9 66
kaisen 0:30431dd1f3c9 67 volatile bool ledStatus;
kaisen 0:30431dd1f3c9 68 volatile float waterLimit;
kaisen 0:30431dd1f3c9 69 volatile time_t seconds;
kaisen 0:30431dd1f3c9 70
kaisen 0:30431dd1f3c9 71 int main()
kaisen 0:30431dd1f3c9 72 {
kaisen 0:30431dd1f3c9 73 set_time(0);
kaisen 0:30431dd1f3c9 74 seconds = time(NULL);
kaisen 0:30431dd1f3c9 75 // Resetar display
kaisen 0:30431dd1f3c9 76 spiOLED.clearDisplay();
kaisen 0:30431dd1f3c9 77 drawSmile();
kaisen 0:30431dd1f3c9 78 spiOLED.display();
kaisen 0:30431dd1f3c9 79 wait(10);
kaisen 0:30431dd1f3c9 80 drawIdle();
kaisen 1:51508978bad6 81
kaisen 0:30431dd1f3c9 82 ledStatus = false;
kaisen 0:30431dd1f3c9 83 sleepCycle = false;
kaisen 1:51508978bad6 84
kaisen 0:30431dd1f3c9 85 int tsEarth = 0; //
kaisen 0:30431dd1f3c9 86 int tsLight = 0; //
kaisen 0:30431dd1f3c9 87 int tsPres = 0; //
kaisen 1:51508978bad6 88
kaisen 0:30431dd1f3c9 89 int delayEarth = 3600; //
kaisen 0:30431dd1f3c9 90 int delayLight; //
kaisen 0:30431dd1f3c9 91 int delayPres = 7200; //
kaisen 1:51508978bad6 92
kaisen 0:30431dd1f3c9 93 waterLimit = 1;
kaisen 0:30431dd1f3c9 94 float lightLimit = 1; //
kaisen 0:30431dd1f3c9 95 float earthLimit = 1; //
kaisen 1:51508978bad6 96
kaisen 0:30431dd1f3c9 97 bool turnOnLED;
kaisen 0:30431dd1f3c9 98 bool turnOffLED;
kaisen 1:51508978bad6 99
kaisen 1:51508978bad6 100 while(1) {
kaisen 0:30431dd1f3c9 101 seconds = time(NULL);
kaisen 1:51508978bad6 102
kaisen 0:30431dd1f3c9 103 /*
kaisen 0:30431dd1f3c9 104 HIGRÔMETRO TERRA
kaisen 0:30431dd1f3c9 105 - Rega a planta quando o nível de umidade detectado for adequado
kaisen 0:30431dd1f3c9 106 - Não rega se não tiver passado um determinado tempo desde a ultima vez
kaisen 1:51508978bad6 107
kaisen 0:30431dd1f3c9 108 Condição 1: Valor lido no higrômetro da terra maior (mais seco) que o limite
kaisen 0:30431dd1f3c9 109 Condição 2: Tempo desde a ultima vez que foi regado maior que o delay mínimo
kaisen 0:30431dd1f3c9 110 */
kaisen 0:30431dd1f3c9 111 if (hygroEarth.read() > earthLimit && seconds - tsEarth > delayEarth) {
kaisen 0:30431dd1f3c9 112 tsEarth = seconds;
kaisen 0:30431dd1f3c9 113 waterPlant();
kaisen 0:30431dd1f3c9 114 }
kaisen 1:51508978bad6 115
kaisen 0:30431dd1f3c9 116 /*
kaisen 0:30431dd1f3c9 117 SENSOR LDR E FITA DE LED
kaisen 0:30431dd1f3c9 118 - Liga/desliga a fita de LED dependendo do nível de luz
kaisen 0:30431dd1f3c9 119 (acrescentar: do horário do dia)
kaisen 1:51508978bad6 120
kaisen 0:30431dd1f3c9 121 Condição 1: Valor lido no LDR inferior a luz necessária
kaisen 0:30431dd1f3c9 122 Condição 2: LED está desligado
kaisen 0:30431dd1f3c9 123 Condição 3 (acrescentar): horário atual não ser noite
kaisen 0:30431dd1f3c9 124 */
kaisen 0:30431dd1f3c9 125 turnOnLED = ldr.read() < lightLimit && !ledStatus;
kaisen 0:30431dd1f3c9 126 // Mesmas condições, mas inversas para desligar
kaisen 0:30431dd1f3c9 127 turnOffLED = ldr.read() > lightLimit && ledStatus;
kaisen 0:30431dd1f3c9 128 if (turnOnLED || turnOffLED) {
kaisen 0:30431dd1f3c9 129 toggleLED();
kaisen 0:30431dd1f3c9 130 }
kaisen 1:51508978bad6 131
kaisen 0:30431dd1f3c9 132 /*
kaisen 0:30431dd1f3c9 133 SENSOR PRESENÇA
kaisen 0:30431dd1f3c9 134 - Desenha uma carinha feliz quando detecta presença de alguém ^u^
kaisen 1:51508978bad6 135
kaisen 0:30431dd1f3c9 136 Condição 1: Valor lido no sensor de presença é 1
kaisen 0:30431dd1f3c9 137 Condição 2: Tempo desde a ultima vez que foi ativado maior que o delay mínimo
kaisen 0:30431dd1f3c9 138 */
kaisen 0:30431dd1f3c9 139 if (pres.read() && seconds - tsPres > delayPres) {
kaisen 0:30431dd1f3c9 140 tsPres = seconds;
kaisen 0:30431dd1f3c9 141 drawSmile();
kaisen 0:30431dd1f3c9 142 wait(15);
kaisen 0:30431dd1f3c9 143 }
kaisen 1:51508978bad6 144
kaisen 0:30431dd1f3c9 145 /*
kaisen 0:30431dd1f3c9 146 HIGRÔMETRO ÁGUA
kaisen 0:30431dd1f3c9 147 - Interrompe o programa no caso de não ter água no tanque
kaisen 1:51508978bad6 148
kaisen 1:51508978bad6 149 Condição 1: Valor lido no higrômetro da água maior (mais seco) que o limite
kaisen 0:30431dd1f3c9 150 */
kaisen 0:30431dd1f3c9 151 if (hygroWater.read() > waterLimit) {
kaisen 0:30431dd1f3c9 152 waterCritical();
kaisen 0:30431dd1f3c9 153 }
kaisen 1:51508978bad6 154
kaisen 0:30431dd1f3c9 155 /*
kaisen 0:30431dd1f3c9 156 DORMIR
kaisen 0:30431dd1f3c9 157 - O vaso dorme quando o horário for de noite.
kaisen 1:51508978bad6 158
kaisen 0:30431dd1f3c9 159 Condição 1: ??? horas noturnas
kaisen 0:30431dd1f3c9 160 */
kaisen 1:51508978bad6 161
kaisen 1:51508978bad6 162 // ...
kaisen 0:30431dd1f3c9 163 if (true) {
kaisen 0:30431dd1f3c9 164 drawSleep();
kaisen 0:30431dd1f3c9 165 }
kaisen 1:51508978bad6 166
kaisen 0:30431dd1f3c9 167 wait(1);
kaisen 0:30431dd1f3c9 168 }
kaisen 0:30431dd1f3c9 169 }
kaisen 0:30431dd1f3c9 170
kaisen 0:30431dd1f3c9 171 // Receber comandos manuais por bluetooth
kaisen 1:51508978bad6 172 void Rx_interrupt()
kaisen 1:51508978bad6 173 {
kaisen 0:30431dd1f3c9 174 char c;
kaisen 0:30431dd1f3c9 175 c = hc.getc();
kaisen 1:51508978bad6 176 switch(c) {
kaisen 0:30431dd1f3c9 177 case 'S':
kaisen 0:30431dd1f3c9 178 showStatus();
kaisen 0:30431dd1f3c9 179 break;
kaisen 0:30431dd1f3c9 180 case 'A':
kaisen 0:30431dd1f3c9 181 waterPlant();
kaisen 0:30431dd1f3c9 182 break;
kaisen 0:30431dd1f3c9 183 case 'L':
kaisen 0:30431dd1f3c9 184 toggleLED();
kaisen 0:30431dd1f3c9 185 break;
kaisen 0:30431dd1f3c9 186 default:
kaisen 0:30431dd1f3c9 187 break;
kaisen 0:30431dd1f3c9 188 }
kaisen 0:30431dd1f3c9 189 }
kaisen 0:30431dd1f3c9 190
kaisen 1:51508978bad6 191 void writeStringToOLED(string str, int x, int y)
kaisen 1:51508978bad6 192 {
kaisen 0:30431dd1f3c9 193 spiOLED.setTextCursor(x, y);
kaisen 0:30431dd1f3c9 194 spiOLED.fillRect(x, y, 128, 8, 0);
kaisen 0:30431dd1f3c9 195 for(int i = 0; i < str.length(); i++) {
kaisen 0:30431dd1f3c9 196 spiOLED.writeChar(str[i]);
kaisen 0:30431dd1f3c9 197 }
kaisen 0:30431dd1f3c9 198 spiOLED.display();
kaisen 0:30431dd1f3c9 199 }
kaisen 0:30431dd1f3c9 200
kaisen 0:30431dd1f3c9 201 // Mostra todas as leituras atuais
kaisen 1:51508978bad6 202 void showStatus()
kaisen 1:51508978bad6 203 {
kaisen 0:30431dd1f3c9 204 hc.printf("Presença: %d\nLDR: %.5f\nHigrometro Terra: %.5f\nHigrometro Agua: %.5f",
kaisen 1:51508978bad6 205 pres.read(),
kaisen 1:51508978bad6 206 ldr.read(),
kaisen 1:51508978bad6 207 hygroEarth.read(),
kaisen 1:51508978bad6 208 hygroWater.read());
kaisen 0:30431dd1f3c9 209 }
kaisen 0:30431dd1f3c9 210
kaisen 0:30431dd1f3c9 211 // Rega a planta a força, desde que tenha água no reservatório
kaisen 1:51508978bad6 212 void waterPlant()
kaisen 1:51508978bad6 213 {
kaisen 0:30431dd1f3c9 214 if(hygroWater.read() > waterLimit) waterCritical();
kaisen 0:30431dd1f3c9 215 pump.write(1); // ativa a 12V
kaisen 0:30431dd1f3c9 216 wait(3); // regar por quanto tempo?
kaisen 0:30431dd1f3c9 217 pump.write(0);
kaisen 0:30431dd1f3c9 218 }
kaisen 0:30431dd1f3c9 219
kaisen 0:30431dd1f3c9 220 // Interrompe o funcionamento do vaso até que seja alimentado com água
kaisen 1:51508978bad6 221 void waterCritical()
kaisen 1:51508978bad6 222 {
kaisen 0:30431dd1f3c9 223 drawDead();
kaisen 1:51508978bad6 224
kaisen 0:30431dd1f3c9 225 while(hygroWater.read() > waterLimit) {
kaisen 0:30431dd1f3c9 226 // whatever
kaisen 1:51508978bad6 227
kaisen 0:30431dd1f3c9 228 wait(1);
kaisen 0:30431dd1f3c9 229 }
kaisen 1:51508978bad6 230
kaisen 0:30431dd1f3c9 231 drawIdle();
kaisen 0:30431dd1f3c9 232 }
kaisen 0:30431dd1f3c9 233
kaisen 0:30431dd1f3c9 234 // Liga/desliga os LEDs
kaisen 1:51508978bad6 235 void toggleLED()
kaisen 1:51508978bad6 236 {
kaisen 0:30431dd1f3c9 237 ledStatus = !ledStatus;
kaisen 0:30431dd1f3c9 238 int toggle = ledStatus ? 1 : 0;
kaisen 0:30431dd1f3c9 239 led.write(toggle);
kaisen 0:30431dd1f3c9 240 }
kaisen 0:30431dd1f3c9 241
kaisen 0:30431dd1f3c9 242 // Desenha uma carinha feliz ^u^
kaisen 1:51508978bad6 243 void drawSmile()
kaisen 1:51508978bad6 244 {
kaisen 0:30431dd1f3c9 245 spiOLED.drawCircle(12, 20, 9, 1);
kaisen 0:30431dd1f3c9 246 spiOLED.fillRect(0, 5, 22, 15, 0);
kaisen 0:30431dd1f3c9 247 spiOLED.fillTriangle(2, 15, 10, 15, 6, 7, 1);
kaisen 0:30431dd1f3c9 248 spiOLED.fillTriangle(3, 15, 9, 15, 6, 8, 0);
kaisen 0:30431dd1f3c9 249 spiOLED.fillTriangle(14, 15, 22, 15, 18, 7, 1);
kaisen 0:30431dd1f3c9 250 spiOLED.fillTriangle(15, 15, 21, 15, 18, 8, 0);
kaisen 0:30431dd1f3c9 251 spiOLED.setTextSize(2);
kaisen 0:30431dd1f3c9 252 writeStringToOLED("Hello!", 30, 10);
kaisen 0:30431dd1f3c9 253 }
kaisen 0:30431dd1f3c9 254
kaisen 1:51508978bad6 255 void drawIdle()
kaisen 1:51508978bad6 256 {
kaisen 0:30431dd1f3c9 257 spiOLED.drawCircle(12, 20, 9, 1);
kaisen 0:30431dd1f3c9 258 spiOLED.fillRect(0, 5, 22, 15, 0);
kaisen 0:30431dd1f3c9 259 spiOLED.fillRect(7, 6, 2, 10, 1);
kaisen 0:30431dd1f3c9 260 spiOLED.fillRect(16, 6, 2, 10, 1);
kaisen 0:30431dd1f3c9 261 spiOLED.setTextSize(2);
kaisen 0:30431dd1f3c9 262 writeStringToOLED("All ok!", 40, 10);
kaisen 0:30431dd1f3c9 263 }
kaisen 0:30431dd1f3c9 264
kaisen 1:51508978bad6 265 void drawSleep()
kaisen 1:51508978bad6 266 {
kaisen 0:30431dd1f3c9 267 int y = 1;
kaisen 0:30431dd1f3c9 268 while(sleepCycle) {
kaisen 0:30431dd1f3c9 269 spiOLED.clearDisplay();
kaisen 0:30431dd1f3c9 270 spiOLED.drawCircle(10, 23, 3, 1);
kaisen 0:30431dd1f3c9 271 spiOLED.fillRect(2, 12, 8, 2, 1);
kaisen 0:30431dd1f3c9 272 spiOLED.fillRect(15, 12, 8, 2, 1);
kaisen 0:30431dd1f3c9 273 spiOLED.setTextSize(1);
kaisen 0:30431dd1f3c9 274 writeStringToOLED("z", 35, 16 + y * 3);
kaisen 0:30431dd1f3c9 275 spiOLED.setTextSize(2);
kaisen 0:30431dd1f3c9 276 writeStringToOLED("z", 45, 11 - y * 3);
kaisen 0:30431dd1f3c9 277 spiOLED.setTextSize(3);
kaisen 0:30431dd1f3c9 278 writeStringToOLED("z", 65, 6 + y * 3);
kaisen 0:30431dd1f3c9 279 spiOLED.setTextSize(4);
kaisen 0:30431dd1f3c9 280 writeStringToOLED("z", 90, 1 - y * 3);
kaisen 0:30431dd1f3c9 281 wait(1);
kaisen 0:30431dd1f3c9 282 y = y * -1;
kaisen 1:51508978bad6 283
kaisen 0:30431dd1f3c9 284 // ...
kaisen 0:30431dd1f3c9 285 if (seconds > 86400) sleepCycle = false;
kaisen 0:30431dd1f3c9 286 }
kaisen 0:30431dd1f3c9 287 }
kaisen 0:30431dd1f3c9 288
kaisen 1:51508978bad6 289 void drawDead()
kaisen 1:51508978bad6 290 {
kaisen 0:30431dd1f3c9 291 spiOLED.drawCircle(13, 27, 7, 1);
kaisen 0:30431dd1f3c9 292 spiOLED.fillRect(0, 28, 22, 15, 0);
kaisen 0:30431dd1f3c9 293 spiOLED.drawLine(2, 15, 10, 7, 1);
kaisen 0:30431dd1f3c9 294 spiOLED.drawLine(2, 7, 10, 15, 1);
kaisen 0:30431dd1f3c9 295 spiOLED.drawLine(16, 15, 24, 7, 1);
kaisen 0:30431dd1f3c9 296 spiOLED.drawLine(16, 7, 24, 15, 1);
kaisen 0:30431dd1f3c9 297 spiOLED.setTextSize(2);
kaisen 0:30431dd1f3c9 298 writeStringToOLED("Help!", 50, 6);
kaisen 0:30431dd1f3c9 299 spiOLED.setTextSize(1);
kaisen 0:30431dd1f3c9 300 writeStringToOLED("Need water!!", 50, 22);
kaisen 0:30431dd1f3c9 301 }