Это выглядит вот так и отлично работает!
не удивительно, в тебя сам Садман41 поверил, а его чуйка редко подводит
Всем привет! Есть такой проект https://www.instructables.com/ARDUINO-FM-RADIO-WITH-CLOCK-AND-THERMOMETER/ . Повторил, все работает. Одна проблема- картинка не помещается в экран, хотя экран применен как у автора. Что нужно поправить чтобы картинка была по размеру экрана? Спасибо!
Дак у автора и надо спрашивать
скорее всего, ты в define экрана оставил 128x32, а надо его закомментировать и раскомментировать 128x64 I2C. Если нет, то ХЗ, кода нет, гадать не буду.
Внимательно посмотрел на фото. Пошел в мастерскую и отклеил эту чОртову пленку с экранчика!!! Устыдился…
Вставить код форум не разрешает! Можно посмотреть по приведенной ссылке.
Я точно не буду ни по каким ссылкам ходить
вот попытаюсь!
#include "RTClib.h"
RTC_DS1307 rtc;
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h> // info -> http://tronixstuff.com/2011/03/16/tutorial-your-arduinos-inbuilt-eeprom/
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
#define DEBUG 0
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_SSD1306 tft(OLED_RESET);
const int entrada = A0;
int entradaV = 3;
int menu;
#define MAXmenu 4 //MENIUL DE BAZA
int menux;
#define MAXmenux 3
static char* menuS[]= {"", "ACORD MAN", " VOLUM ", "ACORD AUTO", " FIX CEAS "};
int volumen, volumenOld=7;
int frecuencia,frecuenciaOld;
int signal_level;
int ora;
unsigned int z,z1;
byte xfrecu,xfrecuOld;
unsigned int estado[6];
unsigned long time,time1,time2,time3;
char buffer[30];
unsigned int RDS[4];
char seg_RDS[8];
char seg_RDS1[64];
char indexRDS1;
char hora,minuto,grupo,versio;
unsigned long julian;
int mezcla;
///////////////////////////////////
//////////////S E T U P ///////////
///////////////////////////////////
void setup()
{
sensors.begin();
rtc.begin();
Wire.begin();
Serial.begin(9600);
tft.begin(SSD1306_SWITCHCAPVCC, 0x3C);
tft.display();
delay(20);
// Clear the buffer.
tft.clearDisplay();
DateTime now = rtc.now();
// read value of last frequency
frecuencia = EEPROM.read(201);
volumen = EEPROM.read(202);
if (volumen < 0) volumen = 0;
if (volumen >15) volumen = 15;
if (frecuencia <0) frecuencia = 0;
if (frecuencia >210) frecuencia = 210;
// tft.fillScreen();
WriteReg(0x02,0xC00d); // write 0xC00d into Reg.2 ( soft reset, enable,RDS, )
WriteReg(0x05,0x84d8); // write ,0x84d8 into Reg.3
time3=time2=time1=time = millis();
menu=3;
canal(frecuencia);
// draw an antenna
//tft.drawLine(5, 25, 5, 25, WHITE);
//tft.drawCircle(103,9,2,WHITE);
}
///////////////////////////////////
//////////////L O O P /////////////
///////////////////////////////////
void loop()
{
entradaV = analogRead(entrada);
//////////////////////////////////////////////////////////////////////
// Buton meniu(mijloc) //
//////////////////////////////////////////////////////////////////////
if(entradaV>500 && entradaV<524)
{
menu++;
if(menu>MAXmenu)menu=1;
Visualizar();
while(1020>analogRead(entrada))delay(5);
}
///////////////////////////////////////////////////////////////////////////
// Buton dreapta (+) ///// ( - ) ///// MENIU ///// ( + ) /////
///////////////////////////////////////////////////////////////////////////
DateTime now = rtc.now();
int anul;
int luna;
int ziua;
int ora;
int minutul;
int secunda;
anul = now.year();
luna = now.month();
ziua = now.day();
ora = now.hour();
minutul = now.minute();
secunda = now.second();
if( entradaV<50)
{
menux++;
if(menux>MAXmenux)menux=MAXmenux;
switch(menu)
{
case 1: //cautare pas cu pas in sus
frecuencia++;
if(frecuencia>210)frecuencia=210; // frecvenţa limită superioară
delay(130);
break;
case 2: //crestere volum
volumen++;
if(volumen>15)volumen=15;
while(1020>analogRead(entrada))delay(5);
break;
case 3: //cautare automata in sus
busqueda(0);
while(1020>analogRead(entrada))delay(5);
break;
case 4: //crestere MINUTE
secunda=0;
minutul++;
//if (minutul > 59) minutul = 0 & ora++;
if (minutul > 59) minutul = 0;
rtc.adjust(DateTime(anul,luna,ziua,ora,minutul,0));
delay(200);
break;
}
}
/////////////////////////////////////////////////////////////////////////
// Buton stanga (-) //
/////////////////////////////////////////////////////////////////////////
if( entradaV<700 && entradaV>660)
{
menux--;
if(menux<1)menux=1;
#if DEBUG
Serial.print("menux = " ); Serial.println(menux);
#endif
switch(menu)
{
case 1: // cautare pas cu pas in jos
frecuencia--;
if(frecuencia<0)frecuencia=0;
delay(130);
break;
case 2: // micsorare volum
volumen--;
if(volumen<0)volumen=0;
while(1020>analogRead(entrada))delay(5);
break;
case 3:
busqueda(1);//cautare automata in jos
while(1020>analogRead(entrada))delay(5);
break;
case 4: //crestere ORA
secunda=0;
ora++;
//if (minutul > 59) minutul = 0 & ora++;
if (ora > 23) ora = 0;
rtc.adjust(DateTime(anul,luna,ziua,ora,minutul,0));
delay(200);
break;
}
}
if( millis()-time2>50)
{
ReadEstado();
time1 = millis();
}
if( millis()-time3>500)
{
time3 = millis();
Visualizar();
}
if( frecuencia!=frecuenciaOld)
{
frecuenciaOld=frecuencia;
z=870+frecuencia;
EEPROM.write(201,frecuencia);
sprintf(buffer,"%04d ",z); //Afisare frecventa
tft.setCursor(0,25);
tft.setTextSize(3);
tft.setTextColor(WHITE, BLACK);
for(z=0;z<5;z++)
{
if (z==0)
{
if (frecuencia < 130) tft.print(" ");
else tft.print(buffer[0]);
tft.setTextColor(WHITE, BLACK);
}
if(z==3) tft.print(".");
tft.setTextColor(WHITE, BLACK);
if (z>0) tft.print(buffer[z]);
tft.setTextColor(WHITE, BLACK);
}
tft.setCursor(95,25);
tft.setTextSize(2);
tft.setTextColor(WHITE, BLACK);
tft.print("FM");
tft.display();
canal(frecuencia);
//clearRDS();
}
//Modifivare volum audio
if(volumen!=volumenOld)
{
volumenOld=volumen;
sprintf(buffer,"VOLUM:%02d",(volumen));
tft.setCursor(0,15);
tft.setTextSize(1);
tft.setTextColor(WHITE, BLACK );
tft.print(buffer);
WriteReg(5, 0x84D0 | volumen);
EEPROM.write(202,volumen);
}
}
void busqueda(byte direc)
{
byte i;
if(!direc) WriteReg(0x02,0xC30d);
else WriteReg(0x02,0xC10d);
for(i=0;i<10;i++)
{
delay(200);
ReadEstado();
if(estado[0]&0x4000)
{
frecuencia=estado[0] & 0x03ff;
break;
}
}
}
void Visualizar(void)
{
// tft.setCursor(3, 13); tft.setTextSize(2); tft.setTextColor(WHITE, BLACK); tft.print("FM");
// tft.setCursor(27, 20); tft.setTextSize(1); tft.setTextColor(YELLOW, BLACK); tft.print("-Radio-");
sprintf(buffer,"%s",menuS[menu]);
tft.setCursor(0,50);
tft.setTextSize(2);
tft.setTextColor(BLACK, WHITE);
tft.print(buffer);
//Detectar señal stereo
tft.setCursor(90,40);
tft.setTextSize(1);
tft.setTextColor(WHITE, BLACK);
if((estado[0] & 0x0400)==0)
tft.print(" MONO ");
else
tft.print("STEREO");
tft.setTextColor(WHITE, BLACK);
z=estado[1]>>10;
sprintf(buffer,"SEMNAL:%02d" ,z);
tft.setCursor(65,15);
tft.setTextSize(1);
tft.setTextColor(WHITE, BLACK);
tft.print(buffer);
DateTime now = rtc.now();
sensors.requestTemperatures();
float temp = (sensors.getTempCByIndex(0));
/*tft.setCursor(0,0);
tft.setTextSize(1);
tft.setTextColor(WHITE, BLACK );
if (now.day() < 10) tft.print("0");
tft.print(now.day(), DEC);
tft.print('/');
if (now.month() < 10) tft.print("0");
tft.print(now.month(), DEC);
tft.print('/');
tft.print(now.year(), DEC);*/
tft.setCursor(0,0);
tft.setTextSize(1);
tft.setTextColor(WHITE, BLACK );
if (now.hour() < 10) tft.print("0");
tft.print(now.hour(), DEC);
tft.print(':');
if (now.minute() < 10) tft.print("0");
tft.print(now.minute(), DEC);
tft.print(':');
if (now.second() < 10) tft.print("0");
tft.print(now.second(), DEC);
tft.setCursor(90,0);
tft.setTextSize(1);
tft.setTextColor(WHITE, BLACK );
if (temp < 10) tft.print(" ");
tft.print(temp,1);
tft.print((char)247);
tft.print('C');
tft.setCursor(0,7);
tft.setTextSize(1);
tft.setTextColor(WHITE, BLACK );
tft.print("---------------------");
tft.display();
//tft.print("/15");
//ver RADIO_TXT pozitia rds
//tft.setCursor(20,47);
//tft.setTextColor(WHITE, BLACK);
z1=indexRDS1;
for (z=0;z<12;z++)
{
//tft.setTextColor(WHITE, BLACK);
//tft.print(seg_RDS1[z1]);
//tft.setTextColor(WHITE, BLACK);
z1++;
tft.setTextColor(WHITE, BLACK);
if(z1>35)z1=0;
}
indexRDS1++; if(indexRDS1>35) indexRDS1=0;
frecuencia=estado[0] & 0x03ff;
}
void canal( int canal)
{
byte numeroH,numeroL;
numeroH= canal>>2;
numeroL = ((canal&3)<<6 | 0x10);
Wire.beginTransmission(0x11);
Wire.write(0x03);
Wire.write(numeroH); // write frequency into bits 15:6, set tune bit
Wire.write(numeroL);
Wire.endTransmission();
}
void WriteReg(byte reg,unsigned int valor)
{
Wire.beginTransmission(0x11);
Wire.write(reg); Wire.write(valor >> 8); Wire.write(valor & 0xFF);
Wire.endTransmission();
//delay(50);
}
//RDA5807_adrs=0x10;
// I2C-Address RDA Chip for sequential Access
int ReadEstado()
{
Wire.requestFrom(0x10, 12);
for (int i=0; i<6; i++) { estado[i] = 256*Wire.read ()+Wire.read(); }
Wire.endTransmission();
}
//READ RDS Direccion 0x11 for random access
Внутри этого файла нада матреть.
Вот он. И что здесь править, пожалуйста?
/*!
- @file Adafruit_SSD1306.h
- This is part of for Adafruit’s SSD1306 library for monochrome
- OLED displays: LCDs & Displays, OLED Products Category on Adafruit Industries
- These displays use I2C or SPI to communicate. I2C requires 2 pins
- (SCL+SDA) and optionally a RESET pin. SPI requires 4 pins (MOSI, SCK,
- select, data/command) and optionally a reset pin. Hardware SPI or
- ‘bitbang’ software SPI are both supported.
- Adafruit invests time and resources providing this open source code,
- please support Adafruit and open-source hardware by purchasing
- products from Adafruit!
- Written by Limor Fried/Ladyada for Adafruit Industries, with
- contributions from the open source community.
- BSD license, all text above, and the splash screen header file,
- must be included in any redistribution.
*/
#ifndef Adafruit_SSD1306_H
#define Adafruit_SSD1306_H
// ONE of the following three lines must be #defined:
//#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16 ///< DEPRECATED: old way to specify 96x16 screen
// This establishes the screen dimensions in old Adafruit_SSD1306 sketches
// (NEW CODE SHOULD IGNORE THIS, USE THE CONSTRUCTORS THAT ACCEPT WIDTH
// AND HEIGHT ARGUMENTS).
// Uncomment to disable Adafruit splash logo
//#define SSD1306_NO_SPLASH
#if defined(ARDUINO_STM32_FEATHER)
typedef class HardwareSPI SPIClass;
#endif
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <Wire.h>
#if defined(AVR)
typedef volatile uint8_t PortReg;
typedef uint8_t PortMask;
#define HAVE_PORTREG
#elif defined(SAM3X8E)
typedef volatile RwReg PortReg;
typedef uint32_t PortMask;
#define HAVE_PORTREG
#elif (defined(arm) || defined(ARDUINO_FEATHER52)) &&
!defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040)
typedef volatile uint32_t PortReg;
typedef uint32_t PortMask;
#define HAVE_PORTREG
#endif
/// The following “raw” color names are kept for backwards client compatability
/// They can be disabled by predefining this macro before including the Adafruit
/// header client code will then need to be modified to use the scoped enum
/// values directly
#ifndef NO_ADAFRUIT_SSD1306_COLOR_COMPATIBILITY
#define BLACK SSD1306_BLACK ///< Draw ‘off’ pixels
#define WHITE SSD1306_WHITE ///< Draw ‘on’ pixels
#define INVERSE SSD1306_INVERSE ///< Invert pixels
#endif
/// fit into the SSD1306_ naming scheme
#define SSD1306_BLACK 0 ///< Draw ‘off’ pixels
#define SSD1306_WHITE 1 ///< Draw ‘on’ pixels
#define SSD1306_INVERSE 2 ///< Invert pixels
#define SSD1306_MEMORYMODE 0x20 ///< See datasheet
#define SSD1306_COLUMNADDR 0x21 ///< See datasheet
#define SSD1306_PAGEADDR 0x22 ///< See datasheet
#define SSD1306_SETCONTRAST 0x81 ///< See datasheet
#define SSD1306_CHARGEPUMP 0x8D ///< See datasheet
#define SSD1306_SEGREMAP 0xA0 ///< See datasheet
#define SSD1306_DISPLAYALLON_RESUME 0xA4 ///< See datasheet
#define SSD1306_DISPLAYALLON 0xA5 ///< Not currently used
#define SSD1306_NORMALDISPLAY 0xA6 ///< See datasheet
#define SSD1306_INVERTDISPLAY 0xA7 ///< See datasheet
#define SSD1306_SETMULTIPLEX 0xA8 ///< See datasheet
#define SSD1306_DISPLAYOFF 0xAE ///< See datasheet
#define SSD1306_DISPLAYON 0xAF ///< See datasheet
#define SSD1306_COMSCANINC 0xC0 ///< Not currently used
#define SSD1306_COMSCANDEC 0xC8 ///< See datasheet
#define SSD1306_SETDISPLAYOFFSET 0xD3 ///< See datasheet
#define SSD1306_SETDISPLAYCLOCKDIV 0xD5 ///< See datasheet
#define SSD1306_SETPRECHARGE 0xD9 ///< See datasheet
#define SSD1306_SETCOMPINS 0xDA ///< See datasheet
#define SSD1306_SETVCOMDETECT 0xDB ///< See datasheet
#define SSD1306_SETLOWCOLUMN 0x00 ///< Not currently used
#define SSD1306_SETHIGHCOLUMN 0x10 ///< Not currently used
#define SSD1306_SETSTARTLINE 0x40 ///< See datasheet
#define SSD1306_EXTERNALVCC 0x01 ///< External display voltage source
#define SSD1306_SWITCHCAPVCC 0x02 ///< Gen. display voltage from 3.3V
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26 ///< Init rt scroll
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27 ///< Init left scroll
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29 ///< Init diag scroll
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A ///< Init diag scroll
#define SSD1306_DEACTIVATE_SCROLL 0x2E ///< Stop scroll
#define SSD1306_ACTIVATE_SCROLL 0x2F ///< Start scroll
#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3 ///< Set scroll range
// Deprecated size stuff for backwards compatibility with old sketches
#if defined SSD1306_128_64
#define SSD1306_LCDWIDTH 128 ///< DEPRECATED: width w/SSD1306_128_64 defined
#define SSD1306_LCDHEIGHT 64 ///< DEPRECATED: height w/SSD1306_128_64 defined
#endif
#if defined SSD1306_128_32
#define SSD1306_LCDWIDTH 128 ///< DEPRECATED: width w/SSD1306_128_32 defined
#define SSD1306_LCDHEIGHT 32 ///< DEPRECATED: height w/SSD1306_128_32 defined
#endif
#if defined SSD1306_96_16
#define SSD1306_LCDWIDTH 96 ///< DEPRECATED: width w/SSD1306_96_16 defined
#define SSD1306_LCDHEIGHT 16 ///< DEPRECATED: height w/SSD1306_96_16 defined
#endif
/*!
@brief Class that stores state and functions for interacting with
SSD1306 OLED displays.
*/
class Adafruit_SSD1306 : public Adafruit_GFX {
public:
// NEW CONSTRUCTORS – recommended for new projects
Adafruit_SSD1306(uint8_t w, uint8_t h, TwoWire *twi = &Wire,
int8_t rst_pin = -1, uint32_t clkDuring = 400000UL,
uint32_t clkAfter = 100000UL);
Adafruit_SSD1306(uint8_t w, uint8_t h, int8_t mosi_pin, int8_t sclk_pin,
int8_t dc_pin, int8_t rst_pin, int8_t cs_pin);
Adafruit_SSD1306(uint8_t w, uint8_t h, SPIClass *spi, int8_t dc_pin,
int8_t rst_pin, int8_t cs_pin, uint32_t bitrate = 8000000UL);
// DEPRECATED CONSTRUCTORS - for back compatibility, avoid in new projects
Adafruit_SSD1306(int8_t mosi_pin, int8_t sclk_pin, int8_t dc_pin,
int8_t rst_pin, int8_t cs_pin);
Adafruit_SSD1306(int8_t dc_pin, int8_t rst_pin, int8_t cs_pin);
Adafruit_SSD1306(int8_t rst_pin = -1);
~Adafruit_SSD1306(void);
bool begin(uint8_t switchvcc = SSD1306_SWITCHCAPVCC, uint8_t i2caddr = 0,
bool reset = true, bool periphBegin = true);
void display(void);
void clearDisplay(void);
void invertDisplay(bool i);
void dim(bool dim);
void drawPixel(int16_t x, int16_t y, uint16_t color);
virtual void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
virtual void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
void startscrollright(uint8_t start, uint8_t stop);
void startscrollleft(uint8_t start, uint8_t stop);
void startscrolldiagright(uint8_t start, uint8_t stop);
void startscrolldiagleft(uint8_t start, uint8_t stop);
void stopscroll(void);
void ssd1306_command(uint8_t c);
bool getPixel(int16_t x, int16_t y);
uint8_t *getBuffer(void);
protected:
inline void SPIwrite(uint8_t d) attribute((always_inline));
void drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color);
void drawFastVLineInternal(int16_t x, int16_t y, int16_t h, uint16_t color);
void ssd1306_command1(uint8_t c);
void ssd1306_commandList(const uint8_t *c, uint8_t n);
SPIClass *spi; ///< Initialized during construction when using SPI. See
///< SPI.cpp, SPI.h
TwoWire *wire; ///< Initialized during construction when using I2C. See
///< Wire.cpp, Wire.h
uint8_t *buffer; ///< Buffer data used for display buffer. Allocated when
///< begin method is called.
int8_t i2caddr; ///< I2C address initialized when begin method is called.
int8_t vccstate; ///< VCC selection, set by begin method.
int8_t page_end; ///< not used
int8_t mosiPin; ///< (Master Out Slave In) set when using SPI set during
///< construction.
int8_t clkPin; ///< (Clock Pin) set when using SPI set during construction.
int8_t dcPin; ///< (Data Pin) set when using SPI set during construction.
int8_t
csPin; ///< (Chip Select Pin) set when using SPI set during construction.
int8_t rstPin; ///< Display reset pin assignment. Set during construction.
#ifdef HAVE_PORTREG
PortReg *mosiPort, *clkPort, *dcPort, *csPort;
PortMask mosiPinMask, clkPinMask, dcPinMask, csPinMask;
#endif
#if ARDUINO >= 157
uint32_t wireClk; ///< Wire speed for SSD1306 transfers
uint32_t restoreClk; ///< Wire speed following SSD1306 transfers
#endif
uint8_t contrast; ///< normal contrast setting for this device
#if defined(SPI_HAS_TRANSACTION)
protected:
// Allow sub-class to change
SPISettings spiSettings;
#endif
};
#endif // Adafruit_SSD1306_H
Хреново быть по пояс деревяным. Замени это
На это
// ONE of the following three lines must be #defined:
#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
//#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16 ///< DEPRECATED: old way to specify 96x16 screen
Так как программу ты вставил БЕЗ номеров строк, ищи сам где это.
Дет! Ты зачем в эту клоунаду вмешиваешься? Это ж прикольно!
2ТС:
- в твоем коде олед ресет назначен на пин 4. На фото дисплей без ножки ресет.
- Для таких тупых как ты в ИДЕ есть примеры сразу в библиотеке адафрутовской. Пример называется ssd1306_128x64_i2c. и начинается с вот таких строк, убрав комменты:
include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
для китайских дисплеев скорее всего и для 128х64 тоже адрес 0x3C. А ресет нужно в -1 поставить.
Что-то еще хочешь узнать? Закон Ньютона там, Ома, может Бойля-Мариотта?
Не льстите себе, судя по этому топику - не умеете.
Значит, не судьба! Ищите такой, который разрешит.
Все встало на свои места. Спасибо!
Нальёшь при случае.