Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - LFC

#1
สวัสดีครับพอดีผมหัดใช้ Arduino ไม่นานเท่าไร แล้วลองหัดเขียนการแสดงผลอุณหภูมิ DS18B20 แสดงผลด้วย 7 Segment โดยใช้ไอซีชิปรีจิสเตอร์ 74HC595ในการเลื่อนบิต สามารถแสดงอุณหภุมิได้ตามเป้าหมายครับ แต่ติดตรงการแสดงผลครับมันแสดงผลแบบกระพริบๆ ซึ่งปกติมันจะกระพริบจนตาเราไม่สามารถเห็น แต่นี่ยังเห็นว่ากระพริบครับ ตาม Source Code ด้านล่างครับ ผมขอคำแนะนำด้วยครับ ขอบคุณครับ

#include <OneWire.h>
int DS18S20_Pin = 2;      //DS18S20 Signal pin on digital 2
OneWire ds(DS18S20_Pin);  // on digital pin 2
const int digitPins[4] = {8,9,10,11};  //4 common anode pins of the display
const int latchPin = 5;    //74HC595 Pin 12
const int dataPin = 6;     //74HC595 Pin 14
const int clockPin = 7;    //74HC595 Pin 11
const byte digit[10] =     //seven segment digits in bits
{
  B00111111, //0
  B00000110, //1
  B01011011, //2
  B01001111, //3
  B01100110, //4
  B01101101, //5
  B01111101, //6
  B00000111, //7
  B01111111, //8
  B01101111  //9
};
int digitBuffer[4] = {0};
int digitScan = 0, flag=0,  soft_scaler = 0;
float tempC;

float getTemp()
{
  //returns the temperature from one DS18S20 in DEG Celsius
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr))
  {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7])
  {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28)
  {
      Serial.print("Device is not recognized");
      return -1000;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE); // Read Scratchpad

  for (int i = 0; i < 9; i++)
  { // we need 9 bytes
    data = ds.read();
  }
 
  ds.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
}

void setup()
{               
  //Serial.begin(9600);
  for(int i=0;i<4;i++)
  {
    pinMode(digitPins,OUTPUT);
  }
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
}
//writes the temperature on display
void updateDisp()
{
  for(byte j=0; j<4; j++) 
    digitalWrite(digitPins[j], LOW);

  digitalWrite(latchPin, LOW); 
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  digitalWrite(latchPin, HIGH);
 
  //delay(1);
  delayMicroseconds(1);
  digitalWrite(digitPins[digitScan], HIGH);

  digitalWrite(latchPin, LOW); 
  if(digitScan==2)
    shiftOut(dataPin, clockPin, MSBFIRST, ~(digit[digitBuffer[digitScan]] | B10000000)); //print the decimal point on the 3rd digit
  else
    shiftOut(dataPin, clockPin, MSBFIRST, ~digit[digitBuffer[digitScan]]);

  digitalWrite(latchPin, HIGH);
  digitScan++;
  if(digitScan>3) digitScan=0;
}

void loop()
{
  float temperature = getTemp();
  // Serial.println(temperature); 
  //tempF = ((tempK - 2.5) * 9 / 5) - 459.67;
  //Celsius temperature display
  tempC = int(temperature*100);
  digitBuffer[3] = int(tempC)/1000;
  digitBuffer[2] = (int(tempC)%1000)/100;
  digitBuffer[1] = (int(tempC)%100)/10;
  digitBuffer[0] = (int(tempC)%100)%10;
  updateDisp();
  //delay(1);
  //delayMicroseconds(1);
 
}
#2
คำสั่ง t.update(); ใน Example ของ TIMER  มันหมายถึงอะไรอะครับ ผมงงมาก ขอรบกวนพี่ๆช่วยตอบหน่อยนะครับ ขอบคุณครับ

void loop(void)
{
    t.update();
}
#3
สวัสดีครับพอดีผมอยากจะเขียนนาฬิกาโดยไม่ใช้ไอซีฐานเวลา (DS1307) อะครับ พอจะมีแนวทางในการเขียนอย่างไรบ้างครับ ผมมือใหม่ครับ รบกวนพี่ๆหน่อยนะครับ
#4
แสดงผลได้แล้วนะครับ คุณ ackerman_von 
ต้องขอบคุณที่แนะนำ :) :) :)
#5
รูปในโปรแกรมม
#6
นี่รูปครับ
#7
Thank you very much. I'm trying.
#8
ผมเขียนโปรแกรมด้วย 16F628 เพื่อให้แสดงผลที่ LCD 16x2 แต่ตอนลดลองใน โปรติอุส มันก็แสดงผลครับ แต่ตอนลงวงจรจิงๆ มันไม่แสดงผลอะครับ VR  ก็ต่อแล้ว ช่วยพี่ๆ ให้คำแนะนำหน่อยนะครับ ขอบคุณครับ ^^