Sorry for Korean comments down there.. but my arduino stops without any error.
I'm a newbie arduino dev.. so have no idea what's wrong
all the sensors and chips works fine.. but arduino tries to call scale.get_units() function, it stops.
when I try the same thing on the blank one (getting value from HX711) it works(which means nothing wrong with the sensor.)
I'm suspecting that there's sth wrong with the memory...maybe too many global variables? please help me please :((((((
#include <HX711.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#ifndef STASSID
#define STASSID myssid // 공유기 SSID
#define STAPSK mypwd // 공유기 Password
#endif
#ifndef SIGNALID
#define SIGNALID "a1"
#define LOADCELL_DOUT 14 // D5
#define LOADCELL_CLK 4 // D4
#define REDLIGHT 12 // D6
#define GREENLIGHT 13 // D7
#endif
// 디지털 output용 핀 번호
#define calibration_factor -7050.0
HX711 scale;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const char* ssid = STASSID; // 공유기 SSID 설정
const char* pass = STAPSK; // 공유기 Password 설정
const char* host = ; // DB 불러올 서버의 주소
String get_host = ; // DB 불러올 서버의 주소
const char* signalID = SIGNALID; // 신호의 관리용 ID (현재 임의ID)
WiFiServer server(8080);
//
int GreenLightOnSec = 5; // 신호 활성화를 위해 필요한 무게 지속 입력시간(sec)
int GreenKeepOnSec = 0; // 초록불 계속 켜져있는 시간(sec)
int GreenBlinkSec = 0; // 초록불 깜빡이는 시간(sec)
int GreenOnWait = 15; // 초록불 활성화 전까지 대기시간(sec)
int GreenTotSec = 20; // 초록불 총 시간
int longerSec = 0;
int longerTemp = 0;
int GreenOnWeight = 0; // 신호 활성화를 위한 무게
const int blinkTerm = 1; // 점멸신호 간격(sec)
unsigned long inputTimerMilli = 0;
int weightInput = 0;
boolean signalOnState = false;
boolean inputNow = false;
boolean prev = false;
unsigned long timeNow = 0;
//
void setup()
{
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA); // WIFI_STA 모드로 연결
WiFi.begin(ssid, pass); // 공유기의 SSID / 비밀번호 이용해 연결
server.begin(); // DB를 긁어오기 위한 server 시작
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); // 연결된 IP주소
WiFiClient client = server.available();
HTTPClient http;
String url = get_host+"/Gsignal/signalval/signalval.jsp?signalId="+signalID;
// get 명령어를 보낼 url
http.begin(url);
Serial.print("GET done.");
int httpCode = http.GET();
String payload = http.getString();
// jsp페이지를 읽어옴
Serial.print(payload);
if(payload.equals("")){
Serial.print("load fail. . . reset the system . . .\n");
}
else
Serial.print("load success!");
http.end();
payload.trim();
pinMode(GREENLIGHT, OUTPUT); // 초록불
pinMode(REDLIGHT, OUTPUT); // 빨간불
scale.begin(LOADCELL_DOUT, LOADCELL_CLK);
scale.set_scale(calibration_factor);
scale.tare();
Serial.print("scale set complete.\n");
lcd.init();
lcd.backlight();
Serial.print("LCD set complete.\n");
delay(500);
}
void loop()
{
weightInput = scale.get_units()*454;
// 무게센서에서 입력을 받은 후, lbs -> g 전환
if(millis() % 5000 == 0)
getLongerStat();
if(weightInput >= GreenOnWeight)
inputNow = true;
else
inputNow = false;
// 현재 무게가 신호 작동 조건에 부합하는지
digitalWrite(REDLIGHT, HIGH);
// 평상시 빨간불 ON
if(inputNow == true && prev == false && (millis() - timeNow) > 200)
{
timeNow = millis();
}
// 아날로그 입력이 시작된 시간 기록
if(inputNow == false)
{
timeNow = millis();
}
// 아날로그 입력이 일정 시간 이상 지속되지 않으면 시간 카운트 초기화
if(milliToSec(inputTimerMilli) >= GreenLightOnSec && inputNow == true){
signalOnState = true;
}
else
signalOnState = false;
// 2초 이상 아날로그 신호 입력되면 초록불 동작
if(signalOnState == true){
greenOn(GreenTotSec, GreenOnWait);
signalOnState == false;
timeNow = millis();
}
else {
digitalWrite(GREENLIGHT, LOW);
digitalWrite(REDLIGHT, HIGH);
}
// 초록불 sequence가 끝나면 빨간불 On 초록불 Off
inputTimerMilli = (millis() - timeNow);
// Serial.println(inputTimerMilli);
prev = inputNow;
// 1ms 이전의 버튼 입력 상태를 prev에 넣음
}
void greenOn(int grnTotSec, int grnWait)
{
timeNow = millis();
// 초록불 켜짐 sequence을 시작하는 아두이노 내부 시계의 시간을 기록
GreenKeepOnSec = grnTotSec / 2;
GreenBlinkSec = grnTotSec / 2;
// 총 초록불 지속 시간이 grnTotSec이고
// 초록불이 계속 켜져있는 시간 / 초록불이 깜빡이는 시간을 반반 나눔
while(1)
{
countTimerLcd(grnWait, timeNow);
delay(1); // esp8266 모듈을 연결하면 background task를 긴 loop로 block하면 안됨. 따라서 약간의 딜레이 필요.
// 초록불이 켜질 때 까지의 시간을 LCD에 표시
// Serial.println(grnWait - milliToSec(millis() - timeNow));
if(millis() - timeNow >= secToMilli(grnWait)){
lcd.clear();
break;
}
// 아두이노 내부 시계로 측정한 시간이
// 초록불이 켜지기 전까지 기다리는 시간(grnWait)만큼 도달하면 lcd의 모든 내용을 지우고
// while문 탈출
}
timeNow = millis();
while(1)
{
delay(1); // esp8266 모듈을 연결하면 background task를 긴 loop로 block하면 안됨. 따라서 약간의 딜레이 필요.
digitalWrite(REDLIGHT, LOW);
digitalWrite(GREENLIGHT, HIGH);
countTimerLcd(grnTotSec, timeNow);
// Serial.println(millis() - timeNow);
if(millis() - timeNow >= secToMilli(GreenKeepOnSec)){
lcd.clear();
break;
}
}
blink(GREENLIGHT, GreenBlinkSec);
}
void blink(int colorOfLed, int blinkTime)
{
timeNow = millis();
while(1)
{
delay(1);
// Serial.println(blinkTime - milliToSec(millis() - timeNow));
countTimerLcd(blinkTime, timeNow);
if(millis() / secToMilli(blinkTerm) % 2 == 0)
digitalWrite(GREENLIGHT, LOW);
else
digitalWrite(GREENLIGHT, HIGH);
if(millis() - timeNow >= secToMilli(blinkTime)){
lcd.clear();
break;
}
}
if(GreenTotSec != longerTemp)
GreenTotSec = longerTemp;
// 초록불 총 시간이 연장시간이 더해진 시간이면 원래 시간으로 초기화
}
unsigned long secToMilli(unsigned long theTime){ return theTime * 1000; } // 시간 "초"를 "밀리초"로 변환해주는 함수
int milliToSec(unsigned long theTime){ return int(theTime / 1000); } // 시간 "밀리초"를 "초"로 변환해주는 함수
void countTimerLcd(int countStart, unsigned long timerStart)
{
lcd.setCursor(7,0);
if(countStart - milliToSec(millis() - timerStart) < 10)
lcd.print(" ");
lcd.print(countStart - milliToSec(millis() - timerStart));
}
void sigSet(String raw){
String buf;
int tempPos = 0;
int flag = 0;
int prev = 0;
while(tempPos != (raw.length()-1)){
tempPos = raw.indexOf("/", prev);
switch(flag){
case 0:
buf = raw.substring(prev, tempPos);
GreenOnWeight = buf.toInt();
prev = tempPos + 1;
flag++;
break;
case 1:
buf = raw.substring(prev, tempPos);
GreenLightOnSec = buf.toInt();
prev = tempPos + 1;
flag++;
break;
case 2:
buf = raw.substring(prev, tempPos);
GreenTotSec = buf.toInt();
prev = tempPos + 1;
flag++;
break;
case 3:
buf = raw.substring(prev, tempPos);
GreenOnWait = buf.toInt();
prev = tempPos + 1;
flag++;
break;
case 4:
buf = raw.substring(prev, tempPos);
longerSec = buf.toInt();
prev = tempPos + 1;
flag++;
break;
default:
Serial.print("Error : Please check the data you've recieved.");
break;
}
}
Serial.print("\n\nGreenOnWeight : ");
Serial.println(GreenOnWeight);
Serial.print("GreenLightOnSec : ");
Serial.println(GreenLightOnSec);
Serial.print("GreenTotSec : ");
Serial.println(GreenTotSec);
Serial.print("GreenOnWait : ");
Serial.println(GreenOnWait);
Serial.print("longerSec : ");
Serial.println(longerSec);
Serial.println("Setting Success!");
}
String getLongerStat() {
WiFiClient client = server.available();
HTTPClient http;
String url = get_host+"/Gsignal/signalval/longerbool.jsp?signalId="+signalID;
String urlLongerbool = get_host+"/Gsignal/signalval/longerboolchange.jsp?signalId="+signalID+"&acpt=arduino";
http.begin(url);
Serial.print("GET done. (LongerStat)");
int longerstat = -1;
int httpCode = http.GET();
String payload = http.getString();
Serial.print(payload);
Serial.print("load success! (LongerStat)");
http.end();
payload.trim();
longerstat = payload.toInt();
if(longerstat == 0)
Serial.println("not long");
else{
Serial.println("long");
longerTemp = GreenTotSec;
GreenTotSec += longerSec;
http.begin(urlLongerbool);
http.GET();
http.end();
greenOn(GreenTotSec, GreenOnWait);
}
return payload;
}
[/quote]