This is an old revision of the document!
Aplicatia utilizeaza 2 Arduino Uno, care comunica prin I2C. Fiecare are rolul sau: * Slave-ul primeste temperatura de la Master si o afiseaza pe LCD. * Master-ul reprezinta efectiv alarma de temperatura.
The slave address to which this master will send data #define I2C_SLAVE_ADDRESS 0x09 The byte variable in which I2C reads from the master are performed int i; signed int aux; int temp; const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2); lcd.print("Buna ziua!"); Wire.begin(I2C_SLAVE_ADDRESS);
}
void receiveEvent(int numBytes) {
i = 3; temp = 0; while (0 <= i) { aux = Wire.read(); if (aux > 127) { aux = aux - 256; } temp = temp + pow(10, i) * aux; i--; }
}
void loop() {
Wire.onReceive(receiveEvent); if (temp != 0) { lcd.clear(); lcd.print("Temp refresh"); delay(500); lcd.clear(); lcd.print(temp / 100); lcd.print("."); lcd.print(abs(temp % 100)); lcd.print(" grade C"); delay(5000); }
}
The slave address to which this master will send data #define I2C_SLAVE_ADDRESS 0x09 Hardware interrupt time (s) #define INTERRUPT_TIME 5
KEYPAD MACROS const byte numRows = 4; number of rows on the keypad const byte numCols = 4; number of columns on the keypad keymap defines the key pressed according to the row and columns just as appears on the keypad char keymap[numRows][numCols] =
{ {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}};
Code that shows the the keypad connections to the arduino terminals byte rowPins[numRows] = {9, 8, 7, 6}; Rows 0 to 3 byte colPins[numCols] = {5, 4, 3, 2}; Columns 0 to 3 initializes an instance of the Keypad class Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols); char keypressed;
TEMPERATURE ALARM MACROS int REF_HIGH_TEMP = 24; int aux_temp; float temp; int out; float vout; float vout1; int LED = 13; int piezo = 10; int o1, o2, o3, o4; volatile bool timerFlag = false; bool temperature_set_flag = false; bool first_digit_input = false; bool second_digit_input = false; void setup() { Serial.begin(9600); pinMode(A1, INPUT); pinMode(LED, OUTPUT); pinMode(piezo, OUTPUT); Configure Timer1
cli(); // Disable interrupts TCCR1B = 0; // Clear TCCR1B register TCNT1 = 0; // Initialize counter value to 0
// Calculate the compare match value for 5 seconds at prescaler 1024 // The formula is: compareMatch = (clockFreq * interruptDuration) / prescaler - 1 // Assuming a clock frequency of 16MHz uint16_t compareMatch = ((16000000UL * INTERRUPT_TIME) / 1024) - 1;
OCR1A = compareMatch; // Set compare match value TCCR1B |= (1 << WGM12); // Set CTC mode TCCR1B |= (1 << CS12) | (1 << CS10); // Set prescaler to 1024 TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt
Wire.begin(); sei(); // Enable interrupts
}
bool isDigit(char keypressed){
if (keypressed >= 48 && keypressed <= 57) { return true; } return false;
}
void loop() {
keypressed = myKeypad.getKey(); if (keypressed == 'A') { Serial.println("Setting the ref temp"); temperature_set_flag = false; while (temperature_set_flag == false) { first_digit_input = false; second_digit_input = false; while (first_digit_input == false) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY && isDigit(keypressed)) { //transform from ascii to number aux_temp = (keypressed - 48) * 10; Serial.println(keypressed); first_digit_input = true; } }
while (second_digit_input == false) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY && isDigit(keypressed)) { aux_temp = aux_temp + (keypressed - 48); REF_HIGH_TEMP = aux_temp; Serial.println(keypressed); second_digit_input = true; } }
Serial.print("Ref temperature set to: "); Serial.println(REF_HIGH_TEMP); temperature_set_flag = true; } }
if (timerFlag) { timerFlag = false;
vout = analogRead(A1); vout1 = (vout / 1023.0) * 5000; temp = (vout1 - 500) / 10.0;
if (temp >= REF_HIGH_TEMP) { digitalWrite(LED, HIGH); digitalWrite(piezo, HIGH); } else { digitalWrite(LED, LOW); digitalWrite(piezo, LOW); }
out = temp * 100; o1 = out / 1000; o2 = (out / 100) % 10; o3 = (out / 10) % 10; o4 = out % 10;
Wire.beginTransmission(I2C_SLAVE_ADDRESS); Wire.write(o1); Wire.write(o2); Wire.write(o3); Wire.write(o4); Wire.endTransmission(); }
}
Timer1 compare match interrupt service routine ISR(TIMER1_COMPA_vect) { timerFlag = true; } \</note> ===== Rezultate Obţinute ===== <note tip> Care au fost rezultatele obţinute în urma realizării proiectului vostru. </note> ===== Concluzii ===== ===== Code Source & Documentation ===== <note> https://github.com/StefanFotin23/Smart-Temperature-Alarm-Arduino </note> ===== Bibliografie/Resurse ===== <note> Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware. </note> <html><a class=“media mediafile mf_pdf” href=”?do=export_pdf”>Export to PDF</a></html>