정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

수박쨈님 질문있습니다 .
한상원 | 2017-04-01

답변주신대로 millis함수를 이용해 영점셋팅을 해볼려고하는데요  

솔직히 잘 이해가 되지않아서 질문드립니다.

 

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <Wire.h>               
#include <LiquidCrystal_I2C.h>  
#include <SoftwareSerial.h>
#include <Hx711.h>
#include "SPI.h"
#include "MFRC522.h"
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
#define SP_PIN 8
#define lcdAddress 0x27
int servoPin1 = 6;
int servoPin2 = 7;
int angle = 0;
int hx711,charge;
byte key_flag=0;
Servo servo1, servo2;
MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
SoftwareSerial BTSerial(23);
LiquidCrystal_I2C lcd(0x27); 
Hx711 scale(A1, A0);
 
void setup() 
{
  Serial.begin(9600);
  BTSerial.begin(9600); 
  SPI.begin();
  rfid.PCD_Init();
  servo1.attach(servoPin1);
  servo2.attach(servoPin2);
  
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Time,ID,Weight,Charge"); 
  lcd.begin(162);
  
 lcd.print("Weight= " + String(scale.getGram()) + "   g "); 
 lcd.setCursor ( 0);       
 lcd.print ("charge= "  + String(scale.getGram()) + " won");      
  delay(200);
}
 
void loop() 
{
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial())
    return;
    
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }
  String strID = "";
  for (byte i = 0; i < 4; i++) {
    strID +=
    (rfid.uid.uidByte[i] < 0x10 "0" : ""+
    String(rfid.uid.uidByte[i], HEX) +
    (i!=":" : "");
  }
  
strID.toUpperCase();
  Serial.print("Tap card key: ");
  Serial.println(strID);
  if(key_flag==&& strID =="6B:A7:82:CB"// 카드 1
  { 
    servo1.write(130); 
    key_flag=1;
    
  }
  if(key_flag==&& strID =="6B:A7:82:CB")  // 카드 1
  {
    servo1.write(0);
    key_flag=0;
   
  
  }   
 if(key_flag==&& strID =="06:54:73:A1"//  카드2
  { 
    servo2.write(130); 
    key_flag=1;
  }
  if(key_flag==&& strID =="06:54:73:A1")  // 카드 2
  {
    servo2.write(0);
    key_flag=0;
  }   
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
   
   hx711 = analogRead(A0);   // 무게값 읽어옴
   charge=hx711;             // 무게값이  금액으로 
   Serial.print("DATA,TIME,");  // data time 출력 
   Serial.print(strID);          // 아이디 출력
   Serial.print(",");            // , 
   Serial.print(hx711);       // 무게출력
   Serial.print(",");          // ,
   Serial.println(charge);    //  금액 출력 
  
 if (Serial.available())              // 블루투스 통신 시리얼모니터-> BT->스마트폰
  {
    BTSerial.write(Serial.read());
  }  
  
 
}
cs

 

 

전체 코드는  오픈소스 라이어브러리를 이용해서 작성했습니다.

밀리스 함수를 사용해 영점셋팅을 하려고  무게측정 부분만  바꿔봤는데요 

계속 오류가 나는데요     현재 시간의 무게값을 읽고 30초 뒤에 무게값을 읽어서 그 차이를 시리얼통신으로 보여주게 하는식으로

코드를 작성했다고 생각하는데  생각대로 나오지않네요  

 

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
#include <Hx711.h>
 
Hx711 scale(A1, A0);
unsigned long pretime=0;
int hx711,hx711a,hx711b;
void setup() {
 
  Serial.begin(9600);
 
}
 
void loop() {
  unsigned long curtime=millis();   //현재시간측정 
  hx711a = analogRead(A0);             // 무게값 읽는다 
  
  if(curtime - pretime>30000)    // 30초후 
  {   pretime = curtime;
    hx711b=analogRead(A0);        // 무게측정 
    }
  hx711=hx711b-hx711a;               //  차이만 읽어옴 
  Serial.print(scale.getGram(), 1);
  Serial.println(" g");
 
}
 
cs

 

이전글   |    어플리케이션 오류 2017-03-31
다음글   |    안녕하세여 2017-04-01