Öncelikle bu uygulama için gerekli malzemeler:
- Arduino Uno
- LCD 16x2
- SHT11 Nem ve Sıcaklıklık Sensörü
- USB kablosu , 1 adet POT , 10k direnç
- Gobetwino programı
Öncelikle elimizdeki LCD tipine göre lcd bağlantısını arduino pinlerine yapmamız gerekiyor. Arduino CC adresinde hangi pinlerin nereye bağlandığına dair bilgiler mevcut olduğundan burda ona girmiyorum.
Gelelim SHT 11 in bağlantısına :
Data ve SCK bağlantısını sırasıyla pin9 ve pin8 yapıldı.
Arduino'muzun USB bağlantısını da yaptıktan sonra gelelim koduna, tamamı :
// hello world example'dan hareket edildi.
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int temperatureCommand = B00000011; // command used to read temperature
int humidityCommand = B00000101; // command used to read humidity
int clockPin = 8; // pin used for clock
int dataPin = 9; // pin used for data
int ack; // track acknowledgment for errors
int val;
float temperature;
float humidity;
char buffer[5];
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
// lcd.print("hello, world!");
Serial.begin(9600); // open serial at 9600 bps
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 0);
// print the number of seconds since reset:
// lcd.print(millis()/1000);
// read the temperature and convert it to centigrades
sendCommandSHT(temperatureCommand, dataPin, clockPin);
waitForResultSHT(dataPin);
val = getData16SHT(dataPin, clockPin);
skipCrcSHT(dataPin, clockPin);
temperature = (float)val * 0.01 - 40;
//Serial.print("temperature: ");
//int t=246;
Serial.print("#S|KAYIT|[");
Serial.print(itoa((temperature), buffer, 10));
Serial.print(" ");
Serial.print(itoa((humidity), buffer, 10));
Serial.println("]#");
//Serial.print(temperature);
// Serial.print(",");
lcd.print("temp: ");
lcd.print(temperature);
// read the humidity
sendCommandSHT(humidityCommand, dataPin, clockPin);
waitForResultSHT(dataPin);
val = getData16SHT(dataPin, clockPin);
skipCrcSHT(dataPin, clockPin);
humidity = -4.0 + 0.0405 * val + -0.0000028 * val * val;
//Serial.print(" humidity: ");
//Serial.print(humidity);
// Serial.print(",");
lcd.setCursor(0, 1);
lcd.print("humi: ");
lcd.print(humidity);
delay(5000); // wait for 5 seconds for next reading
}
void sendCommandSHT(int command, int dataPin, int clockPin)
{
int ack;
// transmission start
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, LOW);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, LOW);
// shift out the command (the 3 MSB are address and must be 000, the last 5 bits are the command)
shiftOut(dataPin, clockPin, MSBFIRST, command);
// verify we get the right ACK
digitalWrite(clockPin, HIGH);
pinMode(dataPin, INPUT);
ack = digitalRead(dataPin);
if (ack != LOW)
Serial.println("ACK error 0");
digitalWrite(clockPin, LOW);
ack = digitalRead(dataPin);
if (ack != HIGH)
Serial.println("ACK error 1");
}
// wait for the SHTx answer
void waitForResultSHT(int dataPin)
{
int ack;
pinMode(dataPin, INPUT);
for (int i = 0; i < 100; ++i)
{
delay(10);
ack = digitalRead(dataPin);
if (ack == LOW)
break;
}
if (ack == HIGH)
Serial.println("ACK error 2");
}
// get data from the SHTx sensor
int getData16SHT(int dataPin, int clockPin)
{
int val;
// get the MSB (most significant bits)
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
val = shiftIn(dataPin, clockPin, MSBFIRST);
val *= 256; // this is equivalent to val << 8;
// send the required ACK
pinMode(dataPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
// get the LSB (less significant bits)
pinMode(dataPin, INPUT);
val |= shiftIn(dataPin, clockPin, MSBFIRST);
return val;
}
// skip CRC data from the SHTx sensor
void skipCrcSHT(int dataPin, int clockPin)
{
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
Kodun içindeki şu kısma dikkat edelim:
Serial.print("#S|KAYIT|[");
Serial.print(itoa((temperature), buffer, 10));
Serial.print(" ");
Serial.print(itoa((humidity), buffer, 10));
Serial.println("]#");
Buradaki yapı Gobetwino programına , onun anlayacağı biçimde sıcaklık ve nem bilgisini gönderdiğimiz yer.
Şimdi gelelim Gobetwino programına , nedir ne değildir...
Programın kendi sitesinde yapabildiklerine dair şunları söylüyor:
Programın özelliklerinden istediğimiz işlevin ayarını yapabiliyoruz . Edit command kısmından eklediğimiz özelliğe birde command name ekliyoruz . Yukarıdaki seri porta yazılan KAYIT buna gönderme yapıyor. Bunu istediğimiz gibi değiştirebiliriz . Veya istediğimiz zaman istediğimiz komut için farklı çağırma görevleri verebiliriz.· Start a program on the PC.· Start a program, and wait until it finishes, and tell Arduino it finished.· Send data to any windows program from Arduino, like it was typed on the keyboard.· Send email, optionally with an attached file.· Download a file from the internet.· Read a file and return data to Arduino.· Log data from Arduino to a file, with an optional timestamp.· Periodically check a POP3 mailbox for incoming mails and send commands from the mail to Arduino.· Get the time from the PC.· Get the date from the PC.· Ping a host or IP address.· Copy a file on the PC.
Program sorunsuz veri alırken şu şekilde görülüyor:
Ben kaydetmesi için masaüstünde save klasörü içinde save.txt adlı bir dosya belirtmiştim . Veriler geldikçe oraya baktığımda an an güncellendiğini görebiliyorum . Ayrıca belirtmeyi unuttum programın içinde verileri aldığı zamanı ve tarihi de veriyle birlikte kaydetmesi için bir seçenek bulunuyor. Ben bunu aktif etmiştim.
Şimdi gelelim excel tarafına :
Excel kısmında aldığımız verileri Excel çalışma alanına çekmemiz ve bunu her açtığımızda güncel tutmamız gerekiyor.
Bunun için ben macro yapılarını kullandım . Bunun için View bölümünden Macros > Record Macro seçeneğine gelip macro kaydetmeye başlayabiliyoruz ( Unutmamak gerek: Macro'nun her açılışta çalışması için isim olarak Auto_Open vermemiz gerekiyor). Yapılmasını istediğimiz işlemi yaptıktan (bu ne derseniz : Data menüsünden From Text seçeneğinden save.txt'yi seçmek) sonra Sol alt taraftan Stop Recording'e tıklayıp sonlandırıyoruz.
Ve uygulamamız tamamlandı..
Son olarak Excel çıkışımız :
Bu uygulamada sıkıntı olarak düşünülebilecek tek yan kayıt sırasında Gobetwino'nun açık kalacak olması.