// tady funguje i2c scan v pohode
#include <Wire.h>
#include <FastLED.h>
#define NUM_LEDS 16
#define DATA_PIN 15
CRGB leds[NUM_LEDS];
volatile uint8_t error, address, reg, data;
uint8_t dev_addr = 0x40; //0x40 - 12C Address
uint8_t mode1 = 0; //0x00 location for Mode1 register address
uint8_t mode2 = 1; //0x01 location for Mode2 register address
uint16_t PRE_SCALE =30;
uint8_t led0 = 6; //0x06 location for srart LED0 registers
uint8_t rst = 1; //0x01 reset device
uint8_t rval = 0; //read register value
uint16_t led_on;
uint16_t led_off;
uint8_t ledN;
uint8_t led_stat[16];
uint8_t PCF_addr[8] = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};
uint8_t PCA_addr[8] = {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("\nI2C Scanner");
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
//set for auto-increnent
///reg = mode1;
data = 160; // 0b10100000 viz Mode register 1 PCA9685 str.13 RESTART a AUTOINCREMENT
//data = 176; // 0b11100000 viz Mode register 1 PCA9685 str.13 RESTART, SLEEP a AUTOINCREMENT
//data = 32; // 0b00100000 viz bit 5 Mode register 1 PCA9685 str.13
WRITE_REG(0x40, mode1, data); //mode1 register
delay(50);
// Choose below the desired output mode
//Direct LED connection
// -- set to outpud mode INVRT= 1 OUTDRV =0
///reg = mode2;
data = 16;
WRITE_REG(0x40, mode2, data); //mode2 register
delay(50);
// The PRE_SCALE register can only be set when the SLEEP bit of MODE1 register is set to logic 1.
// mode1 | 0b00001000
WRITE_REG(0x40, mode1, 176); //mode1 SLEEP bit
delay(50);
uint16_t prescale = 121; // => 50 Hz
WRITE_REG(0xFE, PRE_SCALE, prescale); //prescale factor
delay(50);
// mode1 & 0b11110111
WRITE_REG(0x40, mode1, data); //mode1 register
delay(50);
/*
Common Prescale Values
121 (approx 50 Hz): Standard for servo motors (50Hz = 20ms period).
100 (approx 60 Hz): Often used for servos, actually yields closer to 60Hz.
30 : 200 Hz the default value after power-on reset
3: Maximum frequency ($\sim$1526 Hz).
255: Minimum frequency ($\sim$24 Hz).
pro inspiraci
freq_hz = 60
pca9685_frequency = 25000000.0 #pca9685 clock : 25Mhz
pca9685_resolution = 4096.0 #12 bits resolution
freq_in_step = pca9685_resolution*float(freq_hz)
prescaleval = pca9685_frequency/freq_in_step
print "prescaler value = {}".format(prescaleval)
prescale = int(math.floor(prescaleval + 0.5))
print "however only round values can be set so we wil use {} as a prescaler value".format(prescale)
print "which makes a frequency of {}".format(pca9685_frequency/(prescale*pca9685_resolution))
oldmode = self.pca9685_device.readU8(self.MODE1);
newmode = (oldmode & 0x7F) | 0x10 # sleep
self.pca9685_device.write8(self.MODE1, newmode) # go to sleep
self.pca9685_device.write8(self.PRESCALE, prescale)
self.pca9685_device.write8(self.MODE1, oldmode)
time.sleep(0.005)
self.pca9685_device.write8(self.MODE1, oldmode | 0x80)
*/
FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS); // GRB ordering is typical
}
void loop() {
// Serial.println("loop s");
ledN = 0;
led_on = 4096;
led_off = 4095;
WRITE_LED(0x40, ledN, led_on, led_off);
Serial.println("loop 1");
ledN = 1;
led_on = 2048; // prioritu ma LED_full_OFF - !!!!!!!!!
led_off = 3068; // k tomu musi byt led_on = 4095 nebo 4096(LED_ON) jinak nestiha simulace
WRITE_LED(0x40, ledN, led_on, led_off);
Serial.println("loop 2");
ledN = 2;
led_on = 4096; // jas LED cim vyssi hodnota tim vic sviti / LED proti Vcc
led_off = 4095;
WRITE_LED(0x40, ledN, led_on, led_off);
Serial.println("loop 3");
ledN = 3;
led_on = 4095;
led_off = 4096;
WRITE_LED(0x40, ledN, led_on, led_off);
/* //ALL_LED
ledN = 61; //odkaz na registr 250 ALL_LED
led_on = 4095;
led_off = 4095;
WRITE_LED(0x40, ledN, led_on, led_off);
*/
///WRITE_LED(0x40, 0, 4096, 4095);
/*
leds[5] = CRGB(0,255,255);
leds[6] = CRGB(0,0,128);
leds[7] = CRGB(0,0,64);
leds[15] = CRGB(50,50,50);
*/
leds[0] = CRGB::Orange;
leds[1] = CRGB::Green;
leds[2] = CRGB::Red;
leds[3] = CRGB::Black;
//...
leds[6] = CRGB::Blue;
leds[7] = CRGB::White;
FastLED.show();
delay(500);
///WRITE_LED(0x40, 0, 4095, 4096);
Serial.println("loop 0e");
ledN = 0;
led_on = 4095;
led_off = 4096;
WRITE_LED(0x40, ledN, led_on, led_off);
Serial.println("loop 1e");
ledN = 1;
led_on = 2048;
led_off = 4095;
WRITE_LED(0x40, ledN, led_on, led_off);
Serial.println("loop 2e");
ledN = 2;
led_on = 4095;
led_off = 4096;
WRITE_LED(0x40, ledN, led_on, led_off);
Serial.println("loop 3e");
ledN = 3;
led_on = 4096;
led_off = 4095;
WRITE_LED(0x40, ledN, led_on, led_off);
/* //ALL_LED
ledN = 61; //odkaz na registr 250 ALL_LED
led_on = 4095;
led_off = 4096; // k tomu musi byt led_on = 4095 jinak nestiha simulace
WRITE_LED(0x40, ledN);
*/
leds[0] = CRGB::Orange;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Orange;
//...
leds[6] = CRGB::White;
leds[7] = CRGB::Blue;
FastLED.show();
delay(500);
//delay(1000);
}
/***********************************************************/
void LED_SW(uint8_t PCA_addr, uint16_t ledN, uint16_t led_on, uint16_t led_off){
if (led_stat[ledN] == 0) {
led_stat[ledN] = 1;
led_on = 4096;
led_off = 0;
WRITE_LED(PCA_addr, ledN, led_on, led_off);
}
else{
led_stat[ledN] = 0;
led_on = 0;
led_off = 4096;
WRITE_LED(PCA_addr, ledN, led_on, led_off);
}
}
void SetOFF() {
led_on = 0;
led_off = 4096;
WRITE_LED;
}
void READREG(uint8_t dev_addr) {
Wire.beginTransmission( dev_addr );
Wire.write(reg);
error = Wire.endTransmission();
Wire.beginTransmission( dev_addr );
Wire.requestFrom(dev_addr,1); //start a transaction to read 1 byte
rval = Wire.read(); //read the byte
error = Wire.endTransmission();
}
void WRITE_LED(uint8_t dev_addr, uint8_t ledN, uint16_t led_on, uint16_t led_off){
byte ah,al;
Wire.beginTransmission( dev_addr );
Wire.write(led0 + 4*ledN);
ah = led_on >> 8;
al = led_on && 255;
Wire.write(al);
Wire.write(ah);
ah = led_off >> 8;
al = led_off and 255;
Wire.write(al);
Wire.write(ah);
error = Wire.endTransmission();
//Serial.print("error > ");
/*
Serial.print(error);
Serial.print(" on addr 0x");
Serial.print(dev_addr,HEX);
Serial.print(" LED:");
Serial.print(ledN);
Serial.print(" led_on :");
Serial.print(led_on);
Serial.print(" led_off :");
Serial.println(led_off);
*/
}
void WRITE_REG(uint8_t dev_addr, uint8_t reg, uint8_t data ){
Wire.beginTransmission( dev_addr );
Wire.write(reg);
Wire.write(data);
error = Wire.endTransmission();
}pwm1 - 00000
Sample time 20ms - diagram.json