нужна помощь

zaratustra93

✩✩✩✩✩✩✩
9 Мар 2021
6
0
Заголовок должен отражать суть темы. Переформулируй или тема будет удалена.
нашел проект станка для изготовления прутка для 3д принтера из пластиковых бутылок, но он не хочет работать.
температура переменным резистором меняется, а текущая температура почемуто отрицательная и нагреватель все время нагревается, если убрать ресистор который у датчика температуры, то текущая температура максимальная показывает и нагреватель не греет совсем
Untitled Sketch 2_bb.jpg

C++:
#include <Arduino.h>
#include <Stepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

#define POSITIVE_ROUNDS 10
#define NEGATIVE_ROUNDS POSITIVE_ROUNDS * -1
#define STEPS_PER_REV 10
#define SPEED_RPM 50
#define IN1_PIN 11
#define IN2_PIN 10
#define IN3_PIN 9
#define IN4_PIN 8
#define ENA_PIN_A 12
#define ENA_PIN_B 7

void enableStepper(){
  digitalWrite(ENA_PIN_A, HIGH);
  digitalWrite(ENA_PIN_B, HIGH);
}
void disableStepper(){
  digitalWrite(ENA_PIN_A, LOW);
  digitalWrite(ENA_PIN_B, LOW);
}

char vstup;
int term;
boolean heated = false;
int potS;
int temp;
int potR;
int motorSpeed;
int setTemp = 250;
int buttonState = 0;
boolean motorStart = false;
const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
Stepper stepper = Stepper(stepsPerRevolution, IN1_PIN, IN2_PIN, IN3_PIN, IN4_PIN);
int stepCount = 0;  // number of steps the motor has taken
float currentMillis1;

void setup() {
  Serial.begin(115200);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(5, OUTPUT);
  pinMode(3, INPUT);

  stepper.setSpeed(SPEED_RPM);
  pinMode(ENA_PIN_A, OUTPUT);
  pinMode(ENA_PIN_B, OUTPUT);

  //lcd.begin(20,4);

  lcd.init();                      // initialize the lcd
  lcd.init();
 
  lcd.backlight();
  lcd.clear();
  lcd.setCursor ( 3, 0 );
  lcd.print("->FILAMENTOR<-");
  lcd.setCursor ( 0, 1 );
  lcd.print("Set temperature:"); 
  lcd.setCursor ( 15, 1);
  lcd.print(setTemp); 
  lcd.setCursor ( 0, 2);
  lcd.print("Temperature:"); 
  lcd.setCursor ( 15, 2);
  lcd.print(temp); 
  lcd.setCursor ( 0, 3);
  lcd.print("Speed:"); 
  lcd.setCursor ( 15, 3);
  lcd.print(motorSpeed); 
  delay(2000);
  currentMillis1 = millis();
}

void loop() {

while (motorStart == true) {
  if (currentMillis1 + 500 < millis()) {
    term = analogRead(A0);
    potS = analogRead(A1);
    potR = analogRead(A2);
    motorSpeed = map(potS, 0, 1024, 1, 20);
    temp = map(term, 0, 1024, -40, 270);
    setTemp = map(potR, 0, 1024, 18, 270);
    lcd.setCursor ( 15, 1);
    lcd.print("    "); 
    lcd.setCursor ( 15, 1);
    lcd.print(setTemp); 
    lcd.setCursor ( 15, 2);
    lcd.print("    "); 
    lcd.setCursor ( 15, 2);
    lcd.print(temp); 
    lcd.setCursor ( 15, 3);
    lcd.print("    "); 
    lcd.setCursor ( 15, 3);
    lcd.print(motorSpeed); 
    currentMillis1 = millis();
    if (temp >= setTemp) {
      heated = true;
    }
    if (temp < setTemp-3 && heated == true){
      heated = false;
    }
    if (heated == true) {
      digitalWrite(5, HIGH);
      lcd.setCursor ( 19, 2);
      lcd.print(" "); 
    } else {
      digitalWrite(5, LOW);
      lcd.setCursor ( 19, 2);
      lcd.print("H"); 
    }
  }
  stepper.setSpeed(motorSpeed);
  stepper.step(-stepsPerRevolution / 100);
  buttonState = digitalRead(3);
  if (buttonState == 1) {
    motorStart = false;
    disableStepper();
    lcd.setCursor ( 19, 3);
    lcd.print(" ");
    delay(700);
  }
}
if (currentMillis1 + 500 < millis()) {
    term = analogRead(A0);
    potS = analogRead(A1);
    potR = analogRead(A2);
    motorSpeed = map(potS, 0, 1024, 1, 20);
    temp = map(term, 0, 1024, -40, 270);
    setTemp = map(potR, 0, 1024, 18, 270);
    lcd.setCursor ( 15, 1);
    lcd.print("    "); 
    lcd.setCursor ( 15, 1);
    lcd.print(setTemp); 
    lcd.setCursor ( 15, 2);
    lcd.print("    "); 
    lcd.setCursor ( 15, 2);
    lcd.print(temp); 
    lcd.setCursor ( 15, 3);
    lcd.print("    "); 
    lcd.setCursor ( 15, 3);
    lcd.print(motorSpeed); 
    currentMillis1 = millis();
    if (temp >= setTemp) {
      heated = true;
    }
    if (temp < setTemp-3 && heated == true){
      heated = false;
    }
    if (heated == true) {
      digitalWrite(5, HIGH);
      lcd.setCursor ( 19, 2);
      lcd.print(" "); 
    } else {
      digitalWrite(5, LOW);
      lcd.setCursor ( 19, 2);
      lcd.print("H"); 
    }
}
buttonState = digitalRead(3);
if (buttonState == 1) {
    motorStart = true;
    enableStepper();
    lcd.setCursor ( 19, 3);
    lcd.print("M");
    delay(500);
}

}
 

poty

★★★★★★✩
19 Фев 2020
3,253
948
Номиналы сопротивлений в районе термодатчика неверны, может и сам датчик тоже.
 

poty

★★★★★★✩
19 Фев 2020
3,253
948

@zaratustra93, судя по изображению применяется нано, питание процессора и AREF = 5В (схему плохо видно, скорее всего не переопределяется нигде). Преобразование выполняется с помощью
temp = map(term, 0, 1024, -40, 270)
Таким образом, нужно, выбрать точку отсечки нагрева (выбрано
int setTemp = 250
и посчитать напряжение, которое должно быть в этой точке на входном пине Ардуино (где 0В соответствует минус 40 градусов, а 5В соответствует 270 градусов). Затем выставить это напряжение в нужной точке с помощью резистора делителя (который убирали в эксперименте).
Можно поступить наоборот: измерить напряжение как оно сейчас присутствует в нужной точке и изменить пределы внутри map.