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
#include <Wire.h>              // requerido para dispositivos I2C
#include <Adafruit_GFX.h>      // libraría Adafruit
#include <Adafruit_SSD1306.h>  // driver para SSD1306
 
#define OLED_RESET  4    // pin de reset
Adafruit_SSD1306 display(OLED_RESET);
 
// definir pin analogico al que va conectado LM35
#define  LM35_pin  A0
const int buzzer=12;
volatile int press_sw=0;

void setup(void){
    Serial.begin(9600);
    delay(1000);  // esperar un segundo
    DDRB=0x10;//buzzer como salida
    DDRD=0x0;
  	PORTD=0x4;
 	  //Interrupt settings  
    EIMSK = 0;
    EICRA = 0;
    EIMSK = 0b11;//habilitación
    EICRA = 0b1111;//INT0 e INT1 en rising
    sei();//habilitar interrupciones globales
    analogReference(INTERNAL);  // setear voltaje positivo para 1.1V
  
    // inicializar SSD1306 con dirección I2C = 0x3D
    display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  
    // vaciar SSD1306 buffer.
    display.clearDisplay();
  
    display.setTextSize(1);   // tamaño del texto = 1
    display.setTextColor(WHITE, BLACK);  // setear color texto a fondo blanco y negro
    display.setCursor(15, 0);            // mover cursor a la posición (15, 0) pixel
    display.print("Temperatura corporal:");
    display.display();        // actualizar SSD1306
    display.setTextSize(2);   // tamaño del texto = 2
}
 
int tCelsius;
char _buffer[8];
 
void loop(){    
  if(press_sw==1){
    // leear voltaje analógico
    //   9.3 = 1023/(1.1*100) 
    tCelsius = (5.0 * analogRead(LM35_pin) * 100.0)/1024.0;
  
    // imprimir temperatura en grados celcios 
    if(tCelsius>=38.0){
        delay(500);
        alarma();
        sprintf(_buffer, "%.1s C", tCelsius);
    }
    if(tCelsius<=35.0){
        delay(500);
        alarma();
        sprintf(_buffer, "%.1s C", tCelsius);
      }else{
        delay(500);
        sprintf(_buffer, "%.1s C", tCelsius);
      }
    display.setCursor(23, 10);
    display.print(_buffer); 
    // print degree symbols ( ° )
    display.drawCircle(88, 12, 2, WHITE);
  
    // actualzar el display
    display.display();
  
    delay(1000);  // esperar un segundo
  }
}

ISR(INT0_vect){
	press_sw++;
}

void alarma(){
	  digitalWrite(buzzer,LOW);
    delay(2000);
    digitalWrite(buzzer,HIGH);
    delay(2000);
}