My Wemos D1 R1 stops for no reason...

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]

I'm suspecting that there's sth wrong with the memory...maybe too many global variables?

Doubt that on an ESP,

but arduino tries to call scale.get_units() function, it stops.

that is the first thing you do within loop(), it stops ? how does it stop ? are you sure it stops there ? does it compile ?

When i insert an serial.print("loop") in front of that function, it prints "loop" and stops. And when I remove the module that requires scale.gets() function arduino works again...

Oh and how does it stop.. the loop just stop. Doesn't reset or anything. As I said, when I remove the module, it works. Btw module itself is fine cuz when I check the module on the other source code that only has code for the scale module, arduino reads out values from the module.

So it somehow gets stuck in an endless loop calling the function ?

hen I check the module on the other source code that only has code for the scale module, arduino reads out values from the module.

please post that code.

@CHKa

DO NOT CROSS POST / DUPLICATE.
Your other post DELETED

Please READ THIS POST to help you get the best out of the forum.

Bob.