Код выдает ошибки после обновления IDE
Я совсем новичок в программировании для Arduino. Мой текущий проект — это монитор для моего террариума с использованием платы Arduino UNO, DHT11 и DS3231 RTC, отображающий температуру (как с DHT (в террариуме), так и с RTC (снаружи)), а также время и влажность.
Код был функциональным, но недавно IDE сообщила, что были некоторые обновления (которые я запустил), и теперь она не будет проверять. Весь этот код был в основном получен из примеров для оборудования, которое я использую. Может кто-нибудь указать мне, что мне нужно исправить?
Код как есть...
#include <DS3231.h>
#include <dht11.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
DS3231 rtc(SDA, SCL);
dht11 DHT; //Note:DHT on behalf of the temperature and humidity sensor
const int dht11_data = 6;
int temp=0;
int hum=0;
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
void setup()
{
Wire.begin();
// set the initial time here:
// DS3231 seconds, minutes, hours, day, date, month, year
// setDS3231time(30,42,21,4,26,11,14);
rtc.begin(); //Initialize the rtc object
lcd.begin(16,2); //Initialize LCD display
lcd.print("Terrarium "); //Splash Screen text line 1
lcd.setCursor(0,1); //Set Cursor Position for second line of Splash screen
lcd.print("Monitor 1.3"); //Splash screen text line 2
delay(3000); //Delay 3 seconds on Splash screen
lcd.clear(); //Clear LCD
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS3231time(byte *second,byte *minute,byte *hour,byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime()
{
DHT.read(dht11_data);
temp=DHT.temperature;
hum=DHT.humidity;
lcd.clear(); //clear display
lcd.print("rH="); //Display text rH= on LCD
lcd.print(hum); //Display relative humidiy reading from DHT11
lcd.print("%"); //Display Percent sign
lcd.setCursor(9,0) ; //set cursor position
lcd.print("Ti="); //display"Ti="
lcd.print(temp); //Displays temperature reading from DHT11, designated is Internal Temperature
lcd.write(0xDF); //Display custom characters '°'
lcd.print("C"); //Display text "C" to designate Celsius units
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
// send it to the serial monitor
lcd.setCursor(0,1);
lcd.print(hour, DEC); //Displays hours value on LCD
// convert the byte variable to a decimal number when displayed
lcd.print(":"); //Displays ":" between hours and minutes
if (minute<10)
{
lcd.print("0");
}
lcd.print(minute, DEC); //Displays Minutes value on the LCD
lcd.setCursor(9,1);
lcd.print ("Te:"); //Displays text "Te:" on LCD
lcd.print(rtc.getTemp()); //Displays Temperature from DS3231 designated as "External Temperature"
}
void loop()
{
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
}
и выдает следующие ошибки:
> > Arduino: 1.8.3 (Windows 10), Board: "Arduino/Genuino Uno"
>
> Terrarium_Monitor_1.3:8: error: no matching function for call to
> 'DS3231::DS3231(const uint8_t&, const uint8_t&)'
>
> DS3231 rtc(SDA, SCL);
>
> ^
>
> F:\Arduino Kit Stuff\my
> sketches\Terrarium_Monitor_1.3\Terrarium_Monitor_1.3.ino:8:21: note:
> candidates are:
>
> In file included from F:\Arduino Kit Stuff\my
> sketches\Terrarium_Monitor_1.3\Terrarium_Monitor_1.3.ino:1:0:
>
> C:\Users\Ursinos\Documents\Arduino\libraries\DS3231/DS3231.h:64:3:
> note: DS3231::DS3231()
>
> DS3231();
>
> ^
>
> C:\Users\Ursinos\Documents\Arduino\libraries\DS3231/DS3231.h:64:3:
> note: candidate expects 0 arguments, 2 provided
>
> C:\Users\Ursinos\Documents\Arduino\libraries\DS3231/DS3231.h:60:7:
> note: constexpr DS3231::DS3231(const DS3231&)
>
> class DS3231 {
>
> ^
>
> C:\Users\Ursinos\Documents\Arduino\libraries\DS3231/DS3231.h:60:7:
> note: candidate expects 1 argument, 2 provided
>
> C:\Users\Ursinos\Documents\Arduino\libraries\DS3231/DS3231.h:60:7:
> note: constexpr DS3231::DS3231(DS3231&&)
>
> C:\Users\Ursinos\Documents\Arduino\libraries\DS3231/DS3231.h:60:7:
> note: candidate expects 1 argument, 2 provided
>
> F:\Arduino Kit Stuff\my
> sketches\Terrarium_Monitor_1.3\Terrarium_Monitor_1.3.ino: In function
> 'void setup()':
>
> Terrarium_Monitor_1.3:34: error: 'class DS3231' has no member named
> 'begin'
>
> rtc.begin(); //Initialize the rtc object
>
> ^
>
> F:\Arduino Kit Stuff\my
> sketches\Terrarium_Monitor_1.3\Terrarium_Monitor_1.3.ino: In function
> 'void displayTime()':
>
> Terrarium_Monitor_1.3:112: error: 'class DS3231' has no member named
> 'getTemp'
>
> lcd.print(rtc.getTemp()); //Displays Temperature from DS3231
> designated as "External Temperature"
>
> ^
>
> Multiple libraries were found for "LiquidCrystal.h" Used: E:\Program
> Files (x86)\Arduino\libraries\LiquidCrystal Not used:
> C:\Users\Ursinos\Documents\Arduino\libraries\arduino_136712 exit
> status 1 no matching function for call to 'DS3231::DS3231(const
> uint8_t&, const uint8_t&)'
>
> This report would have more information with "Show verbose output
> during compilation" option enabled in File -> Preferences.
Как я уже сказал, я работал, когда загрузил его на свой arduino с последними изменениями неделю назад (и он все еще работает на плате прямо сейчас), но после обновления библиотек и всего остального он теперь выдает все эти ошибки. Я знаю, что код не очень элегантен, я все еще учусь. Пожалуйста, помогите
редактирование: После изменения строки, как рекомендовано в ответах, я теперь получаю следующие ошибки.
Arduino: 1.8.3 (Windows 10), Board: "Arduino/Genuino Uno"
F:\Arduino Kit Stuff\my sketches\Terrarium_Monitor_1.3 \Terrarium_Monitor_1.3.ino: In function 'void setup()':
Terrarium_Monitor_1.3:34: error: 'class DS3231' has no member named 'begin'
rtc.begin(); //Initialize the rtc object
^
F:\Arduino Kit Stuff\my sketches\Terrarium_Monitor_1.3 \Terrarium_Monitor_1.3.ino: In function 'void displayTime()':
Terrarium_Monitor_1.3:112: error: 'class DS3231' has no member named 'getTemp'
lcd.print(rtc.getTemp()); //Displays Temperature from DS3231 designated as "External Temperature"
^
Multiple libraries were found for "LiquidCrystal.h"
Used: E:\Program Files (x86)\Arduino\libraries\LiquidCrystal
Not used: C:\Users\Ursinos\Documents\Arduino\libraries \arduino_136712
exit status 1
'class DS3231' has no member named 'begin'
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Может ли это быть связано с тем, что у меня установлена версия Arduino IDE 1.8.3, а не самая новая?
@Ursinos, 👍0
2 ответа
Лучший ответ:
Я нашел это в Интернете, но не могу проверить.
http://www.instructables.com/topics/no-matching-function-for-call-to-DS3231DS3231const/
Думаю, для вас важна следующая часть:
Я не знаю, откуда вы взяли этот синтаксис
DS3231 rtc (SDA, SCL);
В моей копии библиотеки DS3231 указано, что вам нужен только DS3231 rtc; //нет аргументы. НО вам нужна библиотека Wire.
Поэтому измените свой код и убедитесь, что у вас есть библиотека Wire.
Ладно, я понял это с трудом, прочитав документацию по библиотеке DS3231, которую я использую.
Похоже, при обновлении библиотеки одно из ключевых слов изменилось.
поэтому, после удаления (SDA, SCL) из одной строки, мне пришлось удалить строку
rtc.begin();
и изменение
lcd.print(rtc.getTemp());
к
lcd.print(rtc.getTemperature());
спасибо за помощь :D
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату