Nano не работает 12 пин?

unheiligmann
Offline
Зарегистрирован: 03.01.2020

Здравствуйте!

По задумке при определенных действиях должны включаться светодиоды на d12 и d4.

d4 работает, d12 нет.

Пробовал на двух разных arduino nano.

Не могу разобраться - косяк в схеме или коде? или там и там?)))

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <EEPROM.h>

#define TFT_SCLK 13
#define TFT_MOSI 11
#define TFT_CS   10
#define TFT_RES  8  
#define TFT_RS   9
#define B 3950 // B-коэффициент
#define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)

const byte tempPin = A0;

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_RS, TFT_RES);
unsigned long timing1; //для millis
unsigned long timing2; //для millis
float p = 3.1415926;
byte r_temp;//температура стола
byte s_temp;//установленная температура
//byte old_s_temp;

boolean led = true;//состояние подсветки
     

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

s_temp=EEPROM.read(0);//читаем последнюю установленную температуру

  pinMode(12, OUTPUT);//подсветка  
  pinMode(4, OUTPUT);//стол
  pinMode(7, INPUT);//энкодер1
  pinMode(6, INPUT);//энкодер2
  pinMode(5, INPUT);//энкодер кнопка
  pinMode( tempPin, INPUT );//термистор

   
  // Use this initializer if you're using a 1.4" TFT
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  tft.setRotation(1);//поворот дисплея
  tft.fillScreen(ST7735_BLACK);//заливка дисплея черным
  //рамки
 tft.drawRoundRect (35, 3, 120, 120, 5, ST7735_GREEN);//ramka obshaya
 tft.drawRoundRect (37, 7, 116, 37, 5, ST7735_GREEN);//ramka real temp
 tft.drawRoundRect (37, 47, 116, 37, 5, ST7735_GREEN);//ramka set temp
 tft.drawRoundRect (37, 87, 116, 20, 5, ST7735_GREEN);//ramka heat status
 tft.drawRoundRect (37, 108, 47, 11, 3, ST7735_GREEN);//ramka led status

tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
tft.setTextSize(1);
tft.setCursor(120, 110);
tft.print("V_1.0");

}

void loop() {
//начало работы с термистором
int t = analogRead( tempPin );
    float tr = 1023.0 / t - 1;
    tr = SERIAL_R / tr;

    float steinhart;
    steinhart = tr / THERMISTOR_R; // (R/Ro)
    steinhart = log(steinhart); // ln(R/Ro)
    steinhart /= B; // 1/B * ln(R/Ro)
    steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
    steinhart = 1.0 / steinhart; // Invert
    steinhart -= 273.15; 
    r_temp=steinhart;
//конец работы с термистором

//если установленная температура выше текущей начинаем нагрев, иначе останавливаем
if (s_temp>r_temp) digitalWrite (4, HIGH); 
else digitalWrite (4, LOW);

//проверка включения подсветки
if (led==true) digitalWrite (12, HIGH);
else digitalWrite (12, LOW);


//энкодер
if (digitalRead(7)==HIGH) 
{
 if (s_temp<90)  s_temp=s_temp+1;
}
if (digitalRead(6)==HIGH)
{
if (s_temp>20)  s_temp=s_temp-1;
}
if (digitalRead(5)==HIGH) 
{
 if (led==true) led=false;
 else led=true;
}


 
//вывод информации на экран
 if (millis() - timing1 > 100) //таймер для разгрузки проца
 {
  timing1 = millis(); 
  //начало блока картинок
tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
  tft.setTextSize(2);
 
 tft.setCursor(43, 10);
 tft.print("Bed TEMP"); 
 tft.setCursor(43, 27);
 tft.print(r_temp);
 tft.print(" T.C.");

 tft.setCursor(50, 50);
 tft.print("Set TEMP"); 


 tft.setCursor(43, 67);
 tft.print(s_temp);
 tft.print(" T.C."); 


 tft.setCursor(50, 90);
 if (s_temp>r_temp) tft.print("HEATING!"); 
else tft.print("WAITING ");
 
 tft.setTextSize(1);
 tft.setCursor(40, 110);
 if (led==true)
 {
 tft.print("LED  ON");
 }
 else  tft.print("LED OFF");


// запись температуры в EEPROM и ответ по com порту
 }
  if (millis() - timing2 > 10000) //таймер для разгрузки проца
 {
  timing2 = millis(); 
  EEPROM.update(0,s_temp);
  // ответ по com порту
  Serial.print ("setup temp: ");
  Serial.println (s_temp);
    Serial.print ("bed temp: ");
  Serial.println (r_temp);
    Serial.print ("led status: ");
  if (led==true)Serial.println("LED  ON");
 else  Serial.println("LED OFF");
    Serial.print ("heat status: ");
   if (s_temp>r_temp) Serial.println("HEATING!"); 
else Serial.println("WAITING");
 }



}

 

unheiligmann
Offline
Зарегистрирован: 03.01.2020

если d12 поменять на d3 все работает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если Вы используете SPI, а Вы используете, то нельзя использовать 12-ый пин - у него при работе SPI особое назначение.

unheiligmann
Offline
Зарегистрирован: 03.01.2020

я почему то так и думал. Хотя явно нигде его как MISO не указывал, и в .h файлах он вроде тоже не указывается)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это аппаратное назначение. Если Вы откроете даташит, то увидите: "MISO: Master Data input, Slave Data output pin for SPI channel. When the SPI is enabled as a Master, this pin is configured as an input regardless of the setting of DDB4". Т.е. пофиг на Ваш pinMode, он всё равно INPUT и занимается своими делами.