Components and supplies
Arduino Nano R3
Project description
Code
Code for Arduino Nano
c_cpp
I am very sorry that this code lacks documentation but as soon as possible I will upload and upgrade to it, so you can edit it easily.
1#include <LCD.h> 2#include <Wire.h> 3#include <LiquidCrystal_I2C.h> 4#include <SimpleDHT.h> 5#include "RTClib.h" 6#include <dht.h> 7#include <Servo.h> 8 9Servo myservo; 10 11LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Set the LCD I2C address 12 13//Digitals 14const int pin1DHT22 = 2; //Sensor humedad 1 15const int Warmer = 3; //Relay 3 16const int Fan_1 = 6; //Relay 6 // Fan High 17const int buzzer = 4; //Piezo sounder 18const int button1 = 9; 19const int button2 = 10; 20const int button3 = 11; 21const int button4 = 12; 22const int button5 = 13; 23 24//Analogs 25const int inPinTh_1 = A1; //Termistor 2 26const int tempPin_1 = A2; //lm35_1 27const int tempPin_2 = A3; //lm35_2 28 29SimpleDHT22 dht22_1; 30RTC_DS1307 RTC; 31 32int temp_1, temp_2, DHT22Temp_1; 33int errorSense_1, errorSense_2, count_1, count_2, count_3 = 0; 34 35int menuScreen, menuScreenUseAlarm, menuScreenMode, menuScreenTempAlarm, menuScreenTemp, menuScreenHumid, mode, modeAlarm, manualSettings = 0; 36bool back, next, select, up, down = 0; 37 38float Temp1_Neonate, Temp2_Neonate, averageTemp_Neonate, lm35_1, lm35_2, coefWarmer, midleRangeTemp = 0; 39int pursuedHigherT = 373; 40int pursuedLowerT = 365; 41 42float upperTemp = 35; 43float lowerTemp = 34; 44float lowerTempComp = 0; 45 46float upperTempAlarm = 37.5; 47float lowerTempAlarm = 36.5; 48float lowerTempCompAlarm = 0; 49 50unsigned long currentMillis; 51unsigned long previousMillis = 0; // last time update 52long interval = 1000; // interval at which to do something (milliseconds) 53 54unsigned long currentMillis_1; 55unsigned long previousMillis_1 = 0; // last time update 56long interval_1 = 2000; // interval at which to do something (milliseconds) 57 58void setup() 59{ 60 myservo.attach(1); 61 myservo.write(122); //Para flujo sobrecalentado 62 delay(250); 63 myservo.write(70); //Flujo normal 64 delay(250); 65 myservo.write(122); 66 delay(250); 67 myservo.write(70); 68 Wire.begin(); 69 RTC.begin(); 70 pinMode(Fan_1, OUTPUT); 71 pinMode(Warmer, OUTPUT); 72 pinMode(back, INPUT); 73 pinMode(next, INPUT); 74 pinMode(select, INPUT); 75 pinMode(up, INPUT); 76 pinMode(down, INPUT); 77 78 pinMode(buzzer, OUTPUT); 79 digitalWrite(buzzer, LOW); 80 81 digitalWrite(Fan_1, LOW); 82 digitalWrite(Warmer, LOW); 83 84 lcd.begin(20, 4); // initialize the lcd for 20 chars 4 lines and turn on backlight 85 lcd.backlight(); 86 menuScreen_0(); 87 menuScreen_1(); 88 RTC.adjust(DateTime(__DATE__, __TIME__)); 89 // Check to see if the RTC is keeping time. If it is, load the time from your computer. 90 if (! RTC.isrunning()) { 91 lcd.print("Change clock battery"); 92 // This will reflect the time that your sketch was compiled 93 RTC.adjust(DateTime(__DATE__, __TIME__)); 94 } 95} 96 97void loop() 98{ 99 currentMillis = millis(); 100 buttonState(); 101 102 switch (menuScreen) { 103 case 0: 104 menuScreen_UseAlarm(); 105 break; 106 case 1: 107 menuScreen_SetAlarm(); 108 break; 109 case 2: 110 menuScreen_Mode(); 111 break; 112 case 3: 113 Screen_Auto_intro(); 114 break; 115 case 4: 116 menuScreen_Temp(); 117 break; 118 case 5: 119 Alarms(); 120 currentMillis = millis(); 121 if (currentMillis - previousMillis > interval) { 122 previousMillis = currentMillis; 123 Screen_Auto(); 124 } 125 break; 126 case 6: 127 Alarms(); 128 currentMillis = millis(); 129 if (currentMillis - previousMillis > interval) { 130 previousMillis = currentMillis; 131 Screen_Manual(); 132 } 133 break; 134 } 135 136} 137 138 139void mainScreen() 140{ 141 currentMillis_1 = millis(); 142 143 lcd.setCursor(0, 0); 144 lcd.print("Baby T "); lcd.print(averageTemp(), 1); lcd.print((char)223); //lcd.print("C"); 145 lcd.setCursor(13, 0); 146 lcd.print("WarmerT"); 147 lcd.setCursor(0, 1); 148 lcd.print("Case T "); lcd.print(templm35_1(), 1); lcd.print((char)223); // Temp case lm35 1 149 lcd.setCursor(14, 1); 150 lcd.print(templm35_2(), 1); lcd.print((char)223); // Temp warmer lm35 2 151 lcd.setCursor(0, 2); 152 lcd.print("Cham T "); 153 if (currentMillis_1 - previousMillis_1 > interval_1) { // Importante para dar ciclo de espera a los sensores de humidificacion 154 previousMillis_1 = currentMillis_1; lcd.print(DHT22TempRead_1(), 1); lcd.print((char)223); 155 } 156 lcd.setCursor(0, 3); 157 lcd.print("Man. mode"); 158 RelojParaPantallaSerial(); 159 160 161} 162 163void RelojParaPantallaSerial() 164{ 165 DateTime now = RTC.now(); 166 lcd.setCursor(12, 3); 167 if (now.hour() < 10 ) { 168 lcd.print("0"); 169 lcd.print(now.hour(), DEC); 170 } 171 else { 172 lcd.print(now.hour(), DEC); 173 } 174 lcd.print(':'); 175 if (now.minute() < 10) { 176 lcd.print("0"); 177 lcd.print(now.minute(), DEC); 178 } 179 else { 180 lcd.print(now.minute(), DEC); 181 } 182 lcd.print(':'); 183 if (now.second() < 10) { 184 lcd.print("0"); 185 lcd.print(now.second()); 186 } 187 else { 188 lcd.print(now.second(), DEC); 189 } 190} 191 192void DHT22Sensor_1() // DHT22 sampling rate is 0.5HZ. 193{ 194 count_1 ++; 195 if (count_1 > 1) { //Sets counting of 2 seconds 196 count_1 = 0; 197 byte temperature_1 = 0; 198 byte humidity_1 = 0; 199 int err_1 = dht22_1.read(pin1DHT22, &temperature_1, &humidity_1, NULL); 200 if (err_1 != SimpleDHTErrSuccess) { 201 errorSense_1 ++; 202 if (errorSense_1 > 2) { // Here we set the number of errors allowed untill display an error 203 lcd.setCursor(10, 2); 204 lcd.print("Error"); lcd.print(err_1); delay(1000); 205 return; 206 } 207 return; 208 } 209 errorSense_1 = 0; // Reset the counter if the errors in a row are not higher than errors allowed untill display an error 210 DHT22Temp_1 = ((int)temperature_1); 211 count_1 = 0; 212 } 213} 214 215int DHT22TempRead_1() 216{ 217 DHT22Sensor_1(); 218 return DHT22Temp_1; 219} 220 221float temperature_Neonate() // CREAR ERROR DE TEMP 222{ 223 float val1 = 0; 224 for (int i = 0; i < 5; i++) { 225 val1 = val1 + analogRead(inPinTh_1); 226 delay(2); 227 } 228 Temp2_Neonate = val1 / 5; 229 return Temp2_Neonate; 230} 231 232float templm35_1() 233{ 234 float val2 = 0; 235 for (int i = 0; i < 5; i++) { 236 val2 = val2 + analogRead(tempPin_1); 237 delay(2); 238 } 239 lm35_1 = val2 / 5; 240 lm35_1 = mapf(lm35_1, 284.5, 323, 30, 37); 241 return lm35_1; 242} 243 244float templm35_2() 245{ 246 float val3 = 0; 247 for (int i = 0; i < 5; i++) { 248 val3 = val3 + analogRead(tempPin_2); 249 delay(2); 250 } 251 lm35_2 = val3 / 5; 252 lm35_2 = mapf(lm35_2, 284.5, 323, 30, 37); 253 return lm35_2; 254} 255 256double mapf(double x, double in_min, double in_max, double out_min, double out_max) 257{ 258 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; 259} 260 261float averageTemp() // Average was with two thermometers 262{ 263 averageTemp_Neonate = temperature_Neonate(); 264 averageTemp_Neonate = mapf(averageTemp_Neonate, 284.5, 323, 30, 37); 265 return averageTemp_Neonate; 266} 267 268int int_templm35_1() 269{ 270 int intlm35_1 = templm35_1(); 271 return intlm35_1; 272} 273 274int int_tempcase() 275{ 276 int int_templm35_1_0 = templm35_1() * 10; 277 return int_templm35_1_0; 278} 279 280int int_templm35_2() 281{ 282 int intlm35_2 = templm35_2(); 283 return intlm35_2; 284} 285 286int int_templm35_2_0() 287{ 288 int int_templm35_2_0 = templm35_2() * 10; 289 return int_templm35_2_0; 290} 291 292 293//////////////////////////////////////////////////// 294 295void menuScreen_0 () 296{ 297 lcd.setCursor(0, 1); 298 lcd.print(" The Baby Warmer."); 299 delay(1000); 300 lcd.setCursor(0, 3); 301 lcd.print("Welcome!"); 302 delay(500); 303 lcd.setCursor(15, 3); 304 lcd.print("V 1.3"); 305 delay(1000); 306 lcd.clear(); 307} 308 309void menuScreen_1() 310{ 311 lcd.setCursor(0, 0); 312 lcd.print("The following menu"); 313 lcd.setCursor(0, 1); 314 lcd.print("will help you to set"); 315 lcd.setCursor(0, 2); 316 lcd.print("the incubator system"); 317 delay(3000); 318 lcd.clear(); 319} 320 321void menuScreen_UseAlarm() 322{ 323 switch (menuScreenUseAlarm) { 324 case 0: 325 lcd.setCursor(0, 0); 326 lcd.print("Activate neonate"); 327 lcd.setCursor(0, 1); 328 lcd.print("temp. alarm?"); 329 if (modeAlarm == 0) { 330 lcd.setCursor(0, 2); 331 lcd.print("->"); 332 } 333 else if (modeAlarm == 1) { 334 lcd.setCursor(0, 3); 335 lcd.print("->"); 336 } 337 lcd.setCursor(2, 2); 338 lcd.print("No"); 339 lcd.setCursor(2, 3); 340 lcd.print("Yes"); 341 if (back) { 342 back = 0; 343 } 344 else if (next) { 345 if (modeAlarm == 0) { 346 menuScreen = 2; 347 } 348 else if (modeAlarm == 1) { 349 menuScreen = 1; 350 } 351 lcd.clear(); 352 delay(500); 353 next = 0; 354 } 355 else if (select) { 356 if (modeAlarm == 0) { 357 menuScreen = 2; 358 } 359 else if (modeAlarm == 1) { 360 menuScreen = 1; 361 } 362 lcd.clear(); 363 delay(500); 364 select = 0; 365 } 366 else if (up) { 367 modeAlarm = modeAlarm - 1; 368 if (modeAlarm < 0) { 369 modeAlarm = 1; 370 } 371 delay(100); 372 lcd.setCursor(0, 2); 373 lcd.print(" "); 374 lcd.setCursor(0, 3); 375 lcd.print(" "); 376 up = 0; 377 } 378 else if (down) { 379 modeAlarm = modeAlarm + 1; 380 if (modeAlarm > 1) { 381 modeAlarm = 0; 382 } 383 delay(100); 384 lcd.setCursor(0, 2); 385 lcd.print(" "); 386 lcd.setCursor(0, 3); 387 lcd.print(" "); 388 down = 0; 389 } 390 break; 391 } 392} 393 394void menuScreen_SetAlarm() 395{ 396 switch (menuScreenTempAlarm) { 397 case 0: 398 lcd.setCursor(0, 0); 399 lcd.print("Set the upper range"); 400 lcd.setCursor(0, 1); 401 lcd.print("T="); 402 lcd.setCursor(3, 1); 403 lcd.print(upperTempAlarm, 1); 404 lcd.print((char)223); 405 lcd.print("C"); 406 lcd.setCursor(0, 2); 407 lcd.print("Press select to"); 408 lcd.setCursor(0, 3); 409 lcd.print("continue..."); 410 if (back) { 411 back = 0; 412 lcd.clear(); 413 delay(500); 414 menuScreen = 0; 415 } 416 else if (next) { 417 lowerTempCompAlarm = upperTempAlarm - 0.5; 418 lowerTempAlarm = upperTempAlarm - 0.5; 419 menuScreenTempAlarm = 1; 420 lcd.clear(); 421 delay(500); 422 next = 0; 423 } 424 else if (select) { 425 lowerTempCompAlarm = upperTempAlarm - 0.5; 426 lowerTempAlarm = upperTempAlarm - 0.5; 427 menuScreenTempAlarm = 1; 428 lcd.clear(); 429 delay(500); 430 select = 0; 431 } 432 else if (up) { 433 if (int_upperTempAlarm() >= 375) { 434 upperTempAlarm = 37.5; 435 lcd.setCursor(9, 1); 436 lcd.print(" MAX TEMP"); 437 delay(1000); 438 lcd.setCursor(9, 1); 439 lcd.print(" "); 440 return; 441 } 442 upperTempAlarm = upperTempAlarm + 0.1; 443 lcd.setCursor(3, 1); 444 lcd.print(upperTempAlarm, 1); 445 up = 0; 446 } 447 else if (down) { 448 if (int_upperTempAlarm() <= 320) { 449 upperTempAlarm = 32; 450 lcd.setCursor(10, 1); 451 lcd.print("MIN RANGE"); 452 delay(1000); 453 lcd.setCursor(9, 1); 454 lcd.print(" "); 455 return; 456 } 457 upperTempAlarm = upperTempAlarm - 0.1; 458 lcd.setCursor(3, 1); 459 lcd.print(upperTempAlarm, 1); 460 down = 0; 461 } 462 break; 463 464 465 case 1: 466 lcd.setCursor(0, 0); 467 lcd.print("Set the lower range"); 468 lcd.setCursor(0, 1); 469 lcd.print("T="); 470 lcd.setCursor(3, 1); 471 lcd.print(lowerTempAlarm, 1); 472 lcd.print((char)223); 473 lcd.print("C"); 474 lcd.setCursor(0, 2); 475 lcd.print("Press select to"); 476 lcd.setCursor(0, 3); 477 lcd.print("continue..."); 478 479 if (back) { 480 menuScreenTempAlarm = 0; 481 lcd.clear(); 482 delay(200); 483 back = 0; 484 } 485 else if (next) { 486 menuScreenTempAlarm = 2; 487 next = 0; 488 lcd.clear(); 489 delay(500); 490 } 491 else if (select) { 492 menuScreenTempAlarm = 2; 493 select = 0; 494 lcd.clear(); 495 delay(500); 496 } 497 else if (up) { 498 if (int_lowerTempAlarm() >= (int_upperTempAlarm() - 5)) { 499 lowerTempAlarm = lowerTempCompAlarm; 500 lcd.setCursor(9, 1); 501 lcd.print(" MIN RANGE"); 502 delay(1000); 503 lcd.setCursor(9, 1); 504 lcd.print(" "); 505 return; 506 } 507 lowerTempAlarm = lowerTempAlarm + 0.1; 508 lcd.setCursor(3, 1); 509 lcd.print(lowerTempAlarm, 1); 510 up = 0; 511 } 512 else if (down) { 513 if (int_lowerTempAlarm() <= 280) { 514 lowerTempAlarm = 28; 515 lcd.setCursor(10, 1); 516 lcd.print("MIN TEMP"); 517 delay(1000); 518 lcd.setCursor(9, 1); 519 lcd.print(" "); 520 return; 521 } 522 lowerTempAlarm = lowerTempAlarm - 0.1; 523 lcd.setCursor(3, 1); 524 lcd.print(lowerTempAlarm, 1); 525 down = 0; 526 } 527 break; 528 529 case 2: 530 lcd.setCursor(0, 0); 531 lcd.print("Upper limit: "); 532 lcd.setCursor(0, 1); 533 lcd.print("T="); 534 lcd.setCursor(3, 1); 535 lcd.print(upperTempAlarm, 1); 536 lcd.print((char)223); 537 lcd.print("C"); 538 lcd.setCursor(0, 2); 539 lcd.print("Lower limit:"); 540 lcd.setCursor(0, 3); 541 lcd.print("T="); 542 lcd.setCursor(3, 3); 543 lcd.print(lowerTempAlarm, 1); 544 lcd.print((char)223); 545 lcd.print("C"); 546 lcd.setCursor(9, 3); 547 lcd.print(" Continue?"); 548 if (back) { 549 menuScreenTempAlarm = 1; 550 lcd.clear(); 551 delay(200); 552 back = 0; 553 } 554 else if (next) { 555 menuScreen = 2; 556 next = 0; 557 lcd.clear(); 558 delay(500); 559 } 560 else if (select) { 561 menuScreen = 2; 562 select = 0; 563 lcd.clear(); 564 delay(500); 565 } 566 else if (up) { 567 up = 0; 568 } 569 else if (down) { 570 down = 0; 571 } 572 } 573 574} 575 576void menuScreen_Mode() 577{ 578 switch (menuScreenMode) { 579 case 0: 580 lcd.setCursor(0, 0); 581 lcd.print("Select the mode:"); 582 583 if (mode == 0) { 584 lcd.setCursor(0, 2); 585 lcd.print("->"); 586 } 587 else if (mode == 1) { 588 lcd.setCursor(0, 3); 589 lcd.print("->"); 590 } 591 lcd.setCursor(2, 2); 592 lcd.print("Skin mode aut."); 593 lcd.setCursor(2, 3); 594 lcd.print("Temp setting man."); 595 if (back) { 596 back = 0; 597 lcd.clear(); 598 delay(500); 599 menuScreenTempAlarm = 0; 600 menuScreen = 0; 601 } 602 else if (next) { 603 if (mode == 0) { 604 menuScreen = 3; 605 } 606 else if (mode == 1) { 607 menuScreen = 4; 608 } 609 lcd.clear(); 610 delay(500); 611 next = 0; 612 } 613 else if (select) { 614 if (mode == 0) { 615 menuScreen = 3; 616 } 617 else if (mode == 1) { 618 menuScreen = 4; 619 } 620 lcd.clear(); 621 delay(500); 622 select = 0; 623 } 624 else if (up) { 625 mode = mode - 1; 626 if (mode < 0) { 627 mode = 1; 628 } 629 delay(100); 630 lcd.setCursor(0, 2); 631 lcd.print(" "); 632 lcd.setCursor(0, 3); 633 lcd.print(" "); 634 up = 0; 635 } 636 else if (down) { 637 mode = mode + 1; 638 if (mode > 1) { 639 mode = 0; 640 } 641 delay(100); 642 lcd.setCursor(0, 2); 643 lcd.print(" "); 644 lcd.setCursor(0, 3); 645 lcd.print(" "); 646 down = 0; 647 } 648 break; 649 } 650} 651 652void Screen_Auto_intro() 653{ 654 lcd.setCursor(0, 0); 655 lcd.print("This mode will try"); 656 lcd.setCursor(0, 1); 657 lcd.print("to stabilize the"); 658 lcd.setCursor(0, 2); 659 lcd.print("neonate temperature"); 660 lcd.setCursor(0, 3); 661 lcd.print("between 36.5 & 37.3"); 662 delay(3000); 663 lcd.clear(); 664 lcd.setCursor(0, 0); 665 lcd.print("The supervision of"); 666 lcd.setCursor(0, 1); 667 lcd.print("the neonate is "); 668 lcd.setCursor(0, 2); 669 lcd.print("mandatory at small"); 670 lcd.setCursor(0, 3); 671 lcd.print("lapses. 5~10 mins"); 672 delay(3000); 673 lcd.clear(); 674 menuScreen = 5; 675} 676 677void menuScreen_Temp() 678{ 679 680 switch (menuScreenTemp) { 681 case 0: 682 lcd.setCursor(0, 0); 683 lcd.print("Set the upper range"); 684 lcd.setCursor(0, 1); 685 lcd.print("T="); 686 lcd.setCursor(3, 1); 687 lcd.print(upperTemp, 1); 688 lcd.print((char)223); 689 lcd.print("C"); 690 lcd.setCursor(0, 2); 691 lcd.print("Press select to"); 692 lcd.setCursor(0, 3); 693 lcd.print("continue..."); 694 if (back) { 695 back = 0; 696 menuScreen = 0; 697 } 698 else if (next) { 699 lowerTempComp = upperTemp - 1; 700 lowerTemp = upperTemp - 1; 701 menuScreenTemp = 1; 702 lcd.clear(); 703 delay(500); 704 next = 0; 705 } 706 else if (select) { 707 lowerTempComp = upperTemp - 1; 708 lowerTemp = upperTemp - 1; 709 menuScreenTemp = 1; 710 lcd.clear(); 711 delay(500); 712 select = 0; 713 } 714 else if (up) { 715 if (int_upperTemp() >= 370) { 716 upperTemp = 37; 717 lcd.setCursor(9, 1); 718 lcd.print(" MAX TEMP"); 719 delay(1000); 720 lcd.setCursor(9, 1); 721 lcd.print(" "); 722 return; 723 } 724 upperTemp = upperTemp + 0.1; 725 lcd.setCursor(3, 1); 726 lcd.print(upperTemp, 1); 727 up = 0; 728 } 729 else if (down) { 730 if (int_upperTemp() <= 310) { 731 upperTemp = 31; 732 lcd.setCursor(10, 1); 733 lcd.print("MIN RANGE"); 734 delay(1000); 735 lcd.setCursor(9, 1); 736 lcd.print(" "); 737 return; 738 } 739 upperTemp = upperTemp - 0.1; 740 lcd.setCursor(3, 1); 741 lcd.print(upperTemp, 1); 742 down = 0; 743 } 744 break; 745 746 747 case 1: 748 lcd.setCursor(0, 0); 749 lcd.print("Set the lower range"); 750 lcd.setCursor(0, 1); 751 lcd.print("T="); 752 lcd.setCursor(3, 1); 753 lcd.print(lowerTemp, 1); 754 lcd.print((char)223); 755 lcd.print("C"); 756 lcd.setCursor(0, 2); 757 lcd.print("Press select to"); 758 lcd.setCursor(0, 3); 759 lcd.print("continue..."); 760 761 if (back) { 762 menuScreenTemp = 0; 763 lcd.clear(); 764 delay(200); 765 back = 0; 766 } 767 else if (next) { 768 menuScreenTemp = 2; 769 next = 0; 770 lcd.clear(); 771 delay(500); 772 } 773 else if (select) { 774 menuScreenTemp = 2; 775 select = 0; 776 lcd.clear(); 777 delay(500); 778 } 779 else if (up) { 780 if (int_lowerTemp() >= (int_upperTemp() - 10)) { 781 lowerTemp = lowerTempComp; 782 lcd.setCursor(9, 1); 783 lcd.print(" MIN RANGE"); 784 delay(1000); 785 lcd.setCursor(9, 1); 786 lcd.print(" "); 787 return; 788 } 789 lowerTemp = lowerTemp + 0.1; 790 lcd.setCursor(3, 1); 791 lcd.print(lowerTemp, 1); 792 up = 0; 793 } 794 else if (down) { 795 if (int_lowerTemp() <= 300) { 796 lowerTemp = 30; 797 lcd.setCursor(10, 1); 798 lcd.print("MIN TEMP"); 799 delay(1000); 800 lcd.setCursor(9, 1); 801 lcd.print(" "); 802 return; 803 } 804 lowerTemp = lowerTemp - 0.1; 805 lcd.setCursor(3, 1); 806 lcd.print(lowerTemp, 1); 807 down = 0; 808 } 809 break; 810 811 case 2: 812 lcd.setCursor(0, 0); 813 lcd.print("Upper limit: "); 814 lcd.setCursor(0, 1); 815 lcd.print("T="); 816 lcd.setCursor(3, 1); 817 lcd.print(upperTemp, 1); 818 lcd.print((char)223); 819 lcd.print("C"); 820 lcd.setCursor(0, 2); 821 lcd.print("Lower limit:"); 822 lcd.setCursor(0, 3); 823 lcd.print("T="); 824 lcd.setCursor(3, 3); 825 lcd.print(lowerTemp, 1); 826 lcd.print((char)223); 827 lcd.print("C"); 828 lcd.setCursor(9, 3); 829 lcd.print(" Continue?"); 830 if (back) { 831 menuScreenTemp = 1; 832 lcd.clear(); 833 delay(200); 834 back = 0; 835 } 836 else if (next) { 837 menuScreen = 6; 838 next = 0; 839 lcd.clear(); 840 delay(500); 841 } 842 else if (select) { 843 menuScreen = 6; 844 select = 0; 845 lcd.clear(); 846 delay(500); 847 } 848 else if (up) { 849 up = 0; 850 } 851 else if (down) { 852 down = 0; 853 } 854 } 855 856} 857 858void Screen_Auto() { 859 Screen_Auto_S(); 860 warmerParameters_Auto(); 861} 862 863void Screen_Auto_S() 864{ 865 currentMillis_1 = millis(); 866 867 lcd.setCursor(0, 0); 868 lcd.print("Baby T "); lcd.print(averageTemp(), 1); lcd.print((char)223); //lcd.print("C"); 869 lcd.setCursor(13, 0); 870 lcd.print("WarmerT"); 871 lcd.setCursor(0, 1); 872 lcd.print("Case T "); lcd.print(templm35_1(), 1); lcd.print((char)223); // Temp case lm35 1 873 lcd.setCursor(14, 1); 874 lcd.print(templm35_2(), 1); lcd.print((char)223); // Temp warmer lm35 2 875 lcd.setCursor(0, 2); 876 lcd.print("Purs Baby T "); 877 lcd.print("37.3"); lcd.print((char)223); 878 lcd.setCursor(0, 3); 879 lcd.print("Aut. mode"); 880 RelojParaPantallaSerial(); 881 882 883 884} 885 886void Screen_Manual() 887{ 888 mainScreen(); 889 warmerParameters_Manual(); 890} 891 892void warmerParameters_Auto() 893{ 894 switch (manualSettings) { 895 case 0: 896 if (int_tempcase() <= int_lowerTemp()) { 897 digitalWrite(Warmer, HIGH); 898 } 899 else if (int_tempcase() > int_lowerTemp()) { 900 manualSettings++; 901 digitalWrite(Warmer, LOW); 902 } 903 904 case 1: 905 if (int_tempcase() <= pursuedLowerT) { 906 digitalWrite(Warmer, HIGH); 907 delay(400); 908 digitalWrite(Warmer, LOW); 909 delay(300); 910 } 911 else if (int_tempcase() >= pursuedHigherT) { 912 digitalWrite(Warmer, LOW); 913 digitalWrite(Fan_1, HIGH); 914 myservo.write(122); //Para flujo sobrecalentado 915 delay(2500); //Variable de tiempo de enfriamiento, a mas tiempo, mas frio 916 digitalWrite(Fan_1, LOW); 917 myservo.write(70); 918 delay(1000); 919 } 920 } 921} 922 923void warmerParameters_Manual() 924{ 925 switch (manualSettings) { 926 case 0: 927 if (int_tempcase() <= int_lowerTemp()) { 928 digitalWrite(Warmer, HIGH); 929 930 } 931 else if (int_tempcase() > int_lowerTemp()) { 932 manualSettings++; 933 digitalWrite(Warmer, LOW); 934 } 935 936 case 1: 937 if (int_tempcase() <= int_upperTemp()) { 938 digitalWrite(Warmer, HIGH); 939 delay(400); 940 digitalWrite(Warmer, LOW); 941 delay(300); 942 } 943 else if (int_tempcase() >= int_upperTemp()) { 944 digitalWrite(Warmer, LOW); 945 digitalWrite(Fan_1, HIGH); 946 myservo.write(122); //Para flujo sobrecalentado 947 delay(2500); //Variable de tiempo de enfriamiento, a mas tiempo, mas frio 948 digitalWrite(Fan_1, LOW); 949 myservo.write(70); 950 delay(1000); 951 } 952 } 953} 954 955void Alarms() 956{ 957 if (modeAlarm == 1) 958 { 959 if (averageTemp() < lowerTempAlarm || averageTemp() > upperTempAlarm) 960 { 961 digitalWrite(buzzer, HIGH); 962 delay(150); 963 digitalWrite(buzzer, LOW); 964 delay(100); 965 966 } 967 } 968 else { 969 digitalWrite(buzzer, LOW); 970 } 971} 972 973void buttonState() 974{ 975 back = digitalRead(button1); 976 next = digitalRead(button2); 977 select = digitalRead(button3); 978 up = digitalRead(button4); 979 down = digitalRead(button5); 980 981 if (back == HIGH) { 982 delay(150); 983 } 984 985 if (next == HIGH) { 986 delay(150); 987 } 988 989 if (select == HIGH) { 990 delay(150); 991 } 992 993 if (up == HIGH) { 994 delay(150); 995 } 996 997 if (down == HIGH) { 998 delay(150); 999 } 1000} 1001 1002int int_upperTemp() 1003{ 1004 int int_upperTemp = upperTemp * 10; 1005 return int_upperTemp; 1006} 1007 1008int int_lowerTemp() 1009{ 1010 int int_lowerTemp = lowerTemp * 10; 1011 return int_lowerTemp; 1012} 1013 1014int int_midleRangeTemp() 1015{ 1016 int int_midleRangeTemp = midleRangeTemp * 10; 1017 return int_midleRangeTemp; 1018} 1019 1020int int_coefWarmer() 1021{ 1022 int int_coefWarmer = coefWarmer * 10; 1023 return int_coefWarmer; 1024} 1025 1026int int_upperTempAlarm() 1027{ 1028 int int_upperTempAlarm = upperTempAlarm * 10; 1029 return int_upperTempAlarm; 1030} 1031 1032int int_lowerTempAlarm() 1033{ 1034 int int_lowerTempAlarm = lowerTempAlarm * 10; 1035 return int_lowerTempAlarm; 1036}
Code for Arduino Nano
c_cpp
I am very sorry that this code lacks documentation but as soon as possible I will upload and upgrade to it, so you can edit it easily.
1#include <LCD.h> 2#include <Wire.h> 3#include <LiquidCrystal_I2C.h> 4#include <SimpleDHT.h> 5#include "RTClib.h" 6#include <dht.h> 7#include <Servo.h> 8 9Servo myservo; 10 11LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Set the LCD I2C address 12 13//Digitals 14const int pin1DHT22 = 2; //Sensor humedad 1 15const int Warmer = 3; //Relay 3 16const int Fan_1 = 6; //Relay 6 // Fan High 17const int buzzer = 4; //Piezo sounder 18const int button1 = 9; 19const int button2 = 10; 20const int button3 = 11; 21const int button4 = 12; 22const int button5 = 13; 23 24//Analogs 25const int inPinTh_1 = A1; //Termistor 2 26const int tempPin_1 = A2; //lm35_1 27const int tempPin_2 = A3; //lm35_2 28 29SimpleDHT22 dht22_1; 30RTC_DS1307 RTC; 31 32int temp_1, temp_2, DHT22Temp_1; 33int errorSense_1, errorSense_2, count_1, count_2, count_3 = 0; 34 35int menuScreen, menuScreenUseAlarm, menuScreenMode, menuScreenTempAlarm, menuScreenTemp, menuScreenHumid, mode, modeAlarm, manualSettings = 0; 36bool back, next, select, up, down = 0; 37 38float Temp1_Neonate, Temp2_Neonate, averageTemp_Neonate, lm35_1, lm35_2, coefWarmer, midleRangeTemp = 0; 39int pursuedHigherT = 373; 40int pursuedLowerT = 365; 41 42float upperTemp = 35; 43float lowerTemp = 34; 44float lowerTempComp = 0; 45 46float upperTempAlarm = 37.5; 47float lowerTempAlarm = 36.5; 48float lowerTempCompAlarm = 0; 49 50unsigned long currentMillis; 51unsigned long previousMillis = 0; // last time update 52long interval = 1000; // interval at which to do something (milliseconds) 53 54unsigned long currentMillis_1; 55unsigned long previousMillis_1 = 0; // last time update 56long interval_1 = 2000; // interval at which to do something (milliseconds) 57 58void setup() 59{ 60 myservo.attach(1); 61 myservo.write(122); //Para flujo sobrecalentado 62 delay(250); 63 myservo.write(70); //Flujo normal 64 delay(250); 65 myservo.write(122); 66 delay(250); 67 myservo.write(70); 68 Wire.begin(); 69 RTC.begin(); 70 pinMode(Fan_1, OUTPUT); 71 pinMode(Warmer, OUTPUT); 72 pinMode(back, INPUT); 73 pinMode(next, INPUT); 74 pinMode(select, INPUT); 75 pinMode(up, INPUT); 76 pinMode(down, INPUT); 77 78 pinMode(buzzer, OUTPUT); 79 digitalWrite(buzzer, LOW); 80 81 digitalWrite(Fan_1, LOW); 82 digitalWrite(Warmer, LOW); 83 84 lcd.begin(20, 4); // initialize the lcd for 20 chars 4 lines and turn on backlight 85 lcd.backlight(); 86 menuScreen_0(); 87 menuScreen_1(); 88 RTC.adjust(DateTime(__DATE__, __TIME__)); 89 // Check to see if the RTC is keeping time. If it is, load the time from your computer. 90 if (! RTC.isrunning()) { 91 lcd.print("Change clock battery"); 92 // This will reflect the time that your sketch was compiled 93 RTC.adjust(DateTime(__DATE__, __TIME__)); 94 } 95} 96 97void loop() 98{ 99 currentMillis = millis(); 100 buttonState(); 101 102 switch (menuScreen) { 103 case 0: 104 menuScreen_UseAlarm(); 105 break; 106 case 1: 107 menuScreen_SetAlarm(); 108 break; 109 case 2: 110 menuScreen_Mode(); 111 break; 112 case 3: 113 Screen_Auto_intro(); 114 break; 115 case 4: 116 menuScreen_Temp(); 117 break; 118 case 5: 119 Alarms(); 120 currentMillis = millis(); 121 if (currentMillis - previousMillis > interval) { 122 previousMillis = currentMillis; 123 Screen_Auto(); 124 } 125 break; 126 case 6: 127 Alarms(); 128 currentMillis = millis(); 129 if (currentMillis - previousMillis > interval) { 130 previousMillis = currentMillis; 131 Screen_Manual(); 132 } 133 break; 134 } 135 136} 137 138 139void mainScreen() 140{ 141 currentMillis_1 = millis(); 142 143 lcd.setCursor(0, 0); 144 lcd.print("Baby T "); lcd.print(averageTemp(), 1); lcd.print((char)223); //lcd.print("C"); 145 lcd.setCursor(13, 0); 146 lcd.print("WarmerT"); 147 lcd.setCursor(0, 1); 148 lcd.print("Case T "); lcd.print(templm35_1(), 1); lcd.print((char)223); // Temp case lm35 1 149 lcd.setCursor(14, 1); 150 lcd.print(templm35_2(), 1); lcd.print((char)223); // Temp warmer lm35 2 151 lcd.setCursor(0, 2); 152 lcd.print("Cham T "); 153 if (currentMillis_1 - previousMillis_1 > interval_1) { // Importante para dar ciclo de espera a los sensores de humidificacion 154 previousMillis_1 = currentMillis_1; lcd.print(DHT22TempRead_1(), 1); lcd.print((char)223); 155 } 156 lcd.setCursor(0, 3); 157 lcd.print("Man. mode"); 158 RelojParaPantallaSerial(); 159 160 161} 162 163void RelojParaPantallaSerial() 164{ 165 DateTime now = RTC.now(); 166 lcd.setCursor(12, 3); 167 if (now.hour() < 10 ) { 168 lcd.print("0"); 169 lcd.print(now.hour(), DEC); 170 } 171 else { 172 lcd.print(now.hour(), DEC); 173 } 174 lcd.print(':'); 175 if (now.minute() < 10) { 176 lcd.print("0"); 177 lcd.print(now.minute(), DEC); 178 } 179 else { 180 lcd.print(now.minute(), DEC); 181 } 182 lcd.print(':'); 183 if (now.second() < 10) { 184 lcd.print("0"); 185 lcd.print(now.second()); 186 } 187 else { 188 lcd.print(now.second(), DEC); 189 } 190} 191 192void DHT22Sensor_1() // DHT22 sampling rate is 0.5HZ. 193{ 194 count_1 ++; 195 if (count_1 > 1) { //Sets counting of 2 seconds 196 count_1 = 0; 197 byte temperature_1 = 0; 198 byte humidity_1 = 0; 199 int err_1 = dht22_1.read(pin1DHT22, &temperature_1, &humidity_1, NULL); 200 if (err_1 != SimpleDHTErrSuccess) { 201 errorSense_1 ++; 202 if (errorSense_1 > 2) { // Here we set the number of errors allowed untill display an error 203 lcd.setCursor(10, 2); 204 lcd.print("Error"); lcd.print(err_1); delay(1000); 205 return; 206 } 207 return; 208 } 209 errorSense_1 = 0; // Reset the counter if the errors in a row are not higher than errors allowed untill display an error 210 DHT22Temp_1 = ((int)temperature_1); 211 count_1 = 0; 212 } 213} 214 215int DHT22TempRead_1() 216{ 217 DHT22Sensor_1(); 218 return DHT22Temp_1; 219} 220 221float temperature_Neonate() // CREAR ERROR DE TEMP 222{ 223 float val1 = 0; 224 for (int i = 0; i < 5; i++) { 225 val1 = val1 + analogRead(inPinTh_1); 226 delay(2); 227 } 228 Temp2_Neonate = val1 / 5; 229 return Temp2_Neonate; 230} 231 232float templm35_1() 233{ 234 float val2 = 0; 235 for (int i = 0; i < 5; i++) { 236 val2 = val2 + analogRead(tempPin_1); 237 delay(2); 238 } 239 lm35_1 = val2 / 5; 240 lm35_1 = mapf(lm35_1, 284.5, 323, 30, 37); 241 return lm35_1; 242} 243 244float templm35_2() 245{ 246 float val3 = 0; 247 for (int i = 0; i < 5; i++) { 248 val3 = val3 + analogRead(tempPin_2); 249 delay(2); 250 } 251 lm35_2 = val3 / 5; 252 lm35_2 = mapf(lm35_2, 284.5, 323, 30, 37); 253 return lm35_2; 254} 255 256double mapf(double x, double in_min, double in_max, double out_min, double out_max) 257{ 258 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; 259} 260 261float averageTemp() // Average was with two thermometers 262{ 263 averageTemp_Neonate = temperature_Neonate(); 264 averageTemp_Neonate = mapf(averageTemp_Neonate, 284.5, 323, 30, 37); 265 return averageTemp_Neonate; 266} 267 268int int_templm35_1() 269{ 270 int intlm35_1 = templm35_1(); 271 return intlm35_1; 272} 273 274int int_tempcase() 275{ 276 int int_templm35_1_0 = templm35_1() * 10; 277 return int_templm35_1_0; 278} 279 280int int_templm35_2() 281{ 282 int intlm35_2 = templm35_2(); 283 return intlm35_2; 284} 285 286int int_templm35_2_0() 287{ 288 int int_templm35_2_0 = templm35_2() * 10; 289 return int_templm35_2_0; 290} 291 292 293//////////////////////////////////////////////////// 294 295void menuScreen_0 () 296{ 297 lcd.setCursor(0, 1); 298 lcd.print(" The Baby Warmer."); 299 delay(1000); 300 lcd.setCursor(0, 3); 301 lcd.print("Welcome!"); 302 delay(500); 303 lcd.setCursor(15, 3); 304 lcd.print("V 1.3"); 305 delay(1000); 306 lcd.clear(); 307} 308 309void menuScreen_1() 310{ 311 lcd.setCursor(0, 0); 312 lcd.print("The following menu"); 313 lcd.setCursor(0, 1); 314 lcd.print("will help you to set"); 315 lcd.setCursor(0, 2); 316 lcd.print("the incubator system"); 317 delay(3000); 318 lcd.clear(); 319} 320 321void menuScreen_UseAlarm() 322{ 323 switch (menuScreenUseAlarm) { 324 case 0: 325 lcd.setCursor(0, 0); 326 lcd.print("Activate neonate"); 327 lcd.setCursor(0, 1); 328 lcd.print("temp. alarm?"); 329 if (modeAlarm == 0) { 330 lcd.setCursor(0, 2); 331 lcd.print("->"); 332 } 333 else if (modeAlarm == 1) { 334 lcd.setCursor(0, 3); 335 lcd.print("->"); 336 } 337 lcd.setCursor(2, 2); 338 lcd.print("No"); 339 lcd.setCursor(2, 3); 340 lcd.print("Yes"); 341 if (back) { 342 back = 0; 343 } 344 else if (next) { 345 if (modeAlarm == 0) { 346 menuScreen = 2; 347 } 348 else if (modeAlarm == 1) { 349 menuScreen = 1; 350 } 351 lcd.clear(); 352 delay(500); 353 next = 0; 354 } 355 else if (select) { 356 if (modeAlarm == 0) { 357 menuScreen = 2; 358 } 359 else if (modeAlarm == 1) { 360 menuScreen = 1; 361 } 362 lcd.clear(); 363 delay(500); 364 select = 0; 365 } 366 else if (up) { 367 modeAlarm = modeAlarm - 1; 368 if (modeAlarm < 0) { 369 modeAlarm = 1; 370 } 371 delay(100); 372 lcd.setCursor(0, 2); 373 lcd.print(" "); 374 lcd.setCursor(0, 3); 375 lcd.print(" "); 376 up = 0; 377 } 378 else if (down) { 379 modeAlarm = modeAlarm + 1; 380 if (modeAlarm > 1) { 381 modeAlarm = 0; 382 } 383 delay(100); 384 lcd.setCursor(0, 2); 385 lcd.print(" "); 386 lcd.setCursor(0, 3); 387 lcd.print(" "); 388 down = 0; 389 } 390 break; 391 } 392} 393 394void menuScreen_SetAlarm() 395{ 396 switch (menuScreenTempAlarm) { 397 case 0: 398 lcd.setCursor(0, 0); 399 lcd.print("Set the upper range"); 400 lcd.setCursor(0, 1); 401 lcd.print("T="); 402 lcd.setCursor(3, 1); 403 lcd.print(upperTempAlarm, 1); 404 lcd.print((char)223); 405 lcd.print("C"); 406 lcd.setCursor(0, 2); 407 lcd.print("Press select to"); 408 lcd.setCursor(0, 3); 409 lcd.print("continue..."); 410 if (back) { 411 back = 0; 412 lcd.clear(); 413 delay(500); 414 menuScreen = 0; 415 } 416 else if (next) { 417 lowerTempCompAlarm = upperTempAlarm - 0.5; 418 lowerTempAlarm = upperTempAlarm - 0.5; 419 menuScreenTempAlarm = 1; 420 lcd.clear(); 421 delay(500); 422 next = 0; 423 } 424 else if (select) { 425 lowerTempCompAlarm = upperTempAlarm - 0.5; 426 lowerTempAlarm = upperTempAlarm - 0.5; 427 menuScreenTempAlarm = 1; 428 lcd.clear(); 429 delay(500); 430 select = 0; 431 } 432 else if (up) { 433 if (int_upperTempAlarm() >= 375) { 434 upperTempAlarm = 37.5; 435 lcd.setCursor(9, 1); 436 lcd.print(" MAX TEMP"); 437 delay(1000); 438 lcd.setCursor(9, 1); 439 lcd.print(" "); 440 return; 441 } 442 upperTempAlarm = upperTempAlarm + 0.1; 443 lcd.setCursor(3, 1); 444 lcd.print(upperTempAlarm, 1); 445 up = 0; 446 } 447 else if (down) { 448 if (int_upperTempAlarm() <= 320) { 449 upperTempAlarm = 32; 450 lcd.setCursor(10, 1); 451 lcd.print("MIN RANGE"); 452 delay(1000); 453 lcd.setCursor(9, 1); 454 lcd.print(" "); 455 return; 456 } 457 upperTempAlarm = upperTempAlarm - 0.1; 458 lcd.setCursor(3, 1); 459 lcd.print(upperTempAlarm, 1); 460 down = 0; 461 } 462 break; 463 464 465 case 1: 466 lcd.setCursor(0, 0); 467 lcd.print("Set the lower range"); 468 lcd.setCursor(0, 1); 469 lcd.print("T="); 470 lcd.setCursor(3, 1); 471 lcd.print(lowerTempAlarm, 1); 472 lcd.print((char)223); 473 lcd.print("C"); 474 lcd.setCursor(0, 2); 475 lcd.print("Press select to"); 476 lcd.setCursor(0, 3); 477 lcd.print("continue..."); 478 479 if (back) { 480 menuScreenTempAlarm = 0; 481 lcd.clear(); 482 delay(200); 483 back = 0; 484 } 485 else if (next) { 486 menuScreenTempAlarm = 2; 487 next = 0; 488 lcd.clear(); 489 delay(500); 490 } 491 else if (select) { 492 menuScreenTempAlarm = 2; 493 select = 0; 494 lcd.clear(); 495 delay(500); 496 } 497 else if (up) { 498 if (int_lowerTempAlarm() >= (int_upperTempAlarm() - 5)) { 499 lowerTempAlarm = lowerTempCompAlarm; 500 lcd.setCursor(9, 1); 501 lcd.print(" MIN RANGE"); 502 delay(1000); 503 lcd.setCursor(9, 1); 504 lcd.print(" "); 505 return; 506 } 507 lowerTempAlarm = lowerTempAlarm + 0.1; 508 lcd.setCursor(3, 1); 509 lcd.print(lowerTempAlarm, 1); 510 up = 0; 511 } 512 else if (down) { 513 if (int_lowerTempAlarm() <= 280) { 514 lowerTempAlarm = 28; 515 lcd.setCursor(10, 1); 516 lcd.print("MIN TEMP"); 517 delay(1000); 518 lcd.setCursor(9, 1); 519 lcd.print(" "); 520 return; 521 } 522 lowerTempAlarm = lowerTempAlarm - 0.1; 523 lcd.setCursor(3, 1); 524 lcd.print(lowerTempAlarm, 1); 525 down = 0; 526 } 527 break; 528 529 case 2: 530 lcd.setCursor(0, 0); 531 lcd.print("Upper limit: "); 532 lcd.setCursor(0, 1); 533 lcd.print("T="); 534 lcd.setCursor(3, 1); 535 lcd.print(upperTempAlarm, 1); 536 lcd.print((char)223); 537 lcd.print("C"); 538 lcd.setCursor(0, 2); 539 lcd.print("Lower limit:"); 540 lcd.setCursor(0, 3); 541 lcd.print("T="); 542 lcd.setCursor(3, 3); 543 lcd.print(lowerTempAlarm, 1); 544 lcd.print((char)223); 545 lcd.print("C"); 546 lcd.setCursor(9, 3); 547 lcd.print(" Continue?"); 548 if (back) { 549 menuScreenTempAlarm = 1; 550 lcd.clear(); 551 delay(200); 552 back = 0; 553 } 554 else if (next) { 555 menuScreen = 2; 556 next = 0; 557 lcd.clear(); 558 delay(500); 559 } 560 else if (select) { 561 menuScreen = 2; 562 select = 0; 563 lcd.clear(); 564 delay(500); 565 } 566 else if (up) { 567 up = 0; 568 } 569 else if (down) { 570 down = 0; 571 } 572 } 573 574} 575 576void menuScreen_Mode() 577{ 578 switch (menuScreenMode) { 579 case 0: 580 lcd.setCursor(0, 0); 581 lcd.print("Select the mode:"); 582 583 if (mode == 0) { 584 lcd.setCursor(0, 2); 585 lcd.print("->"); 586 } 587 else if (mode == 1) { 588 lcd.setCursor(0, 3); 589 lcd.print("->"); 590 } 591 lcd.setCursor(2, 2); 592 lcd.print("Skin mode aut."); 593 lcd.setCursor(2, 3); 594 lcd.print("Temp setting man."); 595 if (back) { 596 back = 0; 597 lcd.clear(); 598 delay(500); 599 menuScreenTempAlarm = 0; 600 menuScreen = 0; 601 } 602 else if (next) { 603 if (mode == 0) { 604 menuScreen = 3; 605 } 606 else if (mode == 1) { 607 menuScreen = 4; 608 } 609 lcd.clear(); 610 delay(500); 611 next = 0; 612 } 613 else if (select) { 614 if (mode == 0) { 615 menuScreen = 3; 616 } 617 else if (mode == 1) { 618 menuScreen = 4; 619 } 620 lcd.clear(); 621 delay(500); 622 select = 0; 623 } 624 else if (up) { 625 mode = mode - 1; 626 if (mode < 0) { 627 mode = 1; 628 } 629 delay(100); 630 lcd.setCursor(0, 2); 631 lcd.print(" "); 632 lcd.setCursor(0, 3); 633 lcd.print(" "); 634 up = 0; 635 } 636 else if (down) { 637 mode = mode + 1; 638 if (mode > 1) { 639 mode = 0; 640 } 641 delay(100); 642 lcd.setCursor(0, 2); 643 lcd.print(" "); 644 lcd.setCursor(0, 3); 645 lcd.print(" "); 646 down = 0; 647 } 648 break; 649 } 650} 651 652void Screen_Auto_intro() 653{ 654 lcd.setCursor(0, 0); 655 lcd.print("This mode will try"); 656 lcd.setCursor(0, 1); 657 lcd.print("to stabilize the"); 658 lcd.setCursor(0, 2); 659 lcd.print("neonate temperature"); 660 lcd.setCursor(0, 3); 661 lcd.print("between 36.5 & 37.3"); 662 delay(3000); 663 lcd.clear(); 664 lcd.setCursor(0, 0); 665 lcd.print("The supervision of"); 666 lcd.setCursor(0, 1); 667 lcd.print("the neonate is "); 668 lcd.setCursor(0, 2); 669 lcd.print("mandatory at small"); 670 lcd.setCursor(0, 3); 671 lcd.print("lapses. 5~10 mins"); 672 delay(3000); 673 lcd.clear(); 674 menuScreen = 5; 675} 676 677void menuScreen_Temp() 678{ 679 680 switch (menuScreenTemp) { 681 case 0: 682 lcd.setCursor(0, 0); 683 lcd.print("Set the upper range"); 684 lcd.setCursor(0, 1); 685 lcd.print("T="); 686 lcd.setCursor(3, 1); 687 lcd.print(upperTemp, 1); 688 lcd.print((char)223); 689 lcd.print("C"); 690 lcd.setCursor(0, 2); 691 lcd.print("Press select to"); 692 lcd.setCursor(0, 3); 693 lcd.print("continue..."); 694 if (back) { 695 back = 0; 696 menuScreen = 0; 697 } 698 else if (next) { 699 lowerTempComp = upperTemp - 1; 700 lowerTemp = upperTemp - 1; 701 menuScreenTemp = 1; 702 lcd.clear(); 703 delay(500); 704 next = 0; 705 } 706 else if (select) { 707 lowerTempComp = upperTemp - 1; 708 lowerTemp = upperTemp - 1; 709 menuScreenTemp = 1; 710 lcd.clear(); 711 delay(500); 712 select = 0; 713 } 714 else if (up) { 715 if (int_upperTemp() >= 370) { 716 upperTemp = 37; 717 lcd.setCursor(9, 1); 718 lcd.print(" MAX TEMP"); 719 delay(1000); 720 lcd.setCursor(9, 1); 721 lcd.print(" "); 722 return; 723 } 724 upperTemp = upperTemp + 0.1; 725 lcd.setCursor(3, 1); 726 lcd.print(upperTemp, 1); 727 up = 0; 728 } 729 else if (down) { 730 if (int_upperTemp() <= 310) { 731 upperTemp = 31; 732 lcd.setCursor(10, 1); 733 lcd.print("MIN RANGE"); 734 delay(1000); 735 lcd.setCursor(9, 1); 736 lcd.print(" "); 737 return; 738 } 739 upperTemp = upperTemp - 0.1; 740 lcd.setCursor(3, 1); 741 lcd.print(upperTemp, 1); 742 down = 0; 743 } 744 break; 745 746 747 case 1: 748 lcd.setCursor(0, 0); 749 lcd.print("Set the lower range"); 750 lcd.setCursor(0, 1); 751 lcd.print("T="); 752 lcd.setCursor(3, 1); 753 lcd.print(lowerTemp, 1); 754 lcd.print((char)223); 755 lcd.print("C"); 756 lcd.setCursor(0, 2); 757 lcd.print("Press select to"); 758 lcd.setCursor(0, 3); 759 lcd.print("continue..."); 760 761 if (back) { 762 menuScreenTemp = 0; 763 lcd.clear(); 764 delay(200); 765 back = 0; 766 } 767 else if (next) { 768 menuScreenTemp = 2; 769 next = 0; 770 lcd.clear(); 771 delay(500); 772 } 773 else if (select) { 774 menuScreenTemp = 2; 775 select = 0; 776 lcd.clear(); 777 delay(500); 778 } 779 else if (up) { 780 if (int_lowerTemp() >= (int_upperTemp() - 10)) { 781 lowerTemp = lowerTempComp; 782 lcd.setCursor(9, 1); 783 lcd.print(" MIN RANGE"); 784 delay(1000); 785 lcd.setCursor(9, 1); 786 lcd.print(" "); 787 return; 788 } 789 lowerTemp = lowerTemp + 0.1; 790 lcd.setCursor(3, 1); 791 lcd.print(lowerTemp, 1); 792 up = 0; 793 } 794 else if (down) { 795 if (int_lowerTemp() <= 300) { 796 lowerTemp = 30; 797 lcd.setCursor(10, 1); 798 lcd.print("MIN TEMP"); 799 delay(1000); 800 lcd.setCursor(9, 1); 801 lcd.print(" "); 802 return; 803 } 804 lowerTemp = lowerTemp - 0.1; 805 lcd.setCursor(3, 1); 806 lcd.print(lowerTemp, 1); 807 down = 0; 808 } 809 break; 810 811 case 2: 812 lcd.setCursor(0, 0); 813 lcd.print("Upper limit: "); 814 lcd.setCursor(0, 1); 815 lcd.print("T="); 816 lcd.setCursor(3, 1); 817 lcd.print(upperTemp, 1); 818 lcd.print((char)223); 819 lcd.print("C"); 820 lcd.setCursor(0, 2); 821 lcd.print("Lower limit:"); 822 lcd.setCursor(0, 3); 823 lcd.print("T="); 824 lcd.setCursor(3, 3); 825 lcd.print(lowerTemp, 1); 826 lcd.print((char)223); 827 lcd.print("C"); 828 lcd.setCursor(9, 3); 829 lcd.print(" Continue?"); 830 if (back) { 831 menuScreenTemp = 1; 832 lcd.clear(); 833 delay(200); 834 back = 0; 835 } 836 else if (next) { 837 menuScreen = 6; 838 next = 0; 839 lcd.clear(); 840 delay(500); 841 } 842 else if (select) { 843 menuScreen = 6; 844 select = 0; 845 lcd.clear(); 846 delay(500); 847 } 848 else if (up) { 849 up = 0; 850 } 851 else if (down) { 852 down = 0; 853 } 854 } 855 856} 857 858void Screen_Auto() { 859 Screen_Auto_S(); 860 warmerParameters_Auto(); 861} 862 863void Screen_Auto_S() 864{ 865 currentMillis_1 = millis(); 866 867 lcd.setCursor(0, 0); 868 lcd.print("Baby T "); lcd.print(averageTemp(), 1); lcd.print((char)223); //lcd.print("C"); 869 lcd.setCursor(13, 0); 870 lcd.print("WarmerT"); 871 lcd.setCursor(0, 1); 872 lcd.print("Case T "); lcd.print(templm35_1(), 1); lcd.print((char)223); // Temp case lm35 1 873 lcd.setCursor(14, 1); 874 lcd.print(templm35_2(), 1); lcd.print((char)223); // Temp warmer lm35 2 875 lcd.setCursor(0, 2); 876 lcd.print("Purs Baby T "); 877 lcd.print("37.3"); lcd.print((char)223); 878 lcd.setCursor(0, 3); 879 lcd.print("Aut. mode"); 880 RelojParaPantallaSerial(); 881 882 883 884} 885 886void Screen_Manual() 887{ 888 mainScreen(); 889 warmerParameters_Manual(); 890} 891 892void warmerParameters_Auto() 893{ 894 switch (manualSettings) { 895 case 0: 896 if (int_tempcase() <= int_lowerTemp()) { 897 digitalWrite(Warmer, HIGH); 898 } 899 else if (int_tempcase() > int_lowerTemp()) { 900 manualSettings++; 901 digitalWrite(Warmer, LOW); 902 } 903 904 case 1: 905 if (int_tempcase() <= pursuedLowerT) { 906 digitalWrite(Warmer, HIGH); 907 delay(400); 908 digitalWrite(Warmer, LOW); 909 delay(300); 910 } 911 else if (int_tempcase() >= pursuedHigherT) { 912 digitalWrite(Warmer, LOW); 913 digitalWrite(Fan_1, HIGH); 914 myservo.write(122); //Para flujo sobrecalentado 915 delay(2500); //Variable de tiempo de enfriamiento, a mas tiempo, mas frio 916 digitalWrite(Fan_1, LOW); 917 myservo.write(70); 918 delay(1000); 919 } 920 } 921} 922 923void warmerParameters_Manual() 924{ 925 switch (manualSettings) { 926 case 0: 927 if (int_tempcase() <= int_lowerTemp()) { 928 digitalWrite(Warmer, HIGH); 929 930 } 931 else if (int_tempcase() > int_lowerTemp()) { 932 manualSettings++; 933 digitalWrite(Warmer, LOW); 934 } 935 936 case 1: 937 if (int_tempcase() <= int_upperTemp()) { 938 digitalWrite(Warmer, HIGH); 939 delay(400); 940 digitalWrite(Warmer, LOW); 941 delay(300); 942 } 943 else if (int_tempcase() >= int_upperTemp()) { 944 digitalWrite(Warmer, LOW); 945 digitalWrite(Fan_1, HIGH); 946 myservo.write(122); //Para flujo sobrecalentado 947 delay(2500); //Variable de tiempo de enfriamiento, a mas tiempo, mas frio 948 digitalWrite(Fan_1, LOW); 949 myservo.write(70); 950 delay(1000); 951 } 952 } 953} 954 955void Alarms() 956{ 957 if (modeAlarm == 1) 958 { 959 if (averageTemp() < lowerTempAlarm || averageTemp() > upperTempAlarm) 960 { 961 digitalWrite(buzzer, HIGH); 962 delay(150); 963 digitalWrite(buzzer, LOW); 964 delay(100); 965 966 } 967 } 968 else { 969 digitalWrite(buzzer, LOW); 970 } 971} 972 973void buttonState() 974{ 975 back = digitalRead(button1); 976 next = digitalRead(button2); 977 select = digitalRead(button3); 978 up = digitalRead(button4); 979 down = digitalRead(button5); 980 981 if (back == HIGH) { 982 delay(150); 983 } 984 985 if (next == HIGH) { 986 delay(150); 987 } 988 989 if (select == HIGH) { 990 delay(150); 991 } 992 993 if (up == HIGH) { 994 delay(150); 995 } 996 997 if (down == HIGH) { 998 delay(150); 999 } 1000} 1001 1002int int_upperTemp() 1003{ 1004 int int_upperTemp = upperTemp * 10; 1005 return int_upperTemp; 1006} 1007 1008int int_lowerTemp() 1009{ 1010 int int_lowerTemp = lowerTemp * 10; 1011 return int_lowerTemp; 1012} 1013 1014int int_midleRangeTemp() 1015{ 1016 int int_midleRangeTemp = midleRangeTemp * 10; 1017 return int_midleRangeTemp; 1018} 1019 1020int int_coefWarmer() 1021{ 1022 int int_coefWarmer = coefWarmer * 10; 1023 return int_coefWarmer; 1024} 1025 1026int int_upperTempAlarm() 1027{ 1028 int int_upperTempAlarm = upperTempAlarm * 10; 1029 return int_upperTempAlarm; 1030} 1031 1032int int_lowerTempAlarm() 1033{ 1034 int int_lowerTempAlarm = lowerTempAlarm * 10; 1035 return int_lowerTempAlarm; 1036}
Downloadable files
Amplification stages and voltage follower
Voltage follower is used to have better signal from thermistors and the OpAmps to expand the Lm35 readable range in Arduino
Amplification stages and voltage follower
Power control of fans and ceramic warmer
Power control of fans and ceramic warmer
5-button module
Here is a simple 5-button controller
5-button module
Simplified diagram
This diagram content the following: 1. 220V cable 2. Power source 220v to 24V @ 4A 3. Arduino Nano 4. I2C 20x4 LCD 5. Power controller for fans and warmer 6. 5-button control 7. Ceramic warmer 8. Lm 35 temperature sensor 9. DHT22 humidity and temperature sensor 10. 12V computer fan 11. Small servo motor. 12. Big plastic box
Simplified diagram
Arduino diagram
The Arduino connections to peripherals.
Arduino diagram
Arduino diagram
The Arduino connections to peripherals.
Arduino diagram
Simplified diagram
This diagram content the following: 1. 220V cable 2. Power source 220v to 24V @ 4A 3. Arduino Nano 4. I2C 20x4 LCD 5. Power controller for fans and warmer 6. 5-button control 7. Ceramic warmer 8. Lm 35 temperature sensor 9. DHT22 humidity and temperature sensor 10. 12V computer fan 11. Small servo motor. 12. Big plastic box
Simplified diagram
5-button module
Here is a simple 5-button controller
5-button module
Amplification stages and voltage follower
Voltage follower is used to have better signal from thermistors and the OpAmps to expand the Lm35 readable range in Arduino
Amplification stages and voltage follower
Power control of fans and ceramic warmer
Power control of fans and ceramic warmer
Power management
The two independent lines were made experimentally to check if the helped to avoid some noises, but they did not :) So you can use just one.
Power management
Comments
Only logged in users can leave comments
pablo_232
0 Followers
•0 Projects
Table of contents
Intro
11
0