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 и занимается своими делами.