Поочередны вывод информации на дисплей без delay()
- Войдите на сайт для отправки комментариев
Здравствуйте! Нужна помощь. Сделал контроллер температуры и влажности. Железо Ардуино уно, 7 сегментный индикатор 4 цифры с контроллером по I2C SAA1064 , датчик температуры DS18B20. датчик DHT22 и джойстик для в вода настроек температуры и влажности. Хочу выводить температуру и влажность поочередно с интервалом 3 секунды. При выводе только одного из двух, нажав на джойстик четко вхожу в настройки а при отображении двух поочередно кнопка глючит, редко получается войти в параметры настройки. Понял что это из-за delay(). Помогите пожалуйста вывести инфу без delay. или сделать кнопку на прерывание. Этот код я переделал из нескольких проектов а с прерыванием и с этим millis() не получается.
#include <Wire.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
#define axis_X 0
#define dhtPin 5 // DHT
#define DHTTYPE DHT22
#define humidifer_pin 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int value_X = 0;
float T; //переменная для хранения температуры
float humidity; // Влажность
int humidity1;
float temp2; // Температура DHT22
int T1;// переменная текущей температуры
int hist=0.1;//гистерезис
float Tset;
float set_humidity;
const int buttonPin1 = 2;//кнопка режима установки температуры
byte meniu = 0;
int buzzerPin = 9;
int numTones=11;
DHT dht(dhtPin, DHTTYPE);
int tones[]= {261,277,294,311,330,349,370,392,415,440,2000};
byte saa1064 = 0x70 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to GND)
int digits[15]={
63, 6, 91, 79, 102, 109, 125,7, 127, 111, 99,92, 0, 119, 28}; // 204 original Schrank, 225 Platine SAA1064
// these are the byte representations of pins required to display each digit 0~9, °C sign, and blank digit, A, u
// right hand digit 180° flip - DP ist used as ° symbol :-) 204 is °c for big C use 143
void setup()
{
for (int i=0; i< numTones; i++)
{
tone(buzzerPin,tones[i]);
delay(50);
noTone(buzzerPin);
}
Wire.begin(); // start up I2C bus
delay(100);
initDisplay();
pinMode(13, OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(humidifer_pin, OUTPUT);
digitalWrite(buttonPin1, HIGH);
digitalWrite(humidifer_pin, LOW);
sensors.begin();
dht.begin();
}
void initDisplay()
// turns on dynamic mode and adjusts segment current to 2mA
{
Wire.beginTransmission(saa1064);
Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
Wire.write(B01010111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 21mA segment current
// left 111 is relevant for current left hand "1" 12mA, middle 6mA and right 3mA - so you can tewak it
Wire.endTransmission();
}
void ClearDisplay()
{
int thousand1, hundred1, ten1, one1;
// breakdown number into columns
hundred1 = Tset /100;
ten1 = (Tset-(hundred1*100))/10;
one1 = Tset-((hundred1*100)+(ten1*10));
Wire.beginTransmission(saa1064);
Wire.write(1); // start with digit 1 (right-hand side)
Wire.write(digits[hundred1]); // blank digit 1
Wire.write(digits[ten1]+128); // blank digit 2
Wire.write(digits[one1]); // blank digit 3
Wire.write(0); // blank digit 4
Wire.endTransmission();
delay(50);
}
void ClearDisplayHUM()
{
int thousand1, hundred1, ten1, one1;
// breakdown number into columns
hundred1 = set_humidity /100;
ten1 = (set_humidity-(hundred1*100))/10;
one1 = set_humidity-((hundred1*100)+(ten1*10));
Wire.beginTransmission(saa1064);
Wire.write(1); // start with digit 1 (right-hand side)
Wire.write(digits[hundred1]); // blank digit 1
Wire.write(digits[ten1]+128); // blank digit 2
Wire.write(0); // blank digit 3
Wire.write(0); // blank digit 4
Wire.endTransmission();
delay(50);
}
void displayDigitsTEMP()
{
int thousand1, hundred1, ten1, one1;
// breakdown number into columns
hundred1 = Tset /100;
ten1 = (Tset-(hundred1*100))/10;
one1 = Tset-((hundred1*100)+(ten1*10));
Wire.beginTransmission(saa1064);
Wire.write(1); // start with digit 1 (right-hand side)
Wire.write(digits[hundred1]); // blank digit 1
Wire.write(digits[ten1]+128); // blank digit 2
Wire.write(digits[one1]); // blank digit 3
Wire.write(digits[10]); // blank digit 4
Wire.endTransmission();
delay(50);
}
void displayDigitsHUM()
{
int thousand1, hundred1, ten1, one1;
// breakdown number into columns
hundred1 = set_humidity /100;
ten1 = (set_humidity-(hundred1*100))/10;
one1 = set_humidity-((hundred1*100)+(ten1*10));
Wire.beginTransmission(saa1064);
Wire.write(1); // start with digit 1 (right-hand side)
Wire.write(digits[hundred1]); // blank digit 1
Wire.write(digits[ten1]+128); // blank digit 2
Wire.write(digits[10]); // blank digit 3
Wire.write(digits[11]); // blank digit 4
Wire.endTransmission();
delay(50);
}
void displayInteger1(int num, int zero)
{
int hundred, ten, one;
// breakdown number into columns
hundred = num/100;
ten = (num-(hundred*100))/10;
one = num-((hundred*100)+(ten*10));
if (zero==1) // yes to leading zero
{
Wire.beginTransmission(saa1064);
Wire.write(1);
Wire.write(digits[hundred]);
Wire.write(digits[ten]+128); // 128 turns on DP
Wire.write(digits[one]);
Wire.write(digits[10]); // print position 10 from arry - °C
Wire.endTransmission();
delay(10);
}
else
if (zero==0) // no to leading zero
{
if (hundred==0) { hundred=11; }
if (hundred==0 && num<100) { hundred=16; }
if (ten==0 && num<10) { ten=16; }
Wire.beginTransmission(saa1064);
Wire.write(1);
Wire.write(digits[hundred]);
Wire.write(digits[ten]+128);
Wire.write(digits[one]);
Wire.write(digits[10]);
Wire.endTransmission();
delay(10);
}
}
void displayInteger2(int num, int zero)
{
int hundred, ten, one;
// breakdown number into columns
hundred = num/100;
ten = (num-(hundred*100))/10;
one = num-((hundred*100)+(ten*10));
if (zero==1) // yes to leading zero
{
Wire.beginTransmission(saa1064);
Wire.write(1);
Wire.write(digits[hundred]);
Wire.write(digits[ten]+128); // 128 turns on DP
Wire.write(digits[10]);
Wire.write(digits[11]); // print position 10 from arry - °C
Wire.endTransmission();
delay(10);
}
else
if (zero==0) // no to leading zero
{
if (hundred==0) { hundred=11; }
if (hundred==0 && num<100) { hundred=16; }
if (ten==0 && num<10) { ten=16; }
Wire.beginTransmission(saa1064);
Wire.write(1);
Wire.write(digits[hundred]);
Wire.write(digits[ten]+128);
Wire.write(digits[10]);
Wire.write(digits[11]);
Wire.endTransmission();
delay(10);
}
}
void loop(void) {
temp2 = dht.readTemperature();
humidity = dht.readHumidity();
value_X = analogRead(axis_X);
if (digitalRead(buttonPin1) == LOW)
{ meniu = meniu + 1;
delay(1000);
}
if (meniu == 2) meniu = 0;
if (meniu == 0) {
while (meniu == 0) {
sensors.requestTemperatures(); // запрос на получение температуры
T=(sensors.getTempCByIndex(0));
T1 = T*10;
temp2 = dht.readTemperature();
humidity = dht.readHumidity();
humidity1 = humidity*10;
displayInteger1(T*10,0); //Вывод температуры на дисплей
delay(5000);
displayInteger2(humidity*10,0);
delay(5000);
if (T>(Tset/10)+hist)digitalWrite(13, HIGH);
if (T<(Tset/10))digitalWrite(13, LOW );
if (digitalRead(buttonPin1) == LOW)
{ meniu = 1;
delay(1000);
}
}
delay(5);
}
if (meniu == 1) {
while (meniu == 1) {
value_X = analogRead(axis_X);
if(value_X > 700)
{
Tset++;
tone(buzzerPin,tones[10]);
delay(10);
noTone(buzzerPin);
}
value_X = analogRead(axis_X);
if (value_X < 300)
{
Tset--;
tone(buzzerPin ,tones[10]);
delay(10);
noTone(buzzerPin);
}
displayDigitsTEMP();// Вывод настройки температуры
ClearDisplay();
if (digitalRead(buttonPin1) == LOW)
{ meniu = 2;
delay(1000);
}
}
if (meniu == 2) {
while (meniu == 2) {
value_X = analogRead(axis_X);
if(value_X > 700)
{
set_humidity++;
tone(buzzerPin,tones[10]);
delay(10);
noTone(buzzerPin);
}
value_X = analogRead(axis_X);
if (value_X < 300)
{
set_humidity--;
tone(buzzerPin ,tones[10]);
delay(10);
noTone(buzzerPin);
}
displayDigitsHUM();// Вывод настройки температуры
ClearDisplayHUM();
if (digitalRead(buttonPin1) == LOW)
{ meniu = 0;
delay(1000);
}
}
}
}}