ARDUINO Вем привет! Помогите, пожалуйста, подключить дисплей 1602А к аналоговым пинам

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
я собираю свою паяльную станцию на ардуино нано и у меня не хватает цифровых пинов для подключения регулятора температуры на симисторе, энкодера и для шим регулировки потока турбины при всем этом у меня свободны все аналоговые пины.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
585
141
собираю свою паяльную станцию
при всем этом у меня свободны все аналоговые пины.
Интересно. А как вы измеряете температуру? Дисплей 1602А по какому протоколу работает? I2C работет на пинах А4, А5. А6 и А7 не получится использовать как выходы.
 
  • Лойс +1
Реакции: Могильщик

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
Измерения температуры у меня с помощью модуля MAX6675 он подключен к выводам 9, 10, 13

@viktor1703,
Дисплей 1602А по какому протоколу работает?
Я использую встроеню библиотеку LiquidCrystal там задействуются пины с 2-5 и 11, 12.
 

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
NEHEki6dRLQ.jpg
вот что пока что получилось

скетч возможно в нем много ошибок я в программировании не селен.
также я сейчас думаю как написать меню чтобы по ниму примишятся с помощью энкодера ?

скетч 1.0:
#include <LiquidCrystal.h>
#include <GyverMAX6675.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#define CLK_PIN   13  // Пин SCK
#define DATA_PIN  9  // Пин SO
#define CS_PIN    10  // Пин CS

GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN> sens;

void setup() {
  Serial.begin(9600);

  lcd.begin(16, 2);

  lcd.setCursor(1, 0);
  lcd.print("Temper_t");

  lcd.setCursor(1, 2);
  lcd.print("Obarot_%");

}
unsigned long tz;
int t;
void loop() {
  if (millis() - tz > 1000) {
    tz = millis();
    if (sens.readTemp()) {
      lcd.setCursor(11, 0);
      lcd.println(sens.getTemp());
      Serial.println(sens.getTemp());

    }
  }
}
 
Изменено:

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
В 4й строке вашего кода поменять номера пинов. Вместо 14-19 можно использовать A0-A5, это одно и то же.
спасибо я сейчас это и делал все заработала кроме 15 или А1 пина

мне осталось создать активную менюшку чтобы можно была настраивать температурю и поток обдува
 

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
как сделать курсор выбора с боку дисплея чтобы он управлялся с энкодера?

1.1:
#include <LiquidCrystal.h>
#include <GyverMAX6675.h>
#include "GyverEncoder.h"

const int rs = 12, en = 11, d4 = 14, d5 = 16, d6 = 17, d7 = 18;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#define CLK_PIN   13  // Пин SCK
#define DATA_PIN  9  // Пин SO
#define CS_PIN    10  // Пин CS

#define CLK 6
#define DT 7
#define SW 8
Encoder enc1(CLK, DT, SW);  // для работы c кнопкой
byte value = 0;

GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN> sens;

void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);

  lcd.begin(16, 2);

  lcd.setCursor(1, 0);
  lcd.print("Temper_t");

  lcd.setCursor(1, 2);
  lcd.print("Obarot_%");

  pinMode(3, 1);

}
unsigned long tz;
int t;
int x;
void loop() {
  enc1.tick();
  if (enc1.isRight()) value++;       // если был поворот направо, увеличиваем на 1
  if (enc1.isLeft()) value--;     // если был поворот налево, уменьшаем на 1

  if (enc1.isRightH()) value += 5;  // если было удержание + поворот направо, увеличиваем на 5
  if (enc1.isLeftH()) value -= 5; // если было удержание + поворот налево, уменьшаем на 5

  value = constrain(value, 0, 100);
  Serial.println(value);

  if (millis() - tz > 1000) {
    tz = millis();
    if (sens.readTemp()) {
      lcd.setCursor(11, 0);
      lcd.println(sens.getTemp());
      Serial.println(sens.getTemp());
      lcd.setCursor(11, 2);
      lcd.print(value);
      lcd.print("%");
      //      lcd.setCursor(14, 2);
      //      lcd.println("% ");

    }
  }


  x = map(x, 0, 100, 0, 255);
  analogWrite(3, x);
}
 

bort707

★★★★★★✩
21 Сен 2020
3,003
898
  • Лойс +1
Реакции: Могильщик

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
я сделал импровизированное меню из 2 пункта на if работает нормально та что все что осталось это здеть подержания температуры и регулировку температуры, начну с эти разбираться если есть советы советуйте буду рад послушать
 

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
вот какой результат пока что был достигнут
1.3:
#include <LiquidCrystal.h>
#include <GyverMAX6675.h>
#include "GyverEncoder.h"

const int rs = 12, en = 11, d4 = 14, d5 = 16, d6 = 17, d7 = 18; //пины дисплея
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#define CLK_PIN   13  // Пин SCK  термометер
#define DATA_PIN  9  // Пин SO
#define CS_PIN    10  // Пин CS

#define CLK 6 // энкодер
#define DT 7
#define SW 8
Encoder enc1(CLK, DT, SW);  // для работы c кнопкой
byte value = 0;

GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN> sens;

boolean butt_fifg = 0;   //флаг для отаброжения стрелки в меню
boolean butt;

void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);   //тип инкодера TYPE1 или TYPE2

  lcd.begin(16, 2);      // размер дисплея по сивмолно

  lcd.setCursor(1, 0);   // вывод надписи температера на 1 строчке с 2 сивмало
  lcd.print("Temper_t"); //отшет сивлов идет с 0

  lcd.setCursor(1, 2);   // вывод надписи температера на 2 строчке с 2 сивмало
  lcd.print("Obarot_%"); //отшет сивлов идет с 0
  pinMode(3, 1);         //турбина фена чрез масфет

}
unsigned long tz;        // задержка отабражения температуры
int x;                   //шим для тербина на 3 пине
void loop() {
  enc1.tick();

  if (millis() - tz > 1000) {  // частата обнавления показтелей температуры
    tz = millis();
    if (sens.readTemp()) {
      lcd.setCursor(11, 0);    // вывод температуры на десплей 
      lcd.println(sens.getTemp());
      Serial.println(sens.getTemp());  //вывод температуры в сом
    }
  }

  if (enc1.isRightH())butt = 1;        // управления миню зделоно кастылно чирез if и флаги
  if (enc1.isLeftH()) butt = 0;
  if (butt == 1 && butt_fifg == 0) {
    butt_fifg = 1;
  }
  if (butt == 0 && butt_fifg == 1) {
    butt_fifg = 0;
  }

  if (butt == 1) {
    lcd.setCursor(0, 0);
    lcd.print(">");
    lcd.setCursor(0, 2);
    lcd.print(" ");
  }
  if (butt == 0) {
    lcd.setCursor(0, 2);
    lcd.print(">");
    lcd.setCursor(0, 0);
    lcd.print(" ");

    if (enc1.isRight()) value++;       // если был поворот направо, увеличиваем на 1
    if (enc1.isLeft()) value--;     // если был поворот налево, уменьшаем на 1


    value = constrain(value, 0, 100); // вывод скорости турбины в %
    lcd.setCursor(11, 2);
    lcd.print(value);
    lcd.print("%  ");
  }

  x = map(x, 0, 100, 0, 255); // привод со 100 до 255 нужных для шим
  analogWrite(3, x);          // шим



}
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
585
141
C++:
x = map(x, 0, 100, 0, 255); // привод со 100 до 255 нужных для шим
  analogWrite(3, x);          // шим
А в каком месте меняется значение x? В смысле до map.
 
  • Лойс +1
Реакции: Могильщик

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
1.4:
#include <LiquidCrystal.h>
#include <GyverMAX6675.h>
#include "GyverEncoder.h"

const int rs = 12, en = 11, d4 = 14, d5 = 16, d6 = 17, d7 = 18; //пины дисплея
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#define CLK_PIN   13  // Пин SCK  термометер
#define DATA_PIN  9  // Пин SO
#define CS_PIN    10  // Пин CS

#define CLK 6 // энкодер
#define DT 7
#define SW 8
Encoder enc1(CLK, DT, SW);  // для работы c кнопкой
byte value = 0;

GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN> sens;

boolean butt_fifg = 0;   //флаг для отаброжения стрелки в меню
boolean butt;

void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);   //тип инкодера TYPE1 или TYPE2

  lcd.begin(16, 2);      // размер дисплея по сивмолно

  lcd.setCursor(1, 0);   // вывод надписи температера на 1 строчке с 2 сивмало
  lcd.print("Temper_t"); //отшет сивлов идет с 0

  lcd.setCursor(1, 2);   // вывод надписи температера на 2 строчке с 2 сивмало
  lcd.print("Obarot_%"); //отшет сивлов идет с 0
  pinMode(3, 1);         //турбина фена чрез масфет

}
unsigned long tz;        // задержка отабражения температуры
int x;                   //шим для тербина на 3 пине
void loop() {
  enc1.tick();

  if (millis() - tz > 1000) {  // частата обнавления показтелей температуры
    tz = millis();
    if (sens.readTemp()) {
      lcd.setCursor(11, 0);    // вывод температуры на десплей
      lcd.println(sens.getTemp());
      Serial.println(sens.getTemp());  //вывод температуры в сом
    }
  }

  if (enc1.isRightH())butt = 1;        // управления миню зделоно кастылно чирез if и флаги
  if (enc1.isLeftH()) butt = 0;
  if (butt == 1 && butt_fifg == 0) {
    butt_fifg = 1;
  }
  if (butt == 0 && butt_fifg == 1) {
    butt_fifg = 0;
  }

  if (butt == 0) {
    lcd.setCursor(0, 0);
    lcd.print(">");
    lcd.setCursor(0, 2);
    lcd.print(" ");
  }
  if (butt == 1) {
    lcd.setCursor(0, 2);
    lcd.print(">");
    lcd.setCursor(0, 0);
    lcd.print(" ");

    if (enc1.isRight()) value++;       // если был поворот направо, увеличиваем на 1
    if (enc1.isLeft()) value--;     // если был поворот налево, уменьшаем на 1


    value = constrain(value, 0, 100); // вывод скорости турбины в %
    lcd.setCursor(11, 2);
    lcd.print(value);
    lcd.print("%  ");
  }

  x = map(value, 0, 100, 0, 255); // привод со 100 до 255 нужных для шим
  analogWrite(3, value);          // шим
с исправлениям

вот результат на данный момент

Я случайно спалил ардуинку по этому эта последняя версия пока что здесь добавлена настройка температуры если будет интересно задавайте вопросы
1.5:
#include <LiquidCrystal.h>
#include <GyverMAX6675.h>
#include "GyverEncoder.h"


const int rs = 12, en = 11, d4 = 14, d5 = 16, d6 = 17, d7 = 18; //пины дисплея
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#define CLK_PIN   13  // Пин SCK  термометер
#define DATA_PIN  9  // Пин SO
#define CS_PIN    10  // Пин CS

#define CLK 6 // энкодер
#define DT 7
#define SW 8
Encoder enc1(CLK, DT, SW);  // для работы c кнопкой
byte value = 20;
int val = 30;
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN> sens;

boolean butt_fifg = 0;   //флаг для отаброжения стрелки в меню
boolean butt;

void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);   //тип инкодера TYPE1 или TYPE2

  lcd.begin(16, 2);      // размер дисплея по сивмолно

  lcd.setCursor(1, 0);   // вывод надписи температера на 1 строчке с 2 сивмало
  lcd.print("Temper_"); //отшет сивлов идет с 0

  lcd.setCursor(1, 2);   // вывод надписи температера на 2 строчке с 2 сивмало
  lcd.print("Obarot_"); //отшет сивлов идет с 0
  pinMode(3, 1);         //турбина фена чрез масфет
  pinMode(5, 1);         //нагриватель
}
unsigned long tz;        // задержка отабражения температуры
int x;                   //шим для тербина на 3 пине
void loop() {
  enc1.tick();

  //  if (millis() - tz > 1000) {  // частата обнавления показтелей температуры
  //    tz = millis();
  //    if (sens.readTemp()) {
  //      lcd.setCursor(13, 0);    // вывод температуры на десплей
  //      lcd.println(sens.getTemp());
  //  Serial.println(sens.getTemp());  //вывод температуры в сом
  //    }
  //}

  if (enc1.isRightH())butt = 1;        // управления миню зделоно кастылно чирез if и флаги
  if (enc1.isLeftH()) butt = 0;
  if (butt == 1 && butt_fifg == 0) {
    butt_fifg = 1;
  }
  if (butt == 0 && butt_fifg == 1) {
    butt_fifg = 0;
  }

  if (butt == 0) {
    lcd.setCursor(0, 0); // температура
    lcd.print(">");
    lcd.setCursor(0, 2);
    lcd.print(" ");

    val = constrain(val, 0, 500);

    if (enc1.isRight()) val++;       // если был поворот направо, увеличиваем на 1
    if (enc1.isLeft()) val--;     // если был поворот налево, уменьшаем на 1
 
Изменено:

Могильщик

✩✩✩✩✩✩✩
26 Июл 2024
11
0
я взял заместо ардуинки ее копию LGT8F328p и при прошивки ее при помаши подключенного для ее ядра шим на 3 пине пишет но если прошить ее как атмегу 328 то все работает и не пишет шим хочу понять причину почему это происходит