Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CNAME
Original file line number Diff line number Diff line change
@@ -1 +1 @@
flopperziro.filipponotari.site
flopperziro.iraton.site
20 changes: 14 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
<img alt="Github issues" src="https://img.shields.io/github/issues/lraton/FlopperZiro?color=56BEB8">
<img alt="Github forks" src="https://img.shields.io/github/forks/lraton/FlopperZiro?color=56BEB8">
<img alt="Github stars" src="https://img.shields.io/github/stars/lraton/FlopperZiro?color=56BEB8">

An orribol copi of FlipperZero, uit worst inglish<br>
A Flipper Zero clone, but cheapest, DIY and siply Open Source, made with Arduino IDE<br>
A Flipper Zero clone, but cheapest, DIY and simply Open Source, made with Arduino IDE<br>
<br>
> ⚠️ **Important Notice**: This is just a fun project, it was started to pass the time, it is not at all professional and is not intended to be. Is not an alternative for profesisoanl device.
> ⚠️ **Important Notice**: This is just a fun project, it was started to pass the time, it is not at all professional and is not intended to be. Is not an alternative for professional device.
<br>

![side pic](/img/img-profile.jpg)
Expand Down Expand Up @@ -45,22 +45,28 @@ A Flipper Zero clone, but cheapest, DIY and siply Open Source, made with Arduino
- RF
- Read rf signal and emulate it or save it
- Save/Load from SD
- Battery percentage
- Sd memory left percentage
- All programmable via Arduino Ide

- Add 3d printed shell (https://www.printables.com/model/1142768-flopper-ziro-shell), not finished yet

## To Do
### Software
- [X] Resovle SD problem with SSD1306
- [X] Do the sd menu'
- [X] Do the sd menu
- [X] save/load from sd
- [X] Make sd listing
- [ ] Fix bugs on the sd listing
- [X] Fix bugs on the sd listing
- [X] Finish the rf scanner and sender
- [X] Menu'
- [X] BadUsb
- [X] Ir
- [X] Fix bug when show ir data
- [ ] Rfid
- [X] Read UID
- [ ] Emualting
- [ ] Read ISO14443B
- [ ] Emulating
- [ ] Finish save rfid

### Hardware
Expand All @@ -73,3 +79,5 @@ A Flipper Zero clone, but cheapest, DIY and siply Open Source, made with Arduino

![front pic](/img/img-front.jpg)
![back pic](/img/img-behind.jpg)

![Alt](https://repobeats.axiom.co/api/embed/aec99a18c4d9023826a57995bd009c068bbb8197.svg "Repobeats analytics image")
2 changes: 1 addition & 1 deletion docs/CNAME
Original file line number Diff line number Diff line change
@@ -1 +1 @@
flopperziro.filipponotari.site
flopperziro.iraton.it
82 changes: 71 additions & 11 deletions main/battery.ino
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,81 @@ void battery() {
// Serial.println(bat_percentage);
*/

// Adjust the display cursor position based on the length of the percentage value.
if (bat_percentage < 100 && bat_percentage > 10) {
display.setCursor(105, 5); // Set cursor for 2-digit percentage
//Print SD and batetry percentage
if (scelta == 0 && currentPage == 0) {
//Print SD on homepage (bottom right)
if (sdbegin) {
// Adjust the display cursor position based on the length of the percentage value.
if (int(SDpercentFree) < 100 && int(SDpercentFree) > 10) {
display.setCursor(105, 53); // Set cursor for 2-digit percentage
} else {
if (int(SDpercentFree) < 10) {
display.setCursor(110, 53); // Set cursor for 1-digit percentage
} else {
display.setCursor(100, 53); // Set cursor for 100%
}
}
// Display the sd remaining on the screen
drawsd(85, 52);
display.print(int(SDpercentFree));
display.println("%");
} else {
// Display the NOSD on the screen
drawsd(85, 52);
display.setCursor(100, 53);
display.print("NoSD");
}

//Print battery on homepage (bottom right)
// Adjust the display cursor position based on the length of the percentage value. Battery
if (bat_percentage < 100 && bat_percentage > 10) {
display.setCursor(105, 43); // Set cursor for 2-digit percentage
} else {
if (bat_percentage < 10) {
display.setCursor(110, 43); // Set cursor for 1-digit percentage
} else {
display.setCursor(100, 43); // Set cursor for 100%
}
}

// Display the battery percentage on the screen
drawbattery(85, 43);
display.print(bat_percentage);
display.println("%");
display.display(); // Refresh the display with the new data
} else {
if (bat_percentage < 10) {
display.setCursor(110, 5); // Set cursor for 1-digit percentage
//Print sd on the other menu (top left)
if (sdbegin) {
// Display the sd remaining on the screen
display.setCursor(5, 5);
display.print(int(SDpercentFree));
display.print("%");
drawsd(display.getCursorX(), 4);
} else {
display.setCursor(100, 5); // Set cursor for 100%
// Display the NOSD on the screen
display.setCursor(5, 5);
display.print("No SD");
drawsd(display.getCursorX(), 4);
}
}

// Display the battery percentage on the screen
display.print(bat_percentage);
display.println("%");
display.display(); // Refresh the display with the new data
//Print battery on the other menu (top right)
// Adjust the display cursor position based on the length of the percentage value. Battery
if (bat_percentage < 100 && bat_percentage > 10) {
display.setCursor(105, 5); // Set cursor for 2-digit percentage
} else {
if (bat_percentage < 10) {
display.setCursor(110, 5); // Set cursor for 1-digit percentage
} else {
display.setCursor(100, 5); // Set cursor for 100%
}
}

// Display the battery percentage on the screen
drawbattery(85, 5);
display.print(bat_percentage);
display.println("%");
display.display(); // Refresh the display with the new data
}
}

// This function maps a floating-point value from one range to another.
Expand Down
5 changes: 4 additions & 1 deletion main/buttonMenu.ino
Original file line number Diff line number Diff line change
Expand Up @@ -144,12 +144,13 @@ void handleSubMenuSelectButton() {
}
}

//////////////////// Button handling for the last module menu //////////////////////////////
//////////////////// Button handling for the scan module menu //////////////////////////////

void checkModuleButton(int wichMenu) {
// Start scanning if the "Up" button is pressed
if (analogRead(buttonUp) == 0) {
scanning = 1;
detectionStarted = false; //for reset rfid
}
// Execute different save functions depending on the active module (whichMenu)
if (digitalRead(buttonDown) == LOW) {
Expand All @@ -166,13 +167,15 @@ void checkModuleButton(int wichMenu) {
saveRf(); // Save RF data for menu 4
break;
}
SDpercentFree = sdFreeSpace();
}
// Handle "Left" button behavior to reset scanning and submenu for each module
if (digitalRead(buttonLeft) == LOW) {
sceltaSd = 0;
selectedFileNumber = 1;
scanning = 1;
sceltaSubMenu = 0;
detectionStarted = false; //for reset rfid
}
// Execute emulation functions depending on the module
if (digitalRead(buttonRight) == LOW) {
Expand Down
116 changes: 47 additions & 69 deletions main/graphics.ino
Original file line number Diff line number Diff line change
Expand Up @@ -17,72 +17,6 @@
*/

//all the function to display the graphics
const unsigned char flopperblocked[] PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0xff, 0xf3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0xff, 0xf3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0xff, 0xf3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0xc0, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0x87, 0xe0, 0xe3, 0xe0, 0xe3, 0xe0, 0x1f, 0xf3, 0xbe, 0x00, 0x00, 0x00, 0x01,
0x83, 0xc0, 0x03, 0x87, 0xe0, 0xe3, 0xe0, 0xe3, 0xe0, 0x1f, 0xf3, 0xbe, 0x00, 0x00, 0x00, 0x01,
0x83, 0xfe, 0x03, 0x87, 0xe0, 0xe3, 0xe0, 0xe3, 0xe0, 0x1f, 0xf3, 0xff, 0x00, 0x00, 0x00, 0x01,
0x83, 0xfe, 0x03, 0xb8, 0x1c, 0xfc, 0x1c, 0xfc, 0x1c, 0xe0, 0x73, 0xc1, 0x00, 0x00, 0x00, 0x01,
0x83, 0xfe, 0x03, 0xb8, 0x1c, 0xfc, 0x1c, 0xfc, 0x1c, 0xe0, 0xf3, 0xc1, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0xb8, 0x1c, 0xfc, 0x1c, 0xfc, 0x1c, 0xff, 0xf3, 0x80, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0xb8, 0x1c, 0xe0, 0x1c, 0xe0, 0x1c, 0xff, 0x83, 0x80, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0xb8, 0x1c, 0xe0, 0x1c, 0xe0, 0x1c, 0xff, 0x83, 0x80, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0xb8, 0x1c, 0xe0, 0x1c, 0xe0, 0x1c, 0xe0, 0x03, 0x80, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0xb8, 0x1c, 0xff, 0xe0, 0xff, 0xe0, 0xe0, 0x73, 0x80, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0xb8, 0x1c, 0xff, 0xe0, 0xff, 0xe0, 0xe0, 0x73, 0x80, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0x87, 0xe0, 0xff, 0xe0, 0xff, 0xe0, 0x1f, 0xf3, 0x80, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0x87, 0xe0, 0xf0, 0x00, 0xf0, 0x00, 0x1f, 0xf3, 0x80, 0x00, 0x00, 0x00, 0x01,
0x83, 0x80, 0x03, 0x87, 0xe0, 0xe0, 0x00, 0xe0, 0x00, 0x1f, 0xf3, 0x80, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0xff, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0xff, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x83, 0xff, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x1d, 0xce, 0xf8, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x00, 0x01, 0xce, 0xf8, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x01, 0xc1, 0xcf, 0xfc, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x01, 0xc1, 0xcf, 0x04, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x01, 0xc1, 0xcf, 0x04, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x0e, 0x01, 0xce, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x0e, 0x01, 0xce, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x0e, 0x01, 0xce, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x70, 0x01, 0xce, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x80, 0x70, 0x01, 0xce, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x01, 0x81, 0x80, 0x00, 0x60, 0x00, 0x19,
0x80, 0x70, 0x01, 0xce, 0x00, 0xe0, 0x70, 0x00, 0x00, 0x01, 0x81, 0x80, 0x00, 0x62, 0x00, 0x19,
0x83, 0xff, 0xfd, 0xce, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x01, 0x81, 0x8e, 0x1c, 0x66, 0x7c, 0xf9,
0x83, 0xff, 0xfd, 0xce, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x01, 0xb9, 0x9e, 0x3e, 0x6c, 0x7c, 0xf9,
0x83, 0xff, 0xfd, 0xce, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x01, 0xff, 0xf3, 0xe3, 0x78, 0xff, 0x99,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0xf3, 0xe1, 0x70, 0xfd, 0x99,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xf3, 0xe3, 0x68, 0xc1, 0x99,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xf3, 0xe3, 0x6c, 0xcf, 0x99,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf9, 0x9e, 0x3e, 0x66, 0x7f, 0xf9,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x8c, 0x1c, 0x42, 0x3d, 0xf9,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
const unsigned char flopper[] PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
Expand Down Expand Up @@ -549,15 +483,52 @@ const unsigned char frame[] PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};

// 8x8 SD card icon
const uint8_t sd_bitmap[] PROGMEM = {
0b11111100, 0b00000000,
0b10000011, 0b11100000,
0b10000000, 0b00010000,
0b10000001, 0b11010000,
0b10000000, 0b00010000,
0b10000001, 0b11010000,
0b10000000, 0b00010000,
0b11111111, 0b11110000
};

// 12x8 battery icon
const uint8_t battery_bitmap[] PROGMEM = {
0b00111100,
0b01000010,
0b01000010,
0b01000010,
0b01000010,
0b01000010,
0b01000010,
0b01111110
};

//funnzioni per il menu' principale
void flopperblockedimage() {
void flopperbooting() {
display.clearDisplay();
display.drawBitmap(0, 0, flopper, 128, 64, WHITE);
int16_t x1, y1;
uint16_t w, h;
display.getTextBounds("BOOTING", 0, 0, &x1, &y1, &w, &h);
int16_t x = (SCREEN_WIDTH - w) / 2; // Calculate x position to center the text
display.setCursor(x, 33); // Center the text vertically
display.print("BOOTING"); // Display Booting
battery();
}

void flopperblocked() {
display.clearDisplay();
display.drawBitmap(0, 0, flopperblocked, 128, 64, WHITE);
display.drawBitmap(0, 0, flopper, 128, 64, WHITE);
display.setCursor(80, 33); // Center the text vertically
display.print("BLOCKED"); // Display Blocked
battery();
}

void menuprincipale() {
void flopperimage() {
display.clearDisplay();
display.drawBitmap(0, 0, flopper, 128, 64, WHITE);
battery();
Expand All @@ -579,12 +550,19 @@ void menuir() {
display.drawBitmap(0, 0, immagineir, 128, 64, WHITE);
battery();
}

void menurf() {
display.clearDisplay();
display.drawBitmap(0, 0, immaginerf, 128, 64, WHITE);
battery();
}

void drawsd(int x, int y) {
display.drawBitmap(x, y, sd_bitmap, 12, 8, WHITE);
}
void drawbattery(int x, int y) {
display.drawBitmap(x, y, battery_bitmap, 8, 8, WHITE);
}

//menu' singoli
void graficausb() {
Expand Down
Loading