การอ่านค่าจาก 7 Segment

Started by HeroEng, May 02, 2013, 10:57:27 AM

Previous topic - Next topic

amaloma

ตามคุณ JENG เลยครับจบ
ได้ไม่ได้ยังไงมาคุยกันต่อ

HeroEng

ได้ลองเขียนโค้ตแล้วครับ แต่ติดปัญหาที่ตัวเลขที่ 7 กับ 0 ที่อ่านค่าไม่ได้เพราะ EEPROM เก็บค่าเกิน 255 ไม่ได้นะครับ
มีพี่ท่านใดจะแนะนำได้ไหมครับ
include <LiquidCrystal.h>
#include <EEPROM.h>
#include <EEPROMAnything.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int val1 = 0;     // variable for reading the pin status
int val2 = 0;     // variable for reading the pin status
int val3 = 0;     // variable for reading the pin status
int val4 = 0;     // variable for reading the pin status
int D1=0;
int D2=0;
int D3=0;
int D4=0;

int buttonPins[] = {A0,A1,A2,A3,A4,A5,7} ;
int buttonStates[7];     
int i;
int myInts[7];
int addr1 = 0;
int addr2 = 1;
int addr3 = 2;
int addr4 = 3;
int value1=0;
int value2=0;
int value3=0;
int value4=0;
byte mybinary;
String total="";
byte noElem = 12;
unsigned int baseAddr = 0;

void setup() {

for (i=0; i<7; i++)
{
   pinMode(buttonPins[i], INPUT);     
}
  pinMode(9,INPUT); 
  pinMode(10,INPUT);   
  pinMode(8, INPUT);
  pinMode(6, INPUT);
  lcd.begin(16, 2);
  //lcd.clear();
//lcd.print("FURUKAWA");

}

void loop() {
//  lcd.clear();
//***********************************************
int mybyte[]={111,6,91,79,102,109,124,112,127,103};
//int mybyte[]={1599,1542,1615,1638,1645,1660,1543,1663,1639,1599};
int myStr[7] ;

  val1 = digitalRead(9);  // read input value
  val2 = digitalRead(10);  // read input value
  val3 = digitalRead(8);  // read input value
  val4 = digitalRead(6);  // read input value
   for (int i=0; i<7; i++)
{
   
       buttonStates[i] = digitalRead(buttonPins[i]);
       myInts[i]=buttonStates[i];
   
}


  mybinary=myInts[0] | (myInts[1] << 1) | (myInts[2] << 2) | (myInts[3] << 3)| (myInts[4] << 4) | (myInts[5] << 5) | (myInts[6] << 6) | (myInts[7] << 7);
 
if (val1 == HIGH )
{         // check if the input is HIGH (button released)

//EEPROM_writeAnything(addr1, mybinary);
//EEPROM_readAnything(addr1, value1);

  EEPROM.write(addr1, mybinary);
value1= EEPROM.read(addr1);

}
if (val2 == HIGH)
{         // check if the input is HIGH (button released)
// EEPROM_writeAnything(addr2, mybinary);
// EEPROM_readAnything(addr2, value2);

  EEPROM.write(addr2, mybinary);
  value2= EEPROM.read(addr2);

}
if (val3 == HIGH)
{         // check if the input is HIGH (button released)
EEPROM_writeAnything(addr3, mybinary);
EEPROM_readAnything(addr3, value3);

//  EEPROM.write(addr3, mybinary);
//value3= EEPROM.read(addr3);
}
if (val4 == HIGH)
{         // check if the input is HIGH (button released)
//EEPROM_writeAnything(addr4, mybinary);
//EEPROM_readAnything(addr4, value4);

EEPROM.write(addr4, mybinary);
value4= EEPROM.read(addr4);

}

for (int t1=0; t1<10; t1++)
{
  if (value1==mybyte[t1])
  {
      D1=t1;
  }
  if (value2==mybyte[t1])
  {
      D2=t1;
  }
  if (value3==mybyte[t1])
  {
      D3=t1;
  }
  if (value4==mybyte[t1])
  {
      D4=t1;
  }
}


total=String(D4)+String(D3)+String(D2)+String(D1);
lcd.print(total);
lcd.setCursor(0, 1);

}

JENG

แบ่งเก็บเป็น int ครับ
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺


HeroEng

Quote from: amaloma on May 03, 2013, 09:32:55 AM
ตามคุณ JENG เลยครับจบ
ได้ไม่ได้ยังไงมาคุยกันต่อ
ขาตัว 7 segment A-G ผ่าน 74HC238,ส่วน Common Cathode ผ่าน TD62083 ครับ

ซิมกับ Proteus ผ่านครับ แต่ต่อจริงไม่ทำงาน ผมจับขา connector DIP20 เข้าตัว Opto
เดี๋ยววาดวงจรให้ด้วยนะครับ มีพี่ท่านใดจะแนะนำป่าวครับ
ขอบคุณครับ

onetime

ขาตัว 7 segment A-G ผ่าน 74HC238
ใช้เบอร์นี้จริง หรือ
74HC238; 74HCT238
3-to-8 line decoder/demultiplexer



ส่วน
TD62083  เบอร์ทั่วไปคือ ULN2803

HeroEng

แก้ไขนะครับ

ขาตัว 7 segment A-G ผ่าน TD62703 ครับ
ส่วนขา common ผ่าน TD26083 ครับ

ไม่ทราบว่าจะเก็บค่าจาก ขา 7 segment ยังไงครับ

amaloma

Quote from: HeroEng on June 10, 2013, 07:00:14 PM
Quote from: amaloma on May 03, 2013, 09:32:55 AM
ตามคุณ JENG เลยครับจบ
ได้ไม่ได้ยังไงมาคุยกันต่อ
ขาตัว 7 segment A-G ผ่าน 74HC238,ส่วน Common Cathode ผ่าน TD62083 ครับ

ซิมกับ Proteus ผ่านครับ แต่ต่อจริงไม่ทำงาน ผมจับขา connector DIP20 เข้าตัว Opto
เดี๋ยววาดวงจรให้ด้วยนะครับ มีพี่ท่านใดจะแนะนำป่าวครับ
ขอบคุณครับ
แนะนำ
1. ใช้ digital Opto
2. ถ้าสามารถสั่ง  7 segment ได้ ก็ใช้วิธีการเทียบค่าที่ได้ครับ
เช่น อ่านมา 0x74 ตัวเลขที่เห็น คือ 0 ก็จดไว้ จนถึง 9 เลย
3. การเก็บค่าใน eeprom ควรเก็บเป็นหลักครับ ไม่ใช่ค่ารวม แล้วค่อยมาคำนวนจะง่ายกว่าครับ
ลองดู


HeroEng

1. ผมต่อ ขา A-G ของ 7 segment เข้ากับ (-) ของ Opto ,ต่อ ( +) ไว้รอ
2. ผมต่อ ขา common Anode ของ 7 segment เข้ากับ (+) ของ Opto ,ต่อ ( - ) ไว้รอ
3. ผมต่อ ขา Output ของ Opto ต่อเข้าขา 6-12  (A-G) ของ  Arduino  ตามลำดับนะครับ ต่อ Pull-up กับ +5V
4. ส่วน  ขา common Cathod ของ 7 segment ผมต่อเข้าขา 2 ของ  Arduino

Code ผมดังตัวอย่างนะครับ แต่เทสดูแล้วยังไม่ได้ครับ รบกวนดูให้หน่อยนะครับ
#include <LiquidCrystal.h>
#include <EEPROM.h>
//#include <EEPROMAnything.h>

LiquidCrystal lcd(22, 24, 26, 28, 30, 32);
int buttonPins[] = {6,7,8,9,10,11,12} ;
int buttonStates[7];     
int i;
int A=0;
int B=0;
int C=0;
int D=0;
int E=0;
int F=0;
int G=0;
String total="";

void setup() {
  Serial.begin(9600);
for (i=0; i<7; i++)
{
   pinMode(buttonPins[i], INPUT);     
}
  pinMode(2,INPUT); 
  pinMode(3,INPUT);   
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  lcd.begin(16, 2);


}

void loop() {
  val1 = digitalRead(2);  // read input value
 
if (val1 == LOW )
{     

  buttonStates[0] = digitalRead(buttonPins[0]);
  buttonStates[1] = digitalRead(buttonPins[1]);
  buttonStates[2] = digitalRead(buttonPins[2]);
  buttonStates[3] = digitalRead(buttonPins[3]);
  buttonStates[4] = digitalRead(buttonPins[4]);
  buttonStates[5] = digitalRead(buttonPins[5]);
  buttonStates[6] = digitalRead(buttonPins[6]);                           
  EEPROM.write(0,(buttonStates[6]));
  EEPROM.write(1,(buttonStates[5]));
  EEPROM.write(2,(buttonStates[4]));
  EEPROM.write(3,(buttonStates[3]));
  EEPROM.write(4,(buttonStates[2]));
  EEPROM.write(5,(buttonStates[1]));
  EEPROM.write(6,(buttonStates[0]));   
if (val1 == HIGH )
{
     A= EEPROM.read(6);
     B= EEPROM.read(5);
     C= EEPROM.read(4);
     D= EEPROM.read(3);
     E= EEPROM.read(2);
     F= EEPROM.read(1);
     G= EEPROM.read(0);
     total=String(A)+String(B)+String(C)+String(D)+String(E)+String(F)+String(G);
     Serial.println(total); 
     lcd.print(total);
     lcd.setCursor(0, 1);
}

}


ผมลองส่ง  9  ดูเป็นดังรูปนะครับ มันน่าจะเป็น "0000001" ก็คือ ("ABCDEFG") แต่ตามรูปค่ามันจะไม่นิ่งครับ ซึ่งมันไม่ถูกต้อง