Nano не работает 12 пин?
- Войдите на сайт для отправки комментариев
Пт, 03/01/2020 - 14:34
Здравствуйте!
По задумке при определенных действиях должны включаться светодиоды на 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");
}
}
если d12 поменять на d3 все работает
Если Вы используете SPI, а Вы используете, то нельзя использовать 12-ый пин - у него при работе SPI особое назначение.
я почему то так и думал. Хотя явно нигде его как MISO не указывал, и в .h файлах он вроде тоже не указывается)
Это аппаратное назначение. Если Вы откроете даташит, то увидите: "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 и занимается своими делами.