Помогите пожалуйста! Почему то температура в сериал выводиться правильно а на индикаторах с каждым чтением меняется. И можно ли улучшить этот код сделать чтоб не мигал? Код (Text): #include <OneWire.h> //http://arduino.net.ua/Arduino_articles/Arduino_proekty/Podkljuchaem%20datchik%20temperatury%20DS18S20%20ili%20DS18B20%20k%20Arduino/ OneWire ds (12); // on pin 12 - приём данны с датчика static byte celsy, desyata; void setup (void) { Serial.begin (9600); pinMode(2, OUTPUT); //0 разряд pinMode(3, OUTPUT); // 1 разряд pinMode(4, OUTPUT); // 2 разряд pinMode(5, OUTPUT);// сегмент F pinMode(6, OUTPUT);// сегмент A pinMode(7, OUTPUT);// сегмент E pinMode(8, OUTPUT);// сегмент B pinMode(9, OUTPUT);// сегмент D pinMode(10, OUTPUT);// сегмент C pinMode(11, OUTPUT);// сегмент G pinMode(13, OUTPUT);// сегмент dp } void digit (byte cifra) { // сначала всё обесточиваем for (byte j=5; j<12; j++) { digitalWrite(j, HIGH); } digitalWrite(13, HIGH); switch (cifra) { case 0: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); break; } case 1: { digitalWrite(8, LOW); digitalWrite(10, LOW); break; } case 2: { digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(11, LOW); break; } case 3: { digitalWrite(6, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 4: { digitalWrite(5, LOW); digitalWrite(8, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 5: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 6: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 7: { digitalWrite(6, LOW); digitalWrite(8, LOW); digitalWrite(10, LOW); break; } case 8: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 9: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } default: ; } } void loop (void) { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius, fahrenheit; if (! ds.search (addr)) { ds.reset_search (); for (byte i=0;i<20;i++) { digit(celsy/10); digitalWrite(4, HIGH); delay (5); digitalWrite(4, LOW); digit(celsy%10); digitalWrite(13, LOW); digitalWrite(3, HIGH); delay (5); digitalWrite(3, LOW); digit(desyata%10); digitalWrite(2, HIGH); delay (5); digitalWrite(2, LOW); } //delay (250); return; } ds.reset (); ds.select (addr); ds.write (0x44,1); // start conversion, with parasite power on at the end // delay (1000); // maybe 750ms is enough, maybe not // we might do a ds.depower () here, but the reset will take care of it. present = ds.reset (); ds.select (addr); ds.write (0xBE); // Read Scratchpad for (i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read (); } // convert the data to actual temperature unsigned int raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // count remain gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms // default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print ("Temperature ="); Serial.print (celsius); Serial.print (" C,"); Serial.print (fahrenheit); Serial.println (" F"); if (celsius<70) { celsy=celsius; desyata=celsius*10; for (byte i=0;i<50;i++) { digit(celsy/10); digitalWrite(4, HIGH); delay (5); digitalWrite(4, LOW); digit(celsy%10); digitalWrite(13, LOW); digitalWrite(3, HIGH); delay (5); digitalWrite(3, LOW); digit(desyata%10); digitalWrite(2, HIGH); delay (5); digitalWrite(2, LOW); } } }
Или может у кого есть готовый вариант? Нужен на трех сегментниках один датчик и диапазон от -40 до 130 градусов.
Для начала: Код (Text): pinMode(5, OUTPUT);// сегмент F pinMode(6, OUTPUT);// сегмент A pinMode(7, OUTPUT);// сегмент E pinMode(8, OUTPUT);// сегмент B pinMode(9, OUTPUT);// сегмент D pinMode(10, OUTPUT);// сегмент C pinMode(11, OUTPUT);// сегмент G pinMode(13, OUTPUT);// сегмент dp чтобы избежать использования аж 8 выходов ардуино введите в вашу схему вот этот счетчик, как его подключить описано вот здесь . Тем самым вы избежите вот этого нагромождения Код (Text): void digit (byte cifra) { // сначала всё обесточиваем for (byte j=5; j<12; j++) { digitalWrite(j, HIGH); } digitalWrite(13, HIGH); switch (cifra) { case 0: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); break; } case 1: { digitalWrite(8, LOW); digitalWrite(10, LOW); break; } case 2: { digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(11, LOW); break; } case 3: { digitalWrite(6, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 4: { digitalWrite(5, LOW); digitalWrite(8, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 5: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 6: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 7: { digitalWrite(6, LOW); digitalWrite(8, LOW); digitalWrite(10, LOW); break; } case 8: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } case 9: { digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); break; } default: ; } }
вот смотрите, собрал за 10 минут: а вот скетч Код (Text): #include <LiquidCrystal.h> #include <OneWire.h> int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2 LiquidCrystal lcd(4, 5, 10, 11, 12, 13); //Temperature chip i/o OneWire ds(DS18S20_Pin); // on digital pin 2 void setup(void) { Serial.begin(9600); lcd.begin(16, 2); lcd.clear(); } void loop(void) { float temperature = getTemp(); Serial.println(temperature); lcd.setCursor(0, 0); //lcd.print(" "); lcd.print ("\x54\x65\xBC\xBE\x65\x70\x61\xBF\x79\x70\x61 ");// Пишем слово "Температура" lcd.print(int (temperature)); lcd.print ("\x99""C"); delay(1000); } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; }
Спасибо за совет! но это не то, дело в том что у меня нет возможности купить счетчик я живу можно сказать в деревне, ну и нет такой критичности в выводах их вполне хватает... Ну и пример у вас для LSD так как я новичек я не смогу его правильно применить на свою схему.