OLED 128x64....тупой еще тупее

Alex67Z
Offline
Зарегистрирован: 23.01.2013

Всем привет!

Требуется помощь. Никак не могу подружить OLED 128х64 и... программу)))

Начну с начала... Имеем Arduino Nano, DS3231, DS18b20... Все работает)))

Есть код управления светодиодным освещением на 6 каналов:

#include <Wire.h>
#include "RTClib.h"

#include <OneWire.h>
#include <DallasTemperature.h>

// Датчик (или датчики) подключаются к пину 2 Ардуины
#define ONE_WIRE_BUS 2

// настройка «onewire» для работы с любыми другими девайсами (не только Dallas датчиками температуры)
OneWire oneWire(ONE_WIRE_BUS);

// подключаем Dallas Temperature.
DallasTemperature sensors(&oneWire);

RTC_DS1307 RTC;

int Hours_Start_Sunrise[6] = {11, 9, 10, 11, 12, 12};		  // начало рассвета по каналам час
int Minutes_Start_Sunrise[6] = {0, 0, 0, 0, 0, 0};		  // начало рассвета по каналам минута
int Hours_End_Sunrise[6] = {15, 12, 13, 14, 15, 15};	        // окончание рассвета по каналам час
int Minutes_End_Sunrise[6] = {0, 0, 0, 0, 0, 0};		  // окончание рассвета по каналам минута

int Hours_Start_Sunset[6] = {17, 20, 19, 18, 17, 17};	       // начало заката по каналам час
int Minutes_Start_Sunset[6] = {0, 0, 0, 0, 0, 0};		 // начало заката по каналам минута
int Hours_End_Sunset[6] = {21, 23, 22, 21, 21, 21};	       // окончание заката по каналам час
int Minutes_End_Sunset[6] = {0, 0, 0, 0, 0, 0};		       // окончание заката по каналам минута

int MinuteDay_Start_Sunrise[6];				       // день в минутах для начала рассвета
int MinuteDay_End_Sunrise[6];						 // день в минутах для окончания рассвета

int MinuteDay_Start_Sunset[6];					 // день в минутах для начала заката
int MinuteDay_End_Sunset[6];						 // день в минутах для окончания заката

int Current_MinuteDay;							// текущая минута суток
int Current_Period[6];				 // текущая часть суток 1-рассвет, 2-день, 3-закат, 4-ночь для каждого ШИМ

int Meridian_PWM[6] = {128, 192, 192, 192, 128, 128};	       // максимальное значение ШИМ
int Midnight_PWM[6] = {0, 0, 0, 0, 0, 0};				 // минимальное значение ШИМ
int Current_PWM[6] = {0, 0, 0, 0, 0, 0};				 // текущее значение ШИМ

/* *************************************************** */
/* *									* */
/* *	ШИМ пин для CW, TV, RB, NB, DR, NG			* */
/* *	Пин - 3  - CW - Cool White				* */
/* *	Пин - 5  - TV - True Violet				* */
/* *	Пин - 6  - RB - Royal Blue				* */
/* *	Пин - 7  - NB - Blue					* */
/* *	Пин - 10 - DR - Deep Red					 * */
/* *	Пин - 11 - NG - Green						 * */
/* *									       * */
/* ***************************************************** */

int PWM_Pin[6] = {3, 5, 6, 9, 10, 11};		// ШИМ пин для CW, TV, RB, NB, DR, NG

int Relay1 = 7; //вент
int Relay2 = 8; //луна
byte Relay1Status=false;
byte Relay2Status=false;

void setup() 
 {

	Serial.begin(57600);
	Wire.begin();
	RTC.begin();
sensors.begin();
 
	if (! RTC.isrunning()) {
	   Serial.println("RTC is NOT running!");
	   //RTC.adjust(DateTime(2012, 7, 12, 22, 48, 1));
	   }
		//RTC.adjust(DateTime(2012, 7, 31, 21, 53, 1));


   for (int i=0; i<=5; i++)
	{
	  pinMode(PWM_Pin[i], OUTPUT);			   // Установка пин для ШИМ
	}

   for (int i=0; i<=5; i++)
	{
	  analogWrite(PWM_Pin[i], Midnight_PWM[i]);	   // Установка минимального значения ШИМ
	  Current_PWM[i]=Midnight_PWM[i];			   // установка текущих значений ШИМ в минимум
	}

   for (int i=0; i<=5; i++)
	{
	  MinuteDay_Start_Sunrise[i]=60*Hours_Start_Sunrise[i] + Minutes_Start_Sunrise[i];	     // Расчет минуты суток для начала рассвета
	  MinuteDay_End_Sunrise[i]=60*Hours_End_Sunrise[i] + Minutes_End_Sunrise[i];		     // Расчет минуты суток для окончания рассвета
	  MinuteDay_Start_Sunset[i]=60*Hours_Start_Sunset[i] + Minutes_Start_Sunset[i];	     // Расчет минуты суток для начала заката
	  MinuteDay_End_Sunset[i]=60*Hours_End_Sunset[i] + Minutes_End_Sunset[i];		     // Расчет минуты суток для окончания заката
	}
  pinMode(Relay1, OUTPUT);	  
  pinMode(Relay2, OUTPUT);	  
  digitalWrite(Relay1, LOW);	
  digitalWrite(Relay2, HIGH);	

 }


// Процедура расчета текущего периода и значения PWM по каналам

void Led_Dim_PWM() 
{
  sensors.requestTemperatures();                                     // запрос показаний температуры
  DateTime now = RTC.now();
  Current_MinuteDay = (now.hour() * 60) + now.minute();
  
  for (int i=0; i<=5; i++)
   {
	 Current_Period[i]=4;
	 if (Current_MinuteDay>=MinuteDay_Start_Sunrise[i] && Current_MinuteDay<=MinuteDay_End_Sunrise[i]) {Current_Period[i]=1;}
	 if (Current_MinuteDay>MinuteDay_End_Sunrise[i] && Current_MinuteDay<MinuteDay_Start_Sunset[i]) {Current_Period[i]=2;}
	 if (Current_MinuteDay>=MinuteDay_Start_Sunset[i] && Current_MinuteDay<=MinuteDay_End_Sunset[i]) {Current_Period[i]=3;}

	 if (Current_Period[i]==1)
	   {
		   Current_PWM[i]=(float)(((float)Current_MinuteDay-MinuteDay_Start_Sunrise[i])/((float)MinuteDay_End_Sunrise[i]-MinuteDay_Start_Sunrise[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
		   if (Current_PWM[i]<Midnight_PWM[i]) {Current_PWM[i]=Midnight_PWM[i];}
		   analogWrite(PWM_Pin[i], Current_PWM[i]);																							  
	   }

	 if (Current_Period[i]==2)
	   {
		 if (Current_PWM[i]!=Meridian_PWM[i])
		  {
			Current_PWM[i]=Meridian_PWM[i];
			analogWrite(PWM_Pin[i], Current_PWM[i]);
		  }
	   }

	 if (Current_Period[i]==3)
	   {
		   Current_PWM[i]=(float)(((float)MinuteDay_End_Sunset[i]-Current_MinuteDay)/((float)MinuteDay_End_Sunset[i]-MinuteDay_Start_Sunset[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
		   analogWrite(PWM_Pin[i], Current_PWM[i]);
	   }
	   
	  if (Current_Period[i]==4)
		{
		  if (Current_PWM[i]!=Midnight_PWM[i])
		  {
			Current_PWM[i]=Midnight_PWM[i];
			if (Current_PWM[i]<Midnight_PWM[i]) {Current_PWM[i]=Midnight_PWM[i];}
			analogWrite(PWM_Pin[i], Current_PWM[i]);
		  }
		} 
	  }
	  

 Serial.print("T = ");                                             // температура аквариума
 Serial.print(sensors.getTempCByIndex(0),1);                         // получение данных температуры от 1-го датчика
 Serial.println();
        
        
        Serial.print(now.year(), DEC);
	Serial.print('/');
	Serial.print(now.month(), DEC);
	Serial.print('/');
	Serial.print(now.day(), DEC);
	Serial.print(' ');
	Serial.print(now.hour(), DEC);
	Serial.print(':');
	Serial.print(now.minute(), DEC);
	Serial.print(':');
	Serial.print(now.second(), DEC);
	Serial.print(" Current_MinuteDay: ");
	Serial.print(Current_MinuteDay, DEC); 
	Serial.println();
	  
	for (int i=0; i<=5; i++) 
	 {
	  Serial.print("Channel #");	 
	  Serial.print(i, DEC);
	  Serial.print(", Current Period: ");	 
	  if (Current_Period[i]==1) {Serial.print("Sunrise");}	 
	  if (Current_Period[i]==2) {Serial.print("Meridian");}	 
	  if (Current_Period[i]==3) {Serial.print("Sunset");}	 
	  if (Current_Period[i]==4) {Serial.print("Midnight");}
	  Serial.print(", Current PWM: ");
	  Serial.print(Current_PWM[i], DEC);
	  Serial.println();
	 }
	 Serial.println();
}

void RalayOnOff() 
  {
  int SumPWM=0;

  for (int i=0; i<=5; i++)
	{
	 SumPWM=SumPWM+Current_PWM[i]; 
	}
	if (SumPWM>=50 && Relay1Status==false) 
	  {
		Relay1Status=true;
		Relay2Status=false;
		digitalWrite(Relay1, HIGH);
		digitalWrite(Relay2, LOW);
	  }

	if (SumPWM<50 && Relay1Status==true) 
	  {
		Relay1Status=false;
		Relay2Status=true;
		digitalWrite(Relay1, LOW);
		digitalWrite(Relay2, HIGH);
	  }
  }
void loop () 
{
if ( ( millis() % 60000 ) == 0 ) //вызов раз в минуту
{
Led_Dim_PWM();
RalayOnOff();
}
}

Программа работает, проблем нет.

Подцепляю OLED. Библиотека - отсюда:

http://www.instructables.com/id/DS3231-OLED-clock-with-2-button-menu-set...

Часы с сайта и примеры работают без проблем.

Добавляю в программу дисплей.... :

#include <Wire.h>
#include "RTClib.h"

#include <SPI.h>                             //Library for Adafruit communication to OLED display
#include <Adafruit_GFX.h>                    //Graphics library
#include <Adafruit_SSD1306.h>                //OLED display library
#define OLED_RESET 4                         //Define reset for OLED display
Adafruit_SSD1306 display(OLED_RESET);        //Reset OLED display

#include <OneWire.h>
#include <DallasTemperature.h>

// Датчик (или датчики) подключаются к пину 2 Ардуины
#define ONE_WIRE_BUS 2

// настройка «onewire» для работы с любыми другими девайсами (не только Dallas датчиками температуры)
OneWire oneWire(ONE_WIRE_BUS);

// подключаем Dallas Temperature.
DallasTemperature sensors(&oneWire);

RTC_DS1307 RTC;

int Hours_Start_Sunrise[6] = {11, 9, 10, 11, 12, 12};		  // начало рассвета по каналам час
int Minutes_Start_Sunrise[6] = {0, 0, 0, 0, 0, 0};		  // начало рассвета по каналам минута
int Hours_End_Sunrise[6] = {15, 12, 13, 14, 15, 15};	        // окончание рассвета по каналам час
int Minutes_End_Sunrise[6] = {0, 0, 0, 0, 0, 0};		  // окончание рассвета по каналам минута

int Hours_Start_Sunset[6] = {17, 20, 19, 18, 17, 17};	       // начало заката по каналам час
int Minutes_Start_Sunset[6] = {0, 0, 0, 0, 0, 0};		 // начало заката по каналам минута
int Hours_End_Sunset[6] = {21, 23, 22, 21, 21, 21};	       // окончание заката по каналам час
int Minutes_End_Sunset[6] = {0, 0, 0, 0, 0, 0};		       // окончание заката по каналам минута

int MinuteDay_Start_Sunrise[6];				       // день в минутах для начала рассвета
int MinuteDay_End_Sunrise[6];						 // день в минутах для окончания рассвета

int MinuteDay_Start_Sunset[6];					 // день в минутах для начала заката
int MinuteDay_End_Sunset[6];						 // день в минутах для окончания заката

int Current_MinuteDay;							// текущая минута суток
int Current_Period[6];				 // текущая часть суток 1-рассвет, 2-день, 3-закат, 4-ночь для каждого ШИМ

int Meridian_PWM[6] = {128, 192, 192, 192, 128, 128};	       // максимальное значение ШИМ
int Midnight_PWM[6] = {0, 0, 0, 0, 0, 0};				 // минимальное значение ШИМ
int Current_PWM[6] = {0, 0, 0, 0, 0, 0};				 // текущее значение ШИМ

/* *************************************************** */
/* *									* */
/* *	ШИМ пин для CW, TV, RB, NB, DR, NG			* */
/* *	Пин - 3  - CW - Cool White				* */
/* *	Пин - 5  - TV - True Violet				* */
/* *	Пин - 6  - RB - Royal Blue				* */
/* *	Пин - 7  - NB - Blue					* */
/* *	Пин - 10 - DR - Deep Red					 * */
/* *	Пин - 11 - NG - Green						 * */
/* *									       * */
/* ***************************************************** */

int PWM_Pin[6] = {3, 5, 6, 9, 10, 11};		// ШИМ пин для CW, TV, RB, NB, DR, NG

int Relay1 = 7; //вент
int Relay2 = 8; //луна
byte Relay1Status=false;
byte Relay2Status=false;

void setup() 
 {

	Serial.begin(57600);
	Wire.begin();
	RTC.begin();
sensors.begin();

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);            // initialize with the I2C addr 0x3D (for the 128x64 OLED display)
display.setTextColor(WHITE);                          //Set font to display color on black background
 
	if (! RTC.isrunning()) {
	   Serial.println("RTC is NOT running!");
	   //RTC.adjust(DateTime(2012, 7, 12, 22, 48, 1));
	   }
		//RTC.adjust(DateTime(2012, 7, 31, 21, 53, 1));


   for (int i=0; i<=5; i++)
	{
	  pinMode(PWM_Pin[i], OUTPUT);			   // Установка пин для ШИМ
	}

   for (int i=0; i<=5; i++)
	{
	  analogWrite(PWM_Pin[i], Midnight_PWM[i]);	   // Установка минимального значения ШИМ
	  Current_PWM[i]=Midnight_PWM[i];			   // установка текущих значений ШИМ в минимум
	}

   for (int i=0; i<=5; i++)
	{
	  MinuteDay_Start_Sunrise[i]=60*Hours_Start_Sunrise[i] + Minutes_Start_Sunrise[i];	     // Расчет минуты суток для начала рассвета
	  MinuteDay_End_Sunrise[i]=60*Hours_End_Sunrise[i] + Minutes_End_Sunrise[i];		     // Расчет минуты суток для окончания рассвета
	  MinuteDay_Start_Sunset[i]=60*Hours_Start_Sunset[i] + Minutes_Start_Sunset[i];	     // Расчет минуты суток для начала заката
	  MinuteDay_End_Sunset[i]=60*Hours_End_Sunset[i] + Minutes_End_Sunset[i];		     // Расчет минуты суток для окончания заката
	}
  pinMode(Relay1, OUTPUT);	  
  pinMode(Relay2, OUTPUT);	  
  digitalWrite(Relay1, LOW);	
  digitalWrite(Relay2, HIGH);	

 }


// Процедура расчета текущего периода и значения PWM по каналам

void Led_Dim_PWM() 
{
  //sensors.requestTemperatures();                                     // запрос показаний температуры
  DateTime now = RTC.now();
  Current_MinuteDay = (now.hour() * 60) + now.minute();
  
  for (int i=0; i<=5; i++)
   {
	 Current_Period[i]=4;
	 if (Current_MinuteDay>=MinuteDay_Start_Sunrise[i] && Current_MinuteDay<=MinuteDay_End_Sunrise[i]) {Current_Period[i]=1;}
	 if (Current_MinuteDay>MinuteDay_End_Sunrise[i] && Current_MinuteDay<MinuteDay_Start_Sunset[i]) {Current_Period[i]=2;}
	 if (Current_MinuteDay>=MinuteDay_Start_Sunset[i] && Current_MinuteDay<=MinuteDay_End_Sunset[i]) {Current_Period[i]=3;}

	 if (Current_Period[i]==1)
	   {
		   Current_PWM[i]=(float)(((float)Current_MinuteDay-MinuteDay_Start_Sunrise[i])/((float)MinuteDay_End_Sunrise[i]-MinuteDay_Start_Sunrise[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
		   if (Current_PWM[i]<Midnight_PWM[i]) {Current_PWM[i]=Midnight_PWM[i];}
		   analogWrite(PWM_Pin[i], Current_PWM[i]);																							  
	   }

	 if (Current_Period[i]==2)
	   {
		 if (Current_PWM[i]!=Meridian_PWM[i])
		  {
			Current_PWM[i]=Meridian_PWM[i];
			analogWrite(PWM_Pin[i], Current_PWM[i]);
		  }
	   }

	 if (Current_Period[i]==3)
	   {
		   Current_PWM[i]=(float)(((float)MinuteDay_End_Sunset[i]-Current_MinuteDay)/((float)MinuteDay_End_Sunset[i]-MinuteDay_Start_Sunset[i]))*((float)Meridian_PWM[i]-Midnight_PWM[i]);
		   analogWrite(PWM_Pin[i], Current_PWM[i]);
	   }
	   
	  if (Current_Period[i]==4)
		{
		  if (Current_PWM[i]!=Midnight_PWM[i])
		  {
			Current_PWM[i]=Midnight_PWM[i];
			if (Current_PWM[i]<Midnight_PWM[i]) {Current_PWM[i]=Midnight_PWM[i];}
			analogWrite(PWM_Pin[i], Current_PWM[i]);
		  }
		} 
	  }
	  

// Serial.print("T = ");                                             // температура аквариума
// Serial.print(sensors.getTempCByIndex(0),1);                         // получение данных температуры от 1-го датчика
// Serial.println();
        
        
        Serial.print(now.year(), DEC);
	Serial.print('/');
	Serial.print(now.month(), DEC);
	Serial.print('/');
	Serial.print(now.day(), DEC);
	Serial.print(' ');
	Serial.print(now.hour(), DEC);
	Serial.print(':');
	Serial.print(now.minute(), DEC);
	Serial.print(':');
	Serial.print(now.second(), DEC);
	Serial.print(" Current_MinuteDay: ");
	Serial.print(Current_MinuteDay, DEC); 
	Serial.println();
	  
	for (int i=0; i<=5; i++) 
	 {
	  Serial.print("Channel #");	 
	  Serial.print(i, DEC);
	  Serial.print(", Current Period: ");	 
	  if (Current_Period[i]==1) {Serial.print("Sunrise");}	 
	  if (Current_Period[i]==2) {Serial.print("Meridian");}	 
	  if (Current_Period[i]==3) {Serial.print("Sunset");}	 
	  if (Current_Period[i]==4) {Serial.print("Midnight");}
	  Serial.print(", Current PWM: ");
	  Serial.print(Current_PWM[i], DEC);
	  Serial.println();
	 }
	 Serial.println();
}

void RalayOnOff() 
  {
  int SumPWM=0;

  for (int i=0; i<=5; i++)
	{
	 SumPWM=SumPWM+Current_PWM[i]; 
	}
	if (SumPWM>=50 && Relay1Status==false) 
	  {
		Relay1Status=true;
		Relay2Status=false;
		digitalWrite(Relay1, HIGH);
		digitalWrite(Relay2, LOW);
	  }

	if (SumPWM<50 && Relay1Status==true) 
	  {
		Relay1Status=false;
		Relay2Status=true;
		digitalWrite(Relay1, LOW);
		digitalWrite(Relay2, HIGH);
	  }
  }
void loop () 
{
sensors.requestTemperatures();                     // запрос показаний температуры
  display.clearDisplay();
  display.setTextSize(1);   
  display.setCursor(0,2); //Set cursor for temperature display
  display.println("T=");
  display.setCursor(13,2);
  display.print(sensors.getTempCByIndex(0),1); //Send temperature to display buffer
  display.drawCircle(44,2,2,WHITE); //Draw degree symbo l after temperature
  display.setCursor(49,2);
  display.println("C");  
  display.display();
  
if ( ( millis() % 60000 ) == 0 ) //вызов раз в минуту
{
Led_Dim_PWM();
RalayOnOff();
}
}

Виснет.... Уже голову сломал, не могу понять в чем проблема.

Хочется вывести часы, уровень на ШИМ... и т.д. и т.п. А тут - застрял(((((

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверь сколько оперативной памяти осталось

http://robocraft.ru/blog/arduino/531.html

Alex67Z
Offline
Зарегистрирован: 23.01.2013

Размер скетча: 20 020 байт.

А вот запустить програмку не могу, т.к. - зависает.......

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

убери про дисплей и проверь сколько оперативной уже занято

Alex67Z
Offline
Зарегистрирован: 23.01.2013

1. Без OLED memChack - 1233

2. С OLED memChekc - 100

А...... вывод?))

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Serial.println  (   F  ( "RTC is NOT running!")   );  // И так все сериалы с постоянными строками

int Relay1 = 7;  

заменить на #define Relay1 7     // Ещё 2 байта, может вам их и не хватало  ;) А ниже строчкой ещё 2...

Сто с лишним байт точно наскребёте, может как раз стэку не хватает....

 

И полистайте на досуге:  http://iopa4.narod.ru/page10.html

Там есть формулы  рассчёта восхода-заката по геокоординатам.

И ещё  http://paulorenato.com/joomla/index.php?option=com_content&view=article&...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

память закончилась. все просто. уменьшай объем