코인 자동매매 일지

[2021-11-14] 업비트 코인 자동매매 #11

코코코인 2021. 11. 14. 20:09
728x90

[총 보유자산]

110만~114만

 

[기타]

15일 03시~06시 사이에 업비트 서버 점검이 있다고 합니다.

(https://upbit.com/service_center/notice?id=2261)

제가 내일 일찍나가야되서 새벽3시까지는 못버틸거같네요,,

코인은 그대로 냅두고 잠시 프로그램을 종료하겠습니다, 내일 아침에 다시 키도록 하겠습니다.

 

[변경사항]

라즈베리파이에 쿨러로 온도조절 기능을 추가함.

선이 부족해서 3개의 라즈베리파이 중 1개에만 추가하였고, 선은 디바이스마트에서 주문시켰음.

목표 온도를 40도로 맞춰놓고 테스트해보았음.

 

 

상단에 모터드라이브를 설치한 사진

 

https://youtu.be/5nff5Lfuq5s

 

 

import time
import threading
import statistics
import RPi.GPIO as GPIO

# 코드 참고는 https://blog.naver.com/chandong83/221084688966 여기서 했습니다. #

tempPATH  =   "/sys/class/thermal/thermal_zone0/temp"
tempList = list()
targetTemp = 40
timerSec = 0.5
threadStopFlag = False

### pin info ###
STOP = 0
FORWARD = 1
BACKWORD = 2

# motor channel
CH1 = 0

# PIN INPUT OUTPUT
OUTPUT = 1
INPUT = 0

# PIN HIGH LOW
HIGH = 1
LOW = 0

#PWM PIN
ENA = 26

#GPIO PIN
IN1 = 19
IN2 = 13

# Contral Value ##
PID_P = 50
PID_D= 35
dt = 0.5    # 0.5 sec

prev_error = 0

#PWM PIN
pwmA = None

def setPinConfig(EN, INA, INB):

    GPIO.setup(EN, GPIO.OUT)
    GPIO.setup(INA, GPIO.OUT)
    GPIO.setup(INB, GPIO.OUT)

    pwm = GPIO.PWM(EN, 1)
    pwm.start(0)
    return pwm

def setMotorControl(pwm, INA, INB, speed, stat):

    if stat == FORWARD :
        GPIO.output(INA, HIGH)
        GPIO.output(INB, LOW )
    elif stat == BACKWORD:
        GPIO.output(INA, LOW)
        GPIO.output(INB, HIGH)
    elif stat == STOP :
        GPIO.output(INA, LOW)
        GPIO.output(INB, LOW)

    pwm.ChangeDutyCycle(speed)

def SetPrevErr(err):
    prev_error = err
def GetPrevErr():
    return prev_error

def GetTemperature():
    f = open(tempPATH);
    line = f.readline()
    f.close()
    return float(line) * 0.001

def thread_run():
    threading.Timer(timerSec, Run).start()

def Run():
    if not threadStopFlag : 

        temp = GetTemperature()
        #print(f"{temp}  {type(temp)}")
    
        if len(tempList) < 5:
            tempList.append(temp)
        else :
            avgTemp = statistics.mean(tempList)
            Control(round( avgTemp , 2 ))
            #print(f"{avgTemp}   {len(tempList)}")
            tempList.pop(0)

        thread_run()

def Control(temp):
    #print(temp)
    
    error  = targetTemp - temp  
    D_error = (error - GetPrevErr()  )/dt
    SetPrevErr(error)

    control = (PID_P*error) + (PID_D*D_error)
    control = abs(control)
    
    if temp < targetTemp :
        control = 0
    
    if control > 100 :
        control = 100
    setMotorControl(pwmA, IN1, IN2, control, FORWARD)
    #print(f"Temperature:{temp:.2f}")

if __name__ == '__main__':
    
    try:
        GPIO.setmode(GPIO.BCM)
        pwmA = setPinConfig(ENA, IN1, IN2) 
        thread_run()
        
        while True:
            time.sleep(10000)

    except KeyboardInterrupt:
        setMotorControl(pwmA, IN1, IN2, 0 , STOP )
        GPIO.cleanup()
        threadStopFlag = True
        print("STOP PWM")

 

 

 

 

https://youtu.be/BYNhG_dwOkE