Mind addig hibátlan a működés amíg meg nem történik hőmérő kiolvasás. Kb. 2 másodpercig kialszik mind a 3 4 digites kijelző (véleményem szerint megszakad a kiírás az olvasás végett) utána tökéletesen ki is íródnak a megfelelő értékek és ez ismétlődik minden beállított ciklusban.
Véleményetek szerint hogyan tudnám megoldani azt, hogy a hőmérő olvasás idejére is folyamatos legyen a képernyő kiírása?
Szoftveresen vagy hardveresen kell módosítanom, sajnos nemrég kezdtem foglalkozni a témával.
Arduino Nano vezérli a kijelzőket, melyre Arduino 1.8.5. verzióval töltöm fel a programot.
Mellékelem a teljes forráskódot is a könnyebb átláthatóság érdekében.
Kód: Egész kijelölése
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int Homerseklet = 0;
const int digitPins[4] = {7, 8, 3, 2}; //4 common anode pins of the display
const int clockPin = 4; //74HC595 Pin 11
const int latchPin = 5; //74HC595 Pin 12
const int dataPin = 6; //74HC595 Pin 14
const int potPin = A7; //Potméter sensor pin
const int tempOlvPin = 12; //Hőmérő olvasás Led pin
const byte digit[14] = //kijelzőn megjelenített karakterek
{
B11111100, //0
B01100000, //1
B11011010, //2
B11110010, //3
B01100110, //4
B10110110, //5
B10111110, //6
B11100000, //7
B11111110, //8
B11110110, //9
B10011110, //E
B00001010, //r
B00000000, //Üres karakter
B00000010 //-
};
const byte digit1[14] =
{
B00000011, //0
B10011111, //1
B00100101, //2
B00001101, //3
B10011001, //4
B01001001, //5
B01000001, //6
B00011111, //7
B00000001, //8
B00001001, //9
B11111111 //Üres karakter
};
int digitBuffer[4] = {0};
int digitBuffer1[4] = {0};
int digitBuffer2[4] = {0};
int digitBuffer3 = 0;
int digitScan = 0;
int potmAllas = 0;
float tempC, tempC1, tempC2;
void setup() {
for (int i = 0; i < 4; i++)
{
pinMode(digitPins[i], OUTPUT);
}
pinMode(tempOlvPin, OUTPUT);
pinMode(potPin, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Serial.begin(9600);
sensors.begin();
}
void updateDisp(bool kezdo) {
for (byte j = 0; j < 4; j++)
digitalWrite(digitPins[j], HIGH);
digitalWrite(latchPin, LOW);
for (int i = 0; i < 3; i++)
shiftOut(dataPin, clockPin, MSBFIRST, digit[12]);
shiftOut(dataPin, clockPin, MSBFIRST, digit1[10]);
digitalWrite(latchPin, HIGH);
delayMicroseconds(10);
digitalWrite(digitPins[digitScan], LOW);
//delayMicroseconds(10);
digitalWrite(latchPin, LOW);
if (digitScan == 2)
{
shiftOut(dataPin, clockPin, LSBFIRST, (digit[digitBuffer2[digitScan]] | 00000001)); //kiirja a 3. kijelzőre az adatokat
shiftOut(dataPin, clockPin, LSBFIRST, (digit[digitBuffer1[digitScan]] | 00000001)); //kiirja a 2. kijelzőre az adatokat
shiftOut(dataPin, clockPin, LSBFIRST, (digit[digitBuffer[digitScan]] | 00000001)); //kiirja az 1. kijelzőre az adatokat
}
else
{
shiftOut(dataPin, clockPin, LSBFIRST, digit[digitBuffer2[digitScan]]); //kiirja a 3. kijelzőre az adatokat
shiftOut(dataPin, clockPin, LSBFIRST, digit[digitBuffer1[digitScan]]); //kiirja a 2. kijelzőre az adatokat
shiftOut(dataPin, clockPin, LSBFIRST, digit[digitBuffer[digitScan]]); //kiirja az 1. kijelzőre az adatokat
}
shiftOut(dataPin, clockPin, LSBFIRST, digit1[potmAllas]); //kiirja a torony választó kijelzőre az adatokat
digitalWrite(latchPin, HIGH);
delay(1);
digitScan++;
if (digitScan > 3)
{
digitScan = 0;
}
}
void loop()
{
for(int i = 0; i < 1000; i++)
{
KijelzoKiir();
Serial.println(i);
}
//Serial.println();
digitalWrite(tempOlvPin, HIGH);
if(digitScan == 3)
KijelzoKiir();
if(digitScan == 2)
KijelzoKiir();
if(digitScan == 0)
KijelzoKiir();
if(digitScan == 1)
HomeroOlvas();
digitalWrite(tempOlvPin, LOW);
}
void HomeroOlvas()
{
sensors.requestTemperatures(); // lekéri a hőmérséklet adatokat
switch(potmAllas)
{
case 1:
//tempC = sensors.requestTemperaturesByAddress(); //Kiirja a megadott azonosítójú hőmérő által mért értéket a kijelzőre
tempC = sensors.getTempCByIndex(0); //Kiirja a megadott sorszámú (0) hőmérő által mért értéket a kijelzőre
tempC1 = 1.0;//sensors.getTempCByIndex(0);
tempC2 = 2.0;//sensors.getTempCByIndex(0);
break;
case 2:
tempC = sensors.getTempCByIndex(0);
tempC1 = -2.0;//sensors.getTempCByIndex(0);
tempC2 = 4.0;//sensors.getTempCByIndex(0);
break;
case 3:
tempC = sensors.getTempCByIndex(0);
tempC1 = 3.0;//sensors.getTempCByIndex(0);
tempC2 = 6.0;//sensors.getTempCByIndex(0);
break;
case 4:
tempC = sensors.getTempCByIndex(0);
tempC1 = 4.0;//sensors.getTempCByIndex(0);
tempC2 = -8.0;//sensors.getTempCByIndex(0);
break;
case 5:
tempC = sensors.getTempCByIndex(0);
tempC1 = -5.0;//sensors.getTempCByIndex(0);
tempC2 = 10.0;//sensors.getTempCByIndex(0);
break;
case 6:
tempC = sensors.getTempCByIndex(0);
tempC1 = 6.0;//sensors.getTempCByIndex(0);
tempC2 = 12.0;//sensors.getTempCByIndex(0);
break;
case 7:
tempC = sensors.getTempCByIndex(0);
tempC1 = sensors.getTempCByIndex(1);
tempC2 = sensors.getTempCByIndex(2);
break;
case 8:
tempC = sensors.getTempCByIndex(0);
tempC1 = sensors.getTempCByIndex(2);
tempC2 = sensors.getTempCByIndex(4);
break;
default:
tempC = 1.1;
tempC1 = 2.2;
tempC2 = 3.3;
break;
}
KijelzoKiir();
}
void KijelzoKiir()
{
potmAllas = analogRead(potPin) / 100;
if(potmAllas == 0)
{
potmAllas = 10;
}
if (tempC > -99.9 && tempC < 99.9)
{
digitBuffer[0] = Digit1(tempC * 100);
digitBuffer[1] = Digit2(tempC * 100);
digitBuffer[2] = Digit3(tempC * 100);
digitBuffer[3] = Digit4(tempC * 100);
}
else
{
digitBuffer[3] = 12;
digitBuffer[2] = 11;
digitBuffer[1] = 11;
digitBuffer[0] = 10;
}
if (tempC1 > -99.9 && tempC1 < 99.9)
{
digitBuffer1[0] = Digit1(tempC1 * 100);
digitBuffer1[1] = Digit2(tempC1 * 100);
digitBuffer1[2] = Digit3(tempC1 * 100);
digitBuffer1[3] = Digit4(tempC1 * 100);
}
else
{
digitBuffer1[3] = 12;
digitBuffer1[2] = 11;
digitBuffer1[1] = 11;
digitBuffer1[0] = 10;
}
if (tempC2 > -99.9 && tempC2 < 99.9)
{
digitBuffer2[0] = Digit1(tempC2 * 100);
digitBuffer2[1] = Digit2(tempC2 * 100);
digitBuffer2[2] = Digit3(tempC2 * 100);
digitBuffer2[3] = Digit4(tempC2 * 100);
}
else
{
digitBuffer2[3] = 12;
digitBuffer2[2] = 11;
digitBuffer2[1] = 11;
digitBuffer2[0] = 10;
}
updateDisp(false);
}
int Digit1(int szam)
{
if ((szam * 100) < 0)
{
return 13;
}
else
{
return 12;
}
}
int Digit2(int szam)
{
if (abs(int(szam) / 1000) == 0)
{
return 12;
}
else
{
return abs(int((szam) / 1000));
}
}
int Digit3(int szam)
{
return abs((int(szam) % 1000) / 100);
}
int Digit4(int szam)
{
return abs((int(szam % 100) / 10));
}
}