Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino LED控制器在启动时挂起_Arduino - Fatal编程技术网

Arduino LED控制器在启动时挂起

Arduino LED控制器在启动时挂起,arduino,Arduino,我试图编写一个LED控制器,通过PWM控制亮度。然而,我的问题是,我甚至不能到达循环部分,它似乎在我声明类时挂起。我试着检查我的类中是否有函数导致了这些问题,但是因为我甚至不能循环,所以类中一定有问题。我已经编写了这个类,并将其放入一个名为LED的库中 代码有点长,但这里是: ifndef LED_H 定义LED_H 包括 包括 包括 包括 包括 班级领导 { 公众: 带路; int read_encoder;//读取旋转编码器 透明液晶显示器; 无效设置; 真空印刷液晶显示器; 无效设定值;

我试图编写一个LED控制器,通过PWM控制亮度。然而,我的问题是,我甚至不能到达循环部分,它似乎在我声明类时挂起。我试着检查我的类中是否有函数导致了这些问题,但是因为我甚至不能循环,所以类中一定有问题。我已经编写了这个类,并将其放入一个名为LED的库中

代码有点长,但这里是:

ifndef LED_H 定义LED_H 包括 包括 包括 包括 包括 班级领导 { 公众: 带路; int read_encoder;//读取旋转编码器 透明液晶显示器; 无效设置; 真空印刷液晶显示器; 无效设定值; int setLedint,//当前时间(分钟) int,//此LED通道的引脚 int,//此LED通道的开始时间 int,//此LED通道的光周期 int,//此LED通道的淡入淡出持续时间 int,//此通道的最大值 bool//如果通道反转,则为true ; void menuWizard; int子菜单向导int,int,bool,bool; 无效显示主菜单; void printMinsint,bool; 无效打印hmsbyte,字节,字节; 长的,长的; void-eeprom-writelongint,long; bool按select; 布尔压回; void rotateCheckint&,int,int; //LED通道的变量 int minCounter=0;//在午夜重置的计数器。 int oldMinCounter=0;//在午夜重置的计数器。 int-ledPins[5]={2,3,5,6,7}; int-ledVal[5]={0,0,0,0}; //使用EEPROM存储器的变量: 整数变量列表[20]; bool invertdles[5]={false,false,false,false,false}; //背光变量 无符号长符号ems=0; 私人: }; endif//LED\u H 下面是.cpp文件:

定义LCD_RS 35//RS引脚 定义LCD_启用34//启用引脚 定义LCD_数据4 33//d4引脚 定义LCD_数据5 32//d5引脚 定义LCD_数据6 31//d6引脚 定义LCD_数据7 30//d7引脚 定义LCD_背光9//背光管脚 //背光配置 定义背光_DIM 10//空闲时背光的PWM值 定义开启时背光的70//PWM值 定义背光\u空闲\u MS 10000//背光空闲延迟 定义附录A 14 定义附录B 15 定义ENC_端口PINC 包括 包括 包括 包括 包括 包括LED.h 液晶lcdLCD_RS、LCD_启用、LCD_数据4、LCD_数据5、LCD_数据6、LCD_数据7; 按钮返回=按钮12,下拉; 按钮选择=按钮13,下拉; 发光二极管::发光二极管 { 初始化时间安全; pinModeLCD_背光,输出; lcd.begin16,2; digitalWriteLCD_背光,高亮度; lcd.printsEx LED,V1; 透明液晶显示器; 延迟5000; 模拟写入CD_背光,背光_暗; 如果variablesList[0]>1440 | | variablesList[0]<0{ variablesList[0]=720;//启动此频道的分钟数。 variablesList[1]=400;//此频道的光周期(分钟)。 variablesList[2]=100;//此通道的最大强度(以百分比表示) variablesList[3]=100;//日出和日落时淡入淡出的持续时间 //这个频道。 可变列表[4]=720; 可变列表[5]=400; 可变列表[6]=100; 可变列表[7]=100; 可变列表[8]=720; 可变列表[9]=400; 可变列表[10]=100; 可变列表[11]=100; 可变列表[12]=720; 可变列表[13]=400; 可变列表[14]=100; 可变列表[15]=100; 可变列表[16]=720; 可变列表[17]=400; 可变列表[18]=100; 可变列表[19]=100; } 否则{ variablesList[0]=EEPROMReadlong0;//启动此频道的分钟数。 variablesList[1]=EEPROMReadlong4;//此通道的光周期(以分钟为单位)。 variablesList[2]=EEPROMReadlong8;//此通道的最大强度(以百分比表示) variablesList[3]=EEPROMReadlong12;//日出和日落的淡入淡出持续时间 //这个频道。 variablesList[4]=EEPROMREANDLONG16; 可变列表[5]=EEPROMREANDLONG20; 可变列表[6]=EEPROMREANDLONG24; variablesList[7]=EEPROMREANDLONG28; variablesList[8]=EEPROMREANDLONG32; 可变列表[9]=EEPROMREANDLONG36; 可变列表[10]=EEPROMREANDLONG40; 可变列表[11]=EEPROMREANDLONG44; 可变列表[12]=EEPROMREANDLONG48; variablesList[13]=EEPROMREANDLONG52; variablesList[14]=EEPROMREANDLONG56; 可变列表[15]=EEPROMREANDLONG60; variablesList[16]=EEPROMREANDLONG64; variablesList[17]=EEPROMREANDLONG68; 可变列表[18]=EEPROMREANDLONG72; 可变列表[19]=EEPROMREANDLONG76; } } 无效LED::printLCD{lcd.printtest;clearLCD;delay2000;lcd.printtesting;clearLCD;} bool发光二极管::按选择{ 如果选择.uniquePress{return 1;} else{return 0;} } 布尔发光二极管::按下返回键{ 如果goBack.uniquePress{return 1;} else{return 0;} } 无效LED::clearLCD{ lcd.clear; } 无效LED::DisplayMain菜单{ oldMinCounter=minCounter; 最小计数器=小时*60+分钟; 对于int i=0;i variablesList[i+1]/2&&variablesList[i+1]>0{ 可变列表[i+3]=可变列表[i+1]/2; } 如果变量列表[i+3]<1{ 可变列表[i+3]=1; } } //检查并设置任何时间功能 如果minCounter>oldMinCounter{ lcd.clear; } lcd.setCursor0,0; 打印时间,分钟,秒; lcd.setCursor0,1; lcd.printledVal[0]; lcd.setCursor4,1; lcd.printledVal[1]; lcd.setCursor8,1; lcd.printledVal[2]; } int LED::读取编码器 { 静态int enc_状态[]={0,-1,1,0,0,0,0,-1,-1,0,0,1,0,1,-1,0}; 静态int old_AB=0; /**/ 老阿伯莱德马克斯酒店{ val=ledMax; } 如果val<0{ val=0; } 如果倒置{ pwmWriteledPin,mapval,0100250; } 否则{ pwmWriteledPin,mapval,01100,0255; } 返回val; } 无效LED::printMinsint分钟,//打印时间(分钟) bool-ampm//打印上午/下午? { int hr=分钟%1440/60; int mn=分钟%60; 如果hr<10{ lcd.print; } lcd.printhr; 液晶显示器。打印:; 如果mn<10{ lcd.print0; } lcd.printmn; } 无效LED::打印HMS字节hr, 字节mn, 字节秒//打印时间 { 如果hr<10{ lcd.print; } lcd.printhr,12月; 液晶显示器。打印:; 如果mn<10{ lcd.print0; } lcd.printmn,12月; 液晶显示器。打印:; 如果秒<10{ lcd.print0; } lcd.printsec,12月; } //EEPROM写入功能 长发光二极管::EEPROMREANDLONGLONG地址 { //从eeprom存储器中读取4个字节。 长四=EEPROM.readaddress; 长三=EEPROM.readaddress+1; 长2=EEPROM.readaddress+2; 长一=EEPROM.readaddress+3; //使用bitshift返回重新组合的long。 返回四个>16&0xFF; 字节一=值>>24&0xFF; //将4个字节写入eeprom存储器。 EEPROM.writeaddress,四个; EEPROM.writeaddress+1,三个; EEPROM.writeaddress+2,两个; EEPROM.writeaddress+3,一个; } void LED::setAllLed{ int j=0; 对于int i=0;i2{timeMode=1;} } int timeAdjDetect=读取编码器 ; 如果timeMode==1{ 如果时间调整检测{ 如果timeAdjDetect>0{adjustTimeSECS_每小时;} 如果timeAdjDetect0{adjustTimeSECS_PER_MIN;} 如果时间调整检测 你必须明白,这个构造函数是在创建对象时运行的,而这可能是在从main运行init之前。因此,此时硬件还没有准备好,pinMode和digitalWrite之类的东西将无法工作。lcd代码在那里无法真正工作,我打赌这是挂起东西的部分


构造函数应该只做初始化变量之类的事情。任何依赖于硬件的代码都应该进入begin或init,或者在安全的情况下可以从安装程序调用的任何方法。串行对象是另一个必须这样做的类的一个很好的例子。

是否允许将main作为变量名?我认为是这样,就像据我所知。我对Arduino IDE编程有点陌生。我将尝试另一个名称,看看会发生什么。编辑:没有任何更改。我认为这不是问题所在。我认为您应该使用serialPort进行调试并检查一些点,以查看代码挂起的位置。让我试试这个。如果我只编写了所有代码,我可能不会有问题t在.ino文件中,并在安装程序中初始化了一些内容,但我试图避免一大块代码并使事情有序。我将尝试一下,看看会发生什么。不需要将所有这些单独的行放在安装函数中,并且在那里有一些大块的代码。编写类的成员函数,并将其称为void LED::begin并将其全部放进去那里
LED::LED()
            {
            InitTimersSafe();

            pinMode(LCD_BACKLIGHT, OUTPUT);
              lcd.begin(16, 2);
              digitalWrite(LCD_BACKLIGHT, HIGH);
              lcd.print("sEx LED, V1");
              clearLCD();
              delay(5000);
              analogWrite(LCD_BACKLIGHT, BACKLIGHT_DIM);